আরও দক্ষতার সাথে ওজিআর এবং শেপলি ব্যবহার করছেন? [বন্ধ]


29

আমি কীভাবে আমার অজগর কোডটি আরও কার্যকর করা যায় সে সম্পর্কে কিছু পরামর্শ খুঁজছি। সাধারণত দক্ষতা আমার পক্ষে গুরুত্বপূর্ণ নয় তবে আমি এখন মার্কিন অবস্থানগুলির একটি টেক্সট ফাইলের সাথে 1.5 মিলিয়ন পয়েন্ট নিয়ে কাজ করছি। প্রদত্ত সেটআপটির সাথে এক পর্যায়ে অপারেশন চালাতে প্রায় 5 সেকেন্ড সময় লাগবে; আমার এই চিত্রটি নামা দরকার।

আমি তিনটি পৃথক পাইথন জিআইএস প্যাকেজ ব্যবহার করছি পয়েন্টগুলিতে কয়েকটি আলাদা ক্রিয়াকলাপ করতে এবং একটি নতুন সীমিত পাঠ্য ফাইল আউটপুট।

  1. আমি একটি কাউন্টি সীমানা শেফফিল পড়তে ওজিআর ব্যবহার করি এবং সীমানা জ্যামিতিতে অ্যাক্সেস পাই।
  2. এই বিন্যাসগুলির মধ্যে কোনওটির মধ্যে কোনও বিন্দু রয়েছে কিনা তা আকৃতির আকারে পরীক্ষা করে দেখুন।
  3. যদি এটির মধ্যে থাকে তবে আমি সীমানা .dbf থেকে অ্যাট্রিবিউট তথ্য টানতে পাইথন শেফিল লাইব্রেরি ব্যবহার করি।
  4. আমি তখন উভয় উত্স থেকে একটি পাঠ্য ফাইলে কিছু তথ্য লিখি।

আমি সন্দেহ করি যে অদক্ষতা 2-3 টায়ার্ড লুপ থাকার মধ্যে রয়েছে ... এটি সম্পর্কে কী করা উচিত তা নিশ্চিত নয়। আমি বিশেষত এই 3 টি প্যাকেজের যে কোনওটি ব্যবহার করার ক্ষেত্রে অভিজ্ঞ কাউকে সাহায্যের জন্য সন্ধান করছি, কারণ এর মধ্যে যে কোনওটি ব্যবহার করা আমার প্রথমবার।

import os, csv
from shapely.geometry import Point
from shapely.geometry import Polygon
from shapely.wkb import loads
from osgeo import ogr
import shapefile

pointFile = "C:\\NSF_Stuff\\NLTK_Scripts\\Gazetteer_New\\NationalFile_20110404.txt"
shapeFolder = "C:\NSF_Stuff\NLTK_Scripts\Gazetteer_New"
#historicBounds = "C:\\NSF_Stuff\\NLTK_Scripts\\Gazetteer_New\\US_Counties_1860s_NAD"
historicBounds = "US_Counties_1860s_NAD"
writeFile = "C:\\NSF_Stuff\\NLTK_Scripts\\Gazetteer_New\\NewNational_Gazet.txt"

#opens the point file, reads it as a delimited file, skips the first line
openPoints = open(pointFile, "r")
reader = csv.reader(openPoints, delimiter="|")
reader.next()

#opens the write file
openWriteFile = open(writeFile, "w")

#uses Python Shapefile Library to read attributes from .dbf
sf = shapefile.Reader("C:\\NSF_Stuff\\NLTK_Scripts\\Gazetteer_New\\US_Counties_1860s_NAD.dbf")
records = sf.records()
print "Starting loop..."

#This will loop through the points in pointFile    
for row in reader:
    print row
    shpIndex = 0
    pointX = row[10]
    pointY = row[9]
    thePoint = Point(float(pointX), float(pointY))
    #This section uses OGR to read the geometry of the shapefile
    openShape = ogr.Open((str(historicBounds) + ".shp"))
    layers = openShape.GetLayerByName(historicBounds)
    #This section loops through the geometries, determines if the point is in a polygon
    for element in layers:
        geom = loads(element.GetGeometryRef().ExportToWkb())
        if geom.geom_type == "Polygon":
            if thePoint.within(geom) == True:
                print "!!!!!!!!!!!!! Found a Point Within Historic !!!!!!!!!!!!"
                print str(row[1]) + ", " + str(row[2]) + ", " + str(row[5]) + " County, " + str(row[3])
                print records[shpIndex]
                openWriteFile.write((str(row[0]) + "|" + str(row[1]) + "|" + str(row[2]) + "|" + str(row[5]) + "|" + str(row[3]) + "|" + str(row[9]) + "|" + str(row[10]) + "|" + str(records[shpIndex][3]) + "|" + str(records[shpIndex][9]) + "|\n"))
        if geom.geom_type == "MultiPolygon":
            for pol in geom:
                if thePoint.within(pol) == True:
                    print "!!!!!!!!!!!!!!!!! Found a Point Within MultiPolygon !!!!!!!!!!!!!!"
                    print str(row[1]) + ", " + str(row[2]) + ", " + str(row[5]) + " County, " + str(row[3])
                    print records[shpIndex]
                    openWriteFile.write((str(row[0]) + "|" + str(row[1]) + "|" + str(row[2]) + "|" + str(row[5]) + "|" + str(row[3]) + "|" + str(row[9]) + "|" + str(row[10]) + "|" + str(records[shpIndex][3]) + "|" + str(records[shpIndex][9]) + "|\n"))
        shpIndex = shpIndex + 1
    print "finished checking point"
    openShape = None
    layers = None


pointFile.close()
writeFile.close()
print "Done"

3
: আপনি @ কোড পর্যালোচনা এই পোস্ট করার বিবেচনা করতে পারেন codereview.stackexchange.com
RyanDalton

উত্তর:


21

প্রথম পদক্ষেপটি সারি লুপের বাইরে খোলা শেফফাইলটি সরানো হবে, আপনি 1.5 মিলিয়ন বার শৈলফিলিটি খুলছেন এবং বন্ধ করছেন।

সত্য কথা বলতে গেলেও আমি পোস্টজিআইএস-এ পুরোটা অনেকটা স্টাফ করে দিয়েছিলাম এবং এসডকিউএলটি ইনডেক্সড টেবিলগুলিতে ব্যবহার করি।


19

আপনার কোডটিতে একটি তাত্ক্ষণিকভাবে দৃষ্টি আকর্ষণ করে কয়েকটি অপ্টিমাইজেশন এনেছে:

  • সুস্পষ্ট বহিরাগতদের নির্মূল করতে প্রথমে বহুভুজগুলির সীমানা বাক্স / খামের বিরুদ্ধে প্রতিটি পয়েন্ট পরীক্ষা করুন Check আপনি আরও একধাপ এগিয়ে যেতে পারেন এবং একটি পয়েন্টে থাকা বাক্সের সংখ্যা গণনা করতে পারেন, যদি এটি ঠিক এক হয়, তবে আরও জটিল জ্যামিতির বিরুদ্ধে এটি পরীক্ষা করার দরকার নেই (ভাল, এটি আসলে যদি এটি আরও থাকে তবে একের চেয়ে বেশি এটির পরীক্ষা করা দরকার the জটিল কেস থেকে সহজ কেসগুলি অপসারণ করতে আপনি দুটি পাস করতে পারেন)।

  • প্রতিটি পয়েন্টটি লুপিংয়ের পরিবর্তে এবং বহুভুজগুলির বিরুদ্ধে এটি পরীক্ষা করার পরিবর্তে বহুভুজগুলির মধ্য দিয়ে লুপ করুন এবং প্রতিটি বিন্দুটি পরীক্ষা করুন। জ্যামিতির লোডিং / রূপান্তর ধীর গতির, তাই আপনি এটি যতটা সম্ভব কম করতে চান। এছাড়াও, প্রথমে সিএসভি থেকে পয়েন্টগুলির একটি তালিকা তৈরি করুন, আবার প্রতি বিন্দুতে একাধিকবার না করা এবং সেই পুনরাবৃত্তির শেষে ফলাফলগুলি বাতিল করে এড়াতে।

  • স্থানিক সূচক আপনার পয়েন্ট, যা জড়িত একটি মত হয় একটি shapefile, SpatialLite ফাইল, বা কিছু তা রূপান্তর PostGIS / পোস্টগ্রি ডাটাবেস। এটির সুবিধাটি রয়েছে যে ওজিআরের মতো সরঞ্জামগুলি আপনার জন্য বেশিরভাগ কাজ করতে সক্ষম হবে।

  • শেষ অবধি আউটপুটটি লিখবেন না: মুদ্রণ () সেরা সময়ের একটি ব্যয়বহুল ফাংশন। পরিবর্তে ডেটা তালিকা হিসাবে সঞ্চয় করুন এবং স্ট্যান্ডার্ড পাইথন পিকলিং ফাংশন বা তালিকা-ডাম্পিং ফাংশনগুলি ব্যবহার করে একে একে একে লিখুন।


5
প্রথম দুটি বড় পরিশোধ করবে। শেপলি এবং শেপফিলের পরিবর্তে প্রতিটি কিছুর জন্য ওগর ব্যবহার করে আপনি কিছুটা গতি বাড়িয়ে দিতে পারেন।
সাগিলি

2
"পাইথন" এবং "স্পেসিয়াল ইনডেক্স" সম্পর্কিত যে কোনও কিছুর জন্য, আর্ট্রি ছাড়া আর দেখার দরকার নেই কারণ এটি অন্যান্য আকারের কাছাকাছি আকারগুলি খুঁজে পাওয়া খুব দ্রুত
মাইক টি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.