Tôi đã cố gắng tạo ra một chức năng về cơ bản giống như chức năng "hòa tan" của QGIS. Tôi nghĩ rằng nó sẽ siêu dễ dàng nhưng rõ ràng là không. Vì vậy, từ những gì tôi đã thu thập được xung quanh, việc sử dụng fiona với hình dạng nên là lựa chọn tốt nhất ở đây. Tôi mới bắt đầu loay hoay với các tập tin vectơ nên thế giới này cũng khá mới đối với tôi và cả trăn.
Ví dụ này, tôi đang làm việc với một shapefile quận được thành lập tại đây http://tinyurl.com/odfbanu Vì vậy, đây là một số đoạn mã tôi đã thu thập được nhưng không thể tìm ra cách để chúng hoạt động cùng nhau
Hiện tại, phương pháp tốt nhất của tôi là như sau dựa trên: https://sgillies.net/2009/01/27/a-more-perinf-union-continued.html . Nó hoạt động tốt và tôi nhận được một danh sách 52 tiểu bang dưới dạng hình học Shapely. Xin vui lòng bình luận nếu có một cách thẳng thắn hơn để làm phần này.
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.
Vì vậy, văn bản thực sự không đi thẳng từ những gì tôi đã thấy, tôi thực sự chỉ muốn cùng một shapefile với đất nước tan thành các tiểu bang, tôi thậm chí không cần nhiều bảng thuộc tính nhưng tôi tò mò muốn xem làm thế nào bạn có thể vượt qua nó từ nguồn đến shapefile mới được tạo.
Tôi đã tìm thấy nhiều đoạn mã để viết bằng fiona nhưng tôi không bao giờ có thể làm cho nó hoạt động với dữ liệu của mình. Ví dụ từ Làm thế nào để viết hình học Shapely cho shapefiles? :
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},
})
Vấn đề ở đây là làm thế nào để làm tương tự với một danh sách hình học và làm thế nào để tạo lại các thuộc tính tương tự như nguồn.