El binario conocido es un buen formato de intercambio binario que se puede intercambiar con un montón de software SIG, incluidos Shapely y GDAL / OGR.
Este es un pequeño ejemplo del flujo de trabajo con 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
Actualización : aunque el póster ha aceptado la respuesta GDAL / OGR, aquí hay un equivalente de 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},
})
(Nota usuarios de Windows: no tienes excusa )
He diseñado a Fiona para que funcione bien con Shapely. Aquí hay un ejemplo muy simple de usarlos juntos para "limpiar" las características del archivo de forma:
Desde https://github.com/Toblerity/Fiona/blob/master/examples/with-shapely.py .
fuente
También puede escribir geometrías Shapely usando PyShp (ya que el póster original también preguntó sobre PyShp).
Una forma sería convertir su geometría bien formada a geojson (con el método shapely.geometry.mapping) y luego usar mi bifurcación modificada de PyShp que proporciona un método de Escritor que acepta diccionarios de geometría geojson cuando escribe en un shapefile.
Si prefiere confiar en la versión principal de PyShp, también he proporcionado una función de conversión a continuación:
Simplemente copie y pegue la función en su propia secuencia de comandos y solicítela para convertir cualquiera de sus geometrías bien formadas a una forma compatible con pyshp. Para guardarlos, simplemente agregue cada forma de pyshp resultante a la lista ._shapes de la instancia de shapefile.Writer (para ver un ejemplo, vea el script de prueba al final de esta publicación).
Sin embargo, tenga en cuenta que la función NO manejará ningún orificio interior de polígono si lo hay, simplemente los ignora. Ciertamente es posible agregar esa funcionalidad a la función, pero simplemente no me he molestado todavía. Sugerencias o ediciones para mejorar la función son bienvenidas :)
Aquí hay un script de prueba independiente completo:
fuente
La respuesta de Karim es bastante antigua, pero he usado su código y quería agradecerle por ello. Una cosa menor que descubrí usando su código: si el tipo de forma es Polígono o Multipolígono, aún podría tener múltiples partes (agujeros en el interior). Por lo tanto, parte de su código debe cambiarse a
fuente