Bekannte Binärdatei ist ein gutes binäres Austauschformat, das mit zahlreichen GIS-Programmen, einschließlich Shapely und GDAL / OGR, ausgetauscht werden kann.
Dies ist ein kleines Beispiel für den Workflow mit 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
Update : Obwohl das Poster die GDAL / OGR-Antwort akzeptiert hat, ist hier ein Fiona- Äquivalent:
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},
})
(Hinweis Windows-Benutzer: Sie haben keine Entschuldigung )
Ich habe Fiona so entworfen , dass sie gut mit Shapely zusammenarbeitet. Hier ist ein sehr einfaches Beispiel, wie sie zusammen verwendet werden, um Shapefile-Features zu "bereinigen":
Von https://github.com/Toblerity/Fiona/blob/master/examples/with-shapely.py .
quelle
Sie können auch Shapely-Geometrien mit PyShp schreiben (da im Original-Poster auch nach PyShp gefragt wurde).
Eine Möglichkeit wäre, Ihre formschöne Geometrie in Geojson umzuwandeln (mit der shapely.geometry.mapping-Methode) und dann meine modifizierte Fork von PyShp zu verwenden, die eine Writer-Methode bereitstellt, die Geojson-Geometriewörterbücher beim Schreiben in ein Shapefile akzeptiert.
Wenn Sie sich lieber auf die Hauptversion von PyShp verlassen möchten, habe ich nachfolgend eine Konvertierungsfunktion bereitgestellt:
Kopieren Sie die Funktion einfach, fügen Sie sie in Ihr eigenes Skript ein und rufen Sie es auf, um eine Ihrer formschönen Geometrien in eine pyshp-kompatible Form zu konvertieren. Um sie zu speichern, hängen Sie einfach jede resultierende pyshp-Form an die ._shapes-Liste der shapefile.Writer-Instanz an (ein Beispiel finden Sie im Testskript am Ende dieses Beitrags).
Beachten Sie jedoch, dass die Funktion KEINE inneren Polygonlöcher verarbeitet, sofern vorhanden, sondern diese einfach ignoriert. Es ist sicherlich möglich, diese Funktionalität zu der Funktion hinzuzufügen, aber ich habe mich einfach noch nicht darum gekümmert. Vorschläge oder Änderungen zur Verbesserung der Funktion sind willkommen :)
Hier ist ein vollständiges eigenständiges Testskript:
quelle
Karims Antwort ist ziemlich alt, aber ich habe seinen Code verwendet und wollte ihm dafür danken. Eine Kleinigkeit, die ich mithilfe seines Codes herausgefunden habe: Wenn der Formtyp Polygon oder Multipolygon ist, kann er immer noch mehrere Teile (Löcher im Inneren) enthalten. Daher sollte ein Teil seines Codes in geändert werden
quelle