私は、QGISが機能を「溶解」するのと基本的に同じことを行う関数を作成しようとしています。私はそれは非常に簡単だと思ったが、明らかにそうではない。だから、私が集めたものから、フィオナとshapelyの使用がここでの最良の選択肢であるはずです。ベクターファイルをいじり始めたばかりなので、この世界は私にとってもPythonにとっても新しいものです。
これらの例では、http: //tinyurl.com/odfbanuでここに設立された郡のシェープファイルを使用して います
:今の私の最善の方法は、に基づいて、以下の通りであるhttps://sgillies.net/2009/01/27/a-more-perfect-union-continued.html。それはうまく機能し、52の状態のリストをShapelyジオメトリとして取得します。この部分を行うためのより簡単な方法がある場合は、お気軽にコメントしてください。
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で書くためのコードがたくさん見つかりましたが、自分のデータで動作させることはできません。Shapelyジオメトリをシェープファイルに書き込む方法の例 :
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},
})
ここでの問題は、ジオメトリのリストで同じことを行う方法と、ソースと同じプロパティを再作成する方法です。