Le binaire bien connu est un bon format d'échange binaire qui peut être échangé avec de nombreux logiciels SIG, notamment Shapely et GDAL / OGR.
Ceci est un petit exemple du flux de travail avec osgeo.ogr
:
from osgeo import ogr
from shapely.geometry import Polygon
# Here's an example Shapely geometry
poly = Polygon([(0, 0), (0, 1), (1, 1), (0, 0)])
# Now convert it to a shapefile with OGR
driver = ogr.GetDriverByName('Esri Shapefile')
ds = driver.CreateDataSource('my.shp')
layer = ds.CreateLayer('', None, ogr.wkbPolygon)
# Add one attribute
layer.CreateField(ogr.FieldDefn('id', ogr.OFTInteger))
defn = layer.GetLayerDefn()
## If there are multiple geometries, put the "for" loop here
# Create a new feature (attribute and geometry)
feat = ogr.Feature(defn)
feat.SetField('id', 123)
# Make a geometry, from Shapely object
geom = ogr.CreateGeometryFromWkb(poly.wkb)
feat.SetGeometry(geom)
layer.CreateFeature(feat)
feat = geom = None # destroy these
# Save and close everything
ds = layer = feat = geom = None
Mise à jour : Bien que l'affiche ait accepté la réponse GDAL / OGR, voici un équivalent Fiona :
from shapely.geometry import mapping, Polygon
import fiona
# Here's an example Shapely geometry
poly = Polygon([(0, 0), (0, 1), (1, 1), (0, 0)])
# Define a polygon feature geometry with one attribute
schema = {
'geometry': 'Polygon',
'properties': {'id': 'int'},
}
# Write a new Shapefile
with fiona.open('my_shp2.shp', 'w', 'ESRI Shapefile', schema) as c:
## If there are multiple geometries, put the "for" loop here
c.write({
'geometry': mapping(poly),
'properties': {'id': 123},
})
(Remarquez les utilisateurs de Windows: vous n'avez aucune excuse )
J'ai conçu Fiona pour bien fonctionner avec Shapely. Voici un exemple très simple de les utiliser ensemble pour "nettoyer" les fonctionnalités du fichier de formes:
Sur https://github.com/Toblerity/Fiona/blob/master/examples/with-shapely.py .
la source
Vous pouvez également écrire des géométries Shapely en utilisant PyShp (puisque l'affiche originale a également posé des questions sur PyShp).
Une façon serait de convertir votre géométrie galbée en geojson (avec la méthode shapely.geometry.mapping) puis d'utiliser ma fourche modifiée de PyShp qui fournit une méthode Writer qui accepte les dictionnaires de géométrie geojson lors de l'écriture dans un fichier de formes.
Si vous préférez vous fier à la version principale de PyShp, j'ai également fourni une fonction de conversion ci-dessous:
Copiez et collez simplement la fonction dans votre propre script et appelez-la pour convertir n'importe laquelle de vos géométries galbées en une forme compatible pyshp. Pour les enregistrer, vous ajoutez simplement chaque forme pyshp résultante à la liste ._shapes de l'instance shapefile.Writer (pour un exemple, voir le script de test au bas de cet article).
Remarque cependant: la fonction ne gérera PAS les trous de polygone intérieurs s'il y en a, elle les ignore simplement. Il est certainement possible d'ajouter cette fonctionnalité à la fonction mais je n'ai tout simplement pas encore pris la peine. Les suggestions ou modifications pour améliorer la fonction sont les bienvenues :)
Voici un script de test autonome complet:
la source
La réponse de Karim est assez ancienne mais j'ai utilisé son code et je voulais l'en remercier. Une chose mineure que j'ai trouvée en utilisant son code: si le type de forme est Polygone ou Multipolygon, il peut toujours avoir plusieurs parties (trous à l'intérieur). Par conséquent, une partie de son code devrait être remplacée par
la source