O binário conhecido é um bom formato de troca binária que pode ser trocado com muitos softwares GIS, incluindo Shapely e GDAL / OGR.
Este é um pequeno exemplo do fluxo de trabalho com 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
Atualização : Embora o pôster tenha aceitado a resposta GDAL / OGR, aqui está um equivalente da 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 Usuários do Windows: você não tem desculpa )
Eu projetei Fiona para funcionar bem com Shapely. Aqui está um exemplo muito simples de usá-los juntos para "limpar" os recursos do shapefile:
Em https://github.com/Toblerity/Fiona/blob/master/examples/with-shapely.py .
fonte
Você também pode escrever geometrias bem torneadas usando PyShp (já que o pôster original também perguntou sobre PyShp).
Uma maneira seria converter sua geometria bem torneada em geojson (com o método shapely.geometry.mapping) e depois usar meu fork modificado do PyShp, que fornece um método Writer que aceita dicionários de geometria geojson ao gravar em um shapefile.
Se você preferir confiar na versão principal do PyShp, também forneci uma função de conversão abaixo:
Simplesmente copie e cole a função em seu próprio script e convoque-a para converter qualquer uma de suas geometrias bem torneadas em uma forma compatível com pyshp. Para salvá-los, basta anexar cada forma pyshp resultante à lista ._shapes da instância shapefile.Writer (por exemplo, veja o script de teste na parte inferior desta postagem).
Observe no entanto: a função NÃO manipulará nenhum orifício interno de polígono, se houver algum, simplesmente os ignora. Certamente é possível adicionar essa funcionalidade à função, mas eu simplesmente ainda não me incomodei. Sugestões ou edições para melhorar a função são bem-vindas :)
Aqui está um script de teste independente completo:
fonte
A resposta de Karim é bastante antiga, mas eu usei o código dele e queria agradecer a ele por isso. Uma pequena coisa que descobri usando o código dele: se o tipo de forma for Polígono ou Multipolígono, ele ainda poderá ter várias partes (orifícios no interior). Portanto, parte de seu código deve ser alterada para
fonte