2 つのバラバラなグループ / ポリゴンの「島」があるとします (隣接していない 2 つの郡の国勢調査区を考えてみてください)。私のデータは次のようになります。
>>> p1=Polygon([(0,0),(10,0),(10,10),(0,10)])
>>> p2=Polygon([(10,10),(20,10),(20,20),(10,20)])
>>> p3=Polygon([(10,10),(10,20),(0,10)])
>>>
>>> p4=Polygon([(40,40),(50,40),(50,30),(40,30)])
>>> p5=Polygon([(40,40),(50,40),(50,50),(40,50)])
>>> p6=Polygon([(40,40),(40,50),(30,50)])
>>>
>>> df=gpd.GeoDataFrame(geometry=[p1,p2,p3,p4,p5,p6])
>>> df
geometry
0 POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))
1 POLYGON ((10 10, 20 10, 20 20, 10 20, 10 10))
2 POLYGON ((10 10, 10 20, 0 10, 10 10))
3 POLYGON ((40 40, 50 40, 50 30, 40 30, 40 40))
4 POLYGON ((40 40, 50 40, 50 50, 40 50, 40 40))
5 POLYGON ((40 40, 40 50, 30 50, 40 40))
>>>
>>> df.plot()
各島内のポリゴンが、そのグループを表す ID (任意の可能性があります) を取得するようにします。たとえば、左下の 3 つのポリゴンは IslandID = 1 を持つことができ、右上の 3 つのポリゴンは IslandID=2 を持つことができます。
これを行う方法を開発しましたが、それが最善/最も効率的な方法かどうか疑問に思っています。私は次のことを行います:
1) マルチポリゴン単項ユニオン内のポリゴンに等しいジオメトリを持つ GeoDataFrame を作成します。これにより、「島」ごとに 1 つずつ、合計 2 つのポリゴンが得られます。
>>> SepIslands=gpd.GeoDataFrame(geometry=list(df.unary_union))
>>> SepIslands.plot()
2) 各グループの ID を作成します。
>>> SepIslands['IslandID']=SepIslands.index+1
3) 島を元のポリゴンに空間的に結合し、各ポリゴンが適切な島 ID を持つようにします。
>>> Final=gpd.tools.sjoin(df, SepIslands, how='left').drop('index_right',1)
>>> Final
geometry IslandID
0 POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0)) 1
1 POLYGON ((10 10, 20 10, 20 20, 10 20, 10 10)) 1
2 POLYGON ((10 10, 10 20, 0 10, 10 10)) 1
3 POLYGON ((40 40, 50 40, 50 30, 40 30, 40 40)) 2
4 POLYGON ((40 40, 50 40, 50 50, 40 50, 40 40)) 2
5 POLYGON ((40 40, 40 50, 30 50, 40 40)) 2
これは実際にこれを行うための最良/最も効率的な方法ですか?