एक शुद्ध GDAL समाधान के साथ अपने प्रश्न का उत्तर देने का दूसरा प्रयास ठीक है।
सबसे पहले, GDAL (जियोस्पेशियल डेटा एब्स्ट्रक्शन लाइब्रेरी) मूल रूप से रेखापुंज भू-स्थानिक डेटा के साथ काम करने के लिए सिर्फ एक पुस्तकालय था, जबकि अलग ओजीआर पुस्तकालय वेक्टर डेटा के साथ काम करने का इरादा था। हालाँकि, दो पुस्तकालयों को अब आंशिक रूप से विलय कर दिया गया है, और आम तौर पर GDAL के संयुक्त नाम के तहत एक साथ डाउनलोड और इंस्टॉल किया जाता है। तो समाधान वास्तव में OGR के अंतर्गत आता है। आपके पास यह आपके प्रारंभिक कोड में है, इसलिए मुझे लगता है कि आप यह जानते थे, लेकिन यह याद रखना महत्वपूर्ण है कि टिप्स और संकेत खोजते समय।
वेक्टर लेयर से डेटा पढ़ने के लिए, आप प्रारंभिक कोड ठीक हैं:
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()
इससे पहले कि हम इसे शेपफाइल (या किसी अन्य वेक्टर डेटा सेट) पर लिख सकें, हमें एक नई सुविधा बनाने की आवश्यकता है। एक नई सुविधा बनाने के लिए, हमें सबसे पहले जरूरत है: - एक ज्यामिति - एक सुविधा परिभाषा, जिसमें संभवतः फ़ील्ड परिभाषाएं शामिल होंगी एक खाली ज्यामिति ऑब्जेक्ट बनाने के लिए ज्यामिति निर्माता Og.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()