Ich habe ein Shapefile mit überlappenden Funktionen. Gibt es eine einfache Möglichkeit, sie mit Geopandas zusammenzuführen?
Ich habe einen Weg mit formschön gefunden, aber ich würde es gerne direkt mit Geopandas machen.
quelle
Ich habe ein Shapefile mit überlappenden Funktionen. Gibt es eine einfache Möglichkeit, sie mit Geopandas zusammenzuführen?
Ich habe einen Weg mit formschön gefunden, aber ich würde es gerne direkt mit Geopandas machen.
Der GeoDataFrame
import geopandas as gpd
g1 = gpd.GeoDataFrame.from_file("poly_intersect.shp")
g1.shape
(4, 3)
1) Sie können das Modul itertools verwenden
a) Wenn Sie die Schnittpunkte der überlappenden Polygone zusammenführen möchten
import itertools
geoms = g1['geometry'].tolist()
intersection_iter = gpd.GeoDataFrame(gpd.GeoSeries([poly[0].intersection(poly[1]) for poly in itertools.combinations(geoms, 2) if poly[0].intersects(poly[1])]), columns=['geometry'])
intersection_iter.to_file("intersection_iter.shp")
Union
union_iter = intersection_iter.unary_union
b) Wenn Sie die geschnittenen Polygone zusammenführen möchten, ändern Sie sich intersection
um union
(alle Polygone überlappen sich in meinem Beispiel)
2) Sie können GeoPandas Overlay verwenden
ein)
auto_inter = gpd.overlay(g1, g1, how='intersection')
auto_inter.shape
(7,4)
Der resultierende GeoDataframe
GeoPandas fügt daher die Schnittgeometrien zu den vorhandenen Geometrien hinzu
intersection = auto_inter[4:7]
intersection.to_file("intersection.shp")
Union
union = intersection.unary_union
b) verwenden gpd.overlay(g1, g1, how='union')
Wenn Sie eine Ebene aus verschiedenen zusammengeführten überlappenden Polygonen und nicht nur ein einzelnes Multi-Polygon ausgeben möchten, müssen Sie Folgendes verwenden:
union = intersection.unary_union
Sie können das resultierende Multi-Poly in eine GeoSeries konvertieren:
shapes_series = gpd.GeoSeries([polygon for polygon in union])
oder zu einem GeoDataFrame:
shapes_df = gpd.GeoDataFrame([polygon for polygon in union]).set_geometry(0)