OK donc une deuxième tentative pour répondre à votre question avec une solution GDAL pure.
Tout d'abord, GDAL (Geospatial Data Abstraction Library) n'était à l'origine qu'une bibliothèque pour travailler avec des données géospatiales raster, tandis que la bibliothèque OGR séparée était destinée à fonctionner avec des données vectorielles. Cependant, les deux bibliothèques sont maintenant partiellement fusionnées et sont généralement téléchargées et installées ensemble sous le nom combiné de GDAL. La solution relève donc vraiment de l'OGR. Vous l'avez dans votre code initial, donc je suppose que vous le saviez, mais c'est une distinction importante à retenir lors de la recherche de conseils et d'astuces.
Pour lire les données d'une couche vectorielle, votre code initial est très bien:
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()
Nous devons créer une nouvelle fonctionnalité avant de pouvoir l'écrire dans un fichier de formes (ou tout autre ensemble de données vectorielles). Pour créer une nouvelle entité, nous avons d'abord besoin: - d'une géométrie - d'une définition d'entité, qui inclura probablement des définitions de champ. Utilisez le constructeur Geometry ogr.Geometry () pour créer un objet Geometry vide. Définissez la géométrie d'une manière différente pour chaque type (point, ligne, polygone, etc.). Ainsi, par exemple:
point = ogr.Geometry(ogr.wkbPoint)
point.AddPoint(10,20)
ou
line = ogr.Geometry(ogr.wkbLineString)
line.AddPoint(10,10)
line.AddPoint(20,20)
line.SetPoint(0,30,30) #(10,10) -> (30,30)
Pour une définition de champ
fieldDefn = ogr.FieldDefn('id', ogr.OFTInteger)
Vous pouvez maintenant créer votre couche vectorielle. Dans ce cas, un polygone carré:
#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()
J'ai eu de la chance de lire et d'écrire sur des calques. Plus précisément, j'ai du code qui lira une couche de fichiers de formes contenant des polylignes et affichera la géométrie de chaque entité dans des fichiers texte (utilisée comme entrée pour un ancien modèle).
Cela semble utile pour obtenir chacune des fonctionnalités de vos calques.
L'écriture dans un autre calque ne devrait pas être trop complexe à partir d'ici. Quelque chose comme ça devrait fonctionner en théorie:
À partir de là, vous devriez pouvoir obtenir des données de chaque entité et écrire de nouvelles entités dans une nouvelle couche.
Dan
la source