Biner terkenal adalah format pertukaran biner yang baik yang dapat ditukar dengan banyak perangkat lunak GIS, termasuk Shapely dan GDAL / OGR.
Ini adalah contoh kecil dari alur kerja dengan 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
Pembaruan : Meskipun poster telah menerima jawaban GDAL / OGR, berikut ini adalah padanan 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},
})
(Catatan pengguna Windows: Anda tidak punya alasan )
Saya telah merancang Fiona agar bekerja dengan baik dengan Shapely. Berikut adalah contoh yang sangat sederhana untuk menggunakannya bersama-sama untuk "membersihkan" fitur shapefile:
Dari https://github.com/Toblerity/Fiona/blob/master/examples/with-shapely.py .
sumber
Anda juga dapat menulis geometri Shapely dengan menggunakan PyShp (karena poster asli juga bertanya tentang PyShp).
Salah satu caranya adalah dengan mengubah geometri bentuk Anda menjadi geojson (dengan metode shapely.geometry.mapping) dan kemudian menggunakan garpu PyShp saya yang dimodifikasi yang menyediakan metode Writer yang menerima kamus geometri geojson ketika menulis ke shapefile.
Jika Anda lebih suka mengandalkan versi PyShp utama, saya juga menyediakan fungsi konversi di bawah:
Cukup salin dan tempel fungsi ke skrip Anda sendiri dan panggil untuk mengonversi salah satu geometri bentuk Anda ke bentuk pyshp yang kompatibel. Untuk menyimpannya, Anda cukup menambahkan setiap bentuk pyshp yang dihasilkan ke daftar ._shapes dari instance shapefile.Writer (sebagai contoh lihat skrip uji di bagian bawah posting ini).
Namun, perhatikan: fungsinya TIDAK akan menangani lubang poligon interior jika ada, hanya mengabaikannya. Sangat mungkin untuk menambahkan fungsionalitas itu ke fungsi tetapi saya belum merasa terganggu. Saran atau suntingan untuk meningkatkan fungsi dipersilahkan :)
Berikut ini skrip uji mandiri lengkap:
sumber
Jawaban Karim cukup lama tetapi saya telah menggunakan kodenya dan ingin mengucapkan terima kasih kepadanya. Satu hal kecil yang saya tahu menggunakan kode-nya: Jika tipe bentuknya Polygon atau Multipolygon, mungkin masih ada banyak bagian (lubang di dalamnya). Oleh karena itu bagian dari kodenya harus diubah menjadi
sumber