ঠিক আছে তাই খাঁটি জিডিএল সমাধান দিয়ে আপনার প্রশ্নের উত্তর দেওয়ার দ্বিতীয় প্রচেষ্টা।
প্রথমত, জিডিএল (জিওপ্যাসিয়াল ডেটা অ্যাবস্ট্রাকশন লাইব্রেরি) মূলত রাস্টার ভূ-স্থানিক ডেটা নিয়ে কাজ করার জন্য কেবল একটি গ্রন্থাগার ছিল, যখন পৃথক ওজিআর লাইব্রেরিটি ভেক্টর ডেটার সাথে কাজ করার উদ্দেশ্যে নির্মিত হয়েছিল। তবে দুটি গ্রন্থাগার এখন আংশিকভাবে একত্রিত হয়েছে এবং সাধারণত জিডিএল এর সম্মিলিত নামে একত্রে ডাউনলোড এবং ইনস্টল করা হয়। সুতরাং সমাধানটি সত্যই ওজিআর এর আওতায় পড়ে। এটি আপনার প্রাথমিক কোডটিতে রয়েছে তাই আমি অনুমান করি আপনি এটি জানতেন তবে টিপস এবং ইঙ্গিতগুলি অনুসন্ধান করার সময় এটি মনে রাখা একটি গুরুত্বপূর্ণ পার্থক্য।
কোনও ভেক্টর স্তর থেকে ডেটা পড়তে, আপনার প্রাথমিক কোডটি ভাল:
from osgeo import ogr
shapefile = ogr.Open(shapefile)
layer = shapefile.GetLayer(0)
for i in range(layer.GetFeatureCount()):
feature = layer.GetFeature(i)
name = feature.GetField("NAME")
geometry = feature.GetGeometryRef()
print i, name, geometry.GetGeometryName()
শেপফাইলে (বা অন্য কোনও ভেক্টর ডেটা সেট) লিখতে পারার আগে আমাদের একটি নতুন বৈশিষ্ট্য তৈরি করতে হবে। একটি নতুন বৈশিষ্ট্য তৈরি করতে, আমাদের প্রথমে প্রয়োজন: - একটি জ্যামিতি - একটি বৈশিষ্ট্য সংজ্ঞা, সম্ভবত ক্ষেত্রের সংজ্ঞাগুলি অন্তর্ভুক্ত করবে খালি জ্যামিতি অবজেক্ট তৈরি করতে জ্যামিতি কনস্ট্রাক্টর ogr.Geometry () ব্যবহার করুন। প্রতিটি ধরণের (বিন্দু, রেখা, বহুভুজ ইত্যাদি) জ্যামিতিটি আলাদা উপায়ে কী তা নির্ধারণ করুন। উদাহরণস্বরূপ:
point = ogr.Geometry(ogr.wkbPoint)
point.AddPoint(10,20)
অথবা
line = ogr.Geometry(ogr.wkbLineString)
line.AddPoint(10,10)
line.AddPoint(20,20)
line.SetPoint(0,30,30) #(10,10) -> (30,30)
একটি ক্ষেত্র সংজ্ঞা জন্য
fieldDefn = ogr.FieldDefn('id', ogr.OFTInteger)
এখন আপনি আপনার ভেক্টর স্তরটি তৈরি করতে পারেন। এই উদাহরণে, একটি বর্গাকার বহুভুজ:
#create simple square polygon shapefile:
from osgeo import ogr
driver = ogr.GetDriverByName('ESRI Shapefile')
datasource = driver.CreateDataSource('YOUR_PATH')
layer = datasource.CreateLayer('layerName',geom_type=ogr.wkbPolygon)
#create polygon object:
myRing = ogr.Geometry(type=ogr.wkbLinearRing)
myRing.AddPoint(0.0, 0.0) #LowerLeft
myRing.AddPoint(0.0, 10.0) #UpperLeft
myRing.AddPoint(10.0, 10.0) #UpperRight
myRing.AddPoint(10.0, 0.0) #Lower Right
myRing.AddPoint(0.0, 0.0) #close ring
myPoly = ogr.Geometry(type=ogr.wkbPolygon)
myPoly.AddGeometry(myRing)
print ('Polygon area =',myPoly.GetArea()) #returns correct area of 100.0
#create feature object with point geometry type from layer object:
feature = ogr.Feature( layer.GetLayerDefn())
feature.SetGeometry(myPoly)
layer.CreateFeature(feature)
#flush memory - very important
feature.Destroy()
datasource.Destroy()