OK, also ein zweiter Versuch, Ihre Frage mit einer reinen GDAL-Lösung zu beantworten.
Erstens war GDAL (Geospatial Data Abstraction Library) ursprünglich nur eine Bibliothek für die Arbeit mit georäumlichen Raster-Daten, während die separate OGR-Bibliothek für die Arbeit mit Vektordaten gedacht war. Die beiden Bibliotheken werden jetzt jedoch teilweise zusammengeführt und in der Regel zusammen unter dem kombinierten Namen GDAL heruntergeladen und installiert. Die Lösung fällt also wirklich unter OGR. Sie haben dies in Ihrem ursprünglichen Code, also denke ich, dass Sie das gewusst haben, aber es ist ein wichtiger Unterschied, den Sie beachten müssen, wenn Sie nach Tipps und Hinweisen suchen.
Zum Lesen von Daten aus einer Vektorebene reicht der ursprüngliche Code aus:
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()
Wir müssen ein neues Feature erstellen, bevor wir es in ein Shapefile (oder einen anderen Vektordatensatz) schreiben können. Um ein neues Feature zu erstellen, benötigen wir zunächst: - Eine Geometrie - Eine Feature-Definition, die wahrscheinlich Felddefinitionen enthält. Verwenden Sie den Geometriekonstruktor ogr.Geometry (), um ein leeres Geometrieobjekt zu erstellen. Definieren Sie die Geometrie für jeden Typ unterschiedlich (Punkt, Linie, Polygon usw.). Also zum Beispiel:
point = ogr.Geometry(ogr.wkbPoint)
point.AddPoint(10,20)
oder
line = ogr.Geometry(ogr.wkbLineString)
line.AddPoint(10,10)
line.AddPoint(20,20)
line.SetPoint(0,30,30) #(10,10) -> (30,30)
Für eine Felddefinition
fieldDefn = ogr.FieldDefn('id', ogr.OFTInteger)
Jetzt können Sie Ihre Vektorebene erstellen. In diesem Fall ein quadratisches Polygon:
#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()