Ü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.

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


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)

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.