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()
Ich hatte etwas Glück beim Lesen und Schreiben in Schichten. Insbesondere habe ich Code, der eine Shapefile-Ebene mit Polylinien liest und die Geometrie jedes Features in Textdateien ausgibt (die als Eingabe für ein altes Modell verwendet werden).
Dies scheint nützlich zu sein, wenn Sie die einzelnen Features aus Ihren Layern abrufen.
Das Schreiben auf eine andere Ebene sollte von hier aus nicht zu komplex sein. So etwas sollte theoretisch funktionieren:
Von hier aus sollten Sie in der Lage sein, Daten für jedes Feature abzurufen und neue Features in eine neue Ebene zu schreiben.
Dan
quelle