QGISからデュアルグラフを取得しますか?


8

.shpファイルがあり、このファイルからデュアルグラフを取得する必要があります(つまり、各ポリゴンの重心が頂点になり、関連するポリゴンが隣接している場合は2つの頂点がリンクされます)。

ファイルのポリゴンから重心を取得することができました。

実際に接続する必要がある頂点間に線を追加するにはどうすればよいですか?


QGISのスクリプトツールまたはスクリプトをお探しですか?
Whyzar

この時点で、すべての解決策は私にとって良い解決策です。
アレクサンドル

ただし、QGISのすぐに使えるツールが利用できない場合があることは完全に理解できます。スクリプトが必要な場合は、少なくとも、役立つスクリプトを作成する試みを示す必要があります。
Whyzar

線はどのような形にしたいですか?元のポリゴンへのリンクがほとんどない一連のラインフィーチャとして?
Spacedman、2018

回答:


12

QGISなしでPythonのみ(バージョン2.7.xおよび3.x)を使用できます。

ここに画像の説明を入力してください

1)フィオナシェイプリーイターツール

import fiona
from shapely.geometry import MuliPolygon, LineString, mapping
Multi = MultiPolygon([shape(poly['geometry']) for poly in fiona.open("polygons.shp")])
# creation of the dual graph shapefile
import itertools
# schema of the dual graph shapefile
schema = {'geometry': 'LineString','properties': {'test': 'int'}}
with fiona.open('dual_graph.shp','w','ESRI Shapefile', schema) as e:
   for poly1,poly2 in  itertools.combinations(Multi, 2):
       if poly1.touches(poly2):
           e.write({'geometry':mapping(LineString([poly1.centroid, poly2.centroid])), 'properties':{'test':1}})

ここに画像の説明を入力してください

2)GeoPandasshapely 、および itertools

import geopandas as gpd 
polygon = gpd.GeoDataFrame.from_file("polygons.shp")
geoms = polygon['geometry'].tolist()
dual = gpd.GeoDataFrame(gpd.GeoSeries([LineString([poly1.centroid, poly2.centroid]) for poly1,poly2 in  itertools.combinations(geoms, 2) if poly1.touches(poly2)]),columns=['geometry'])
dual.to_file("dual_graph2.shp")

3)PyQgisとitertools(2.xバージョンではPython 2.7、3.xバージョンでは3.x)でも同じことができると思います


最初のコードは正常に動作します!「as e ::」の代わりに「as e:」にする必要があることを追加するだけかもしれません。また、私の場合(1つのポイントのみを共有するポリゴン間のエッジは必要ありません)、条件「(poly1.intersection (poly2))。geom_type!= "Point" "をifループに追加します。
アレクサンドル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.