web-dev-qa-db-ja.com

GeoPandasまたはShapely(単一のジオメトリに)でポリゴンを結合します

GeoPandasで2つのポリゴンの結合を見つけて、両方のポリゴンのポイントを頂点として含む単一のジオメトリを出力しようとしています。 geopandas.overlay関数は、個々のユニオンごとにポリゴンを提供しますが、単一のポリゴンが必要です。

コンテキストのために、私はこれを使用して2つの行政区域を1つの区域にまとめています(つまり、国内の町区を含む)。

次の例は、geopandas Webサイトからのもので、私が望むものを示しています。

from matplotlib import pyplot as plt
import geopandas as gpd
from shapely.geometry import Polygon

polys1 = gpd.GeoSeries([Polygon([(0,0), (2,0), (2,2), (0,2)]),
                         Polygon([(2,2), (4,2), (4,4), (2,4)])])

polys2 = gpd.GeoSeries([Polygon([(1,1), (3,1), (3,3), (1,3)]),
                         Polygon([(3,3), (5,3), (5,5), (3,5)])])

df1 = gpd.GeoDataFrame({'geometry': polys1, 'df1':[1,2]})
df2 = gpd.GeoDataFrame({'geometry': polys2, 'df2':[1,2]})

res_union = gpd.overlay(df1, df2, how='union')
res_union.plot()

res_union.png

出力ジオメトリはどれも、私が期待したものではありません。これは次のとおりです。

poly_union = gpd.GeoSeries([Polygon([(0,0), (0,2), (1,2), (1,3), \
    (2,3), (2,4), (3, 4), (3, 5), (5, 5), (5, 3), (4, 3), (4, 2), \
    (3,2), (3,1), (2, 1), (2, 0), (0, 0)])])

poly_union.plot(color = 'red')
plt.show()

union.png

まず、上記のポリゴン(poly_union)入力ポリゴンから(df1df2)GeoPandasまたはshapelyを使用していますか?

第二に、ジオメトリに関連付けられている正しい命名法は何ですか(poly_union)私が見つけようとしていること?私はそれを「ユニオン」と呼びますが、「ユニオン」を参照するすべての例は、このジオメトリを出力しません。

注: This の例では、単一のポリゴンも出力されないようです。

poly1 = df1['geometry']; poly2 = df2['geometry']
mergedpoly = poly1.union(poly2)
mergedpoly.plot()

merged_poly.png

24
p-robot

質問/回答から ここ 、これはshapely内の cascaded_unionと呼ばれるようです

from shapely.ops import cascaded_union
polygons = [poly1[0], poly1[1], poly2[0], poly2[1]]
boundary = gpd.GeoSeries(cascaded_union(polygons))
boundary.plot(color = 'red')
plt.show()

注:GEOS 3.2+が使用されている場合、cascaded_unionunary_unionに置き換えられます-これにより、ポリゴンだけでなく、さまざまなジオメトリタイプのユニオンが許可されます。バージョンを確認するには、

>>> shapely.geos.geos_version
(3, 5, 1)

 union 

27
p-robot

ShapelyよりもGeopandasを好む場合は、ディゾルブを検討し、すべてのエントリに定数値を持つ列を使用することができます。 http://geopandas.org/aggregation_with_dissolve.html

6
Rutger Hofste