기본적으로 QGIS가 "디졸브 (dissolve)"기능과 동일한 기능을 수행하려고했습니다. 나는 그것이 쉽지는 않을 것이라고 생각했다. 그래서 내가 모은 것에서, 피오나를 매끈하게 사용하는 것이 여기에 가장 좋은 옵션이어야합니다. 방금 벡터 파일을 엉망으로 만들기 시작했기 때문에이 세상은 나와 파이썬에도 새로 생겼습니다.
이 예제에서는 http://tinyurl.com/odfbanu에 있는 카운티 shapefile로 작업하고 있습니다. 여기에 내가 모은 코드가 있지만 함께 작동시키는 방법을 찾을 수 없습니다
현재 가장 좋은 방법은 다음을 기반으로합니다 : https://sgillies.net/2009/01/27/a-more-perfect-union-continued.html . 잘 작동하고 52 개의 상태 목록을 Shapely geometry로 얻습니다. 이 부분을 수행하는보다 직접적인 방법이 있으면 언제든지 의견을 말하십시오.
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.
그래서 글은 실제로 내가 본 것에서 직접적이지 않습니다. 국가가 상태로 분해되는 동일한 모양 파일 만 원합니다. 속성 테이블이 많이 필요하지 않지만 어떻게 전달할 수 있는지 궁금합니다. 소스에서 새로 작성된 쉐이프 파일로 연결됩니다.
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},
})
여기서 문제는 지오메트리 목록을 사용하여 동일한 작업을 수행하는 방법과 소스와 동일한 속성을 다시 만드는 방법입니다.