Dobrze znany plik binarny jest dobrym formatem wymiany binarnej, który można wymieniać dużą ilością oprogramowania GIS, w tym Shapely i GDAL / OGR.
To mały przykład przepływu pracy z 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
Aktualizacja : Mimo że plakat zaakceptował odpowiedź GDAL / OGR, oto odpowiednik Fiony :
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},
})
(Uwaga użytkownicy systemu Windows: nie masz wymówki )
Zaprojektowałem Fionę, aby dobrze współpracowała z Shapely. Oto bardzo prosty przykład używania ich razem w celu „czyszczenia” funkcji pliku kształtu:
Od https://github.com/Toblerity/Fiona/blob/master/examples/with-shapely.py .
źródło
Możesz także pisać geometrie kształtów za pomocą PyShp (ponieważ w oryginalnym plakacie też pytano o PyShp).
Jednym ze sposobów byłoby przekonwertowanie kształtowej geometrii na geojson (za pomocą metody shapely.geometry.mapping), a następnie użycie mojego zmodyfikowanego rozwidlenia PyShp, który zapewnia metodę Writer, która akceptuje słowniki geometrii geojson podczas pisania do pliku kształtu.
Jeśli wolisz polegać na głównej wersji PyShp, poniżej zapewniłem również funkcję konwersji:
Po prostu skopiuj i wklej funkcję do własnego skryptu i wywołaj go, aby przekonwertować dowolną kształtną geometrię na kształt zgodny z pyshp. Aby je zapisać, wystarczy dołączyć każdy wynikowy kształt pyshp do listy ._shapes instancji shapefile.Writer (na przykład patrz skrypt testowy na dole tego postu).
Uwaga: funkcja NIE obsłuży żadnych wewnętrznych otworów wielokąta, jeśli takie istnieją, po prostu je ignoruje. Z pewnością można dodać tę funkcję do funkcji, ale po prostu jeszcze się tym nie przejmowałem. Mile widziane sugestie lub zmiany mające na celu poprawę funkcji :)
Oto pełny samodzielny skrypt testowy:
źródło
Odpowiedź Karima jest dość stara, ale użyłem jego kodu i chciałem mu za to podziękować. Jedną drobną rzecz, którą wymyśliłem, korzystając z jego kodu: jeśli typ kształtu to Wielokąt lub Wielokąt, nadal może mieć wiele części (otwory w środku). Dlatego część jego kodu należy zmienić na
źródło