Saya telah mencoba untuk membuat fungsi yang pada dasarnya melakukan hal yang sama dengan fungsi "larut" QGIS. Saya pikir itu akan sangat mudah tetapi ternyata tidak. Jadi dari apa yang telah saya kumpulkan, penggunaan fiona dengan rupawan harus menjadi pilihan terbaik di sini. Saya baru saja mulai dipusingkan dengan file vektor sehingga dunia ini cukup baru bagi saya dan juga python.
Untuk contoh ini, saya bekerja dengan county shapefile yang didirikan di sini http://tinyurl.com/odfbanu Jadi di sini ada beberapa kode yang saya kumpulkan tetapi tidak dapat menemukan cara untuk membuatnya bekerja bersama
Untuk saat ini metode terbaik saya adalah sebagai berikut berdasarkan: https://sgillies.net/2009/01/27/a-more-perfect-union-continued.html . Ini berfungsi dengan baik dan saya mendapatkan daftar 52 negara sebagai geometri Shapely. Silakan berkomentar jika ada cara yang lebih mudah untuk melakukan bagian ini.
from osgeo import ogr
from shapely.wkb import loads
from numpy import asarray
from shapely.ops import cascaded_union
ds = ogr.Open('counties.shp')
layer = ds.GetLayer(0)
#create a list of unique states identifier to be able
#to loop through them later
STATEFP_list = []
for i in range(0 , layer.GetFeatureCount()) :
feature = layer.GetFeature(i)
statefp = feature.GetField('STATEFP')
STATEFP_list.append(statefp)
STATEFP_list = set(STATEFP_list)
#Create a list of merged polygons = states
#to be written to file
polygons = []
#do the actual dissolving based on STATEFP
#and append polygons
for i in STATEFP_list :
county_to_merge = []
layer.SetAttributeFilter("STATEFP = '%s'" %i )
#I am not too sure why "while 1" but it works
while 1:
f = layer.GetNextFeature()
if f is None: break
g = f.geometry()
county_to_merge.append(loads(g.ExportToWkb()))
u = cascaded_union(county_to_merge)
polygons.append(u)
#And now I am totally stuck, I have no idea how to write
#this list of shapely geometry into a shapefile using the
#same properties that my source.
Jadi tulisannya benar-benar tidak lurus ke depan dari apa yang saya lihat, saya benar-benar hanya ingin bentuk yang sama hanya dengan negara larut menjadi negara, saya bahkan tidak perlu banyak tabel atribut tetapi saya ingin tahu bagaimana Anda dapat lulus pada dari sumber ke shapefile yang baru dibuat.
Saya menemukan banyak potongan kode untuk menulis dengan fiona tetapi saya tidak pernah bisa membuatnya berfungsi dengan data saya. Contoh dari Cara menulis geometri Shapely ke shapefile? :
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},
})
Masalahnya di sini adalah bagaimana melakukan hal yang sama dengan daftar geometri dan cara membuat ulang properti yang sama dari sumbernya.
Saya sangat merekomendasikan GeoPandas untuk berurusan dengan berbagai macam fitur dan melakukan operasi massal.
Itu memperluas bingkai data Pandas, dan menggunakan Shapely di bawah tenda.
sumber
Sebagai tambahan untuk jawaban gen @ , saya perlu membubarkan lebih dari satu bidang sehingga memodifikasi kodenya untuk menangani beberapa bidang. Kode di bawah ini digunakan
operator.itemgetter
untuk mengelompokkan berdasarkan beberapa bidang:sumber