OK, quindi un secondo tentativo di rispondere alla tua domanda con una soluzione GDAL pura.
In primo luogo, GDAL (Geospatial Data Abstraction Library) era originariamente solo una libreria per lavorare con dati geospaziali raster, mentre la libreria OGR separata doveva funzionare con dati vettoriali. Tuttavia, le due librerie sono ora parzialmente unite e generalmente vengono scaricate e installate insieme con il nome combinato di GDAL. Quindi la soluzione rientra davvero in OGR. Hai questo nel tuo codice iniziale, quindi suppongo che tu lo sapessi, ma è una distinzione importante da ricordare quando si cercano suggerimenti e suggerimenti.
Per leggere i dati da un livello vettoriale, il codice iniziale va bene:
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()
Dobbiamo creare una nuova funzionalità prima di poterla scrivere su uno shapefile (o su qualsiasi altro set di dati vettoriali). Per creare una nuova funzione, abbiamo prima bisogno di: - Una geometria - Una definizione di funzione, che probabilmente includerà le definizioni dei campi Utilizzare il costruttore Geometry ogr.Geometry () per creare un oggetto Geometry vuoto. Definisci la geometria in modo diverso per ciascun tipo (punto, linea, poligono, ecc.). Quindi per esempio:
point = ogr.Geometry(ogr.wkbPoint)
point.AddPoint(10,20)
o
line = ogr.Geometry(ogr.wkbLineString)
line.AddPoint(10,10)
line.AddPoint(20,20)
line.SetPoint(0,30,30) #(10,10) -> (30,30)
Per una definizione di campo
fieldDefn = ogr.FieldDefn('id', ogr.OFTInteger)
Ora puoi creare il tuo livello vettoriale. In questo caso, un poligono quadrato:
#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()