Überlappende Features mit Geopandas zusammenführen?

8

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.

Mehdi.Sqalli
quelle

Antworten:

10

Der GeoDataFrame

import geopandas as gpd
g1 = gpd.GeoDataFrame.from_file("poly_intersect.shp")
g1.shape
(4, 3)

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

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") 

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Union

union_iter = intersection_iter.unary_union

b) Wenn Sie die geschnittenen Polygone zusammenführen möchten, ändern Sie sich intersectionum union(alle Polygone überlappen sich in meinem Beispiel)

Geben Sie hier die Bildbeschreibung ein

2) Sie können GeoPandas Overlay verwenden

ein)

auto_inter = gpd.overlay(g1, g1, how='intersection')
auto_inter.shape
(7,4)

Der resultierende GeoDataframe

Geben Sie hier die Bildbeschreibung ein

GeoPandas fügt daher die Schnittgeometrien zu den vorhandenen Geometrien hinzu

intersection = auto_inter[4:7]
intersection.to_file("intersection.shp") 

Geben Sie hier die Bildbeschreibung ein

Union

union = intersection.unary_union

b) verwenden gpd.overlay(g1, g1, how='union')

Gen
quelle
1

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)
Pawel Kranzberg
quelle
Dies sollte wahrscheinlich eine Bearbeitung der ersten Antwort sein und keine eigenständige Antwort
nmtoken
Vielen Dank für den Tipp, aber am Ende würde ich die Antwort von Gen überarbeiten, und die Mühe lohnt sich nicht. Ich konnte auch keinen Kommentar hinzufügen, da mein Repräsentant unter 50 ist.
Pawel Kranzberg