Гаразд, друга спроба відповісти на ваше запитання чистим рішенням GDAL.
По-перше, GDAL (бібліотека абстракції геопросторових даних) спочатку була лише бібліотекою для роботи з растровими геопросторовими даними, тоді як окрема бібліотека OGR призначена для роботи з векторними даними. Однак дві бібліотеки тепер частково об'єднані і загалом завантажуються та встановлюються разом під комбінованою назвою GDAL. Тож рішення дійсно підпадає під ОГР. Ви маєте це у своєму початковому коді, так що, мабуть, ви це знали, але це важлива відмінність, яку слід пам’ятати, шукаючи поради та підказки.
Щоб читати дані з векторного шару, ви добре використовуєте початковий код:
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()
Нам потрібно створити нову функцію, перш ніж ми зможемо записати її у файл форми (або будь-який інший набір векторних даних). Щоб створити нову функцію, нам спочатку потрібно: - Геометрія - визначення функції, яке, ймовірно, включатиме визначення полів. Використовуйте конструктор Geometry ogr.Geometry () для створення порожнього об’єкта 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()