Fusionner des entités qui se chevauchent à l'aide de géopandas?

8

J'ai un Shapefile avec des fonctionnalités qui se chevauchent. Existe-t-il un moyen simple de les fusionner avec des géopandas?

J'ai trouvé un moyen avec galbe, mais je voudrais le faire directement avec les géopandas.

Mehdi.Sqalli
la source

Réponses:

10

Le GeoDataFrame

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

entrez la description de l'image ici

entrez la description de l'image ici

1) Vous pouvez utiliser le module itertools

a) Si vous souhaitez fusionner les intersections des polygones qui se chevauchent

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

entrez la description de l'image ici

entrez la description de l'image ici

syndicat

union_iter = intersection_iter.unary_union

b) Si vous souhaitez fusionner les polygones intersectés, changez intersectionde union(tous les polygones se chevauchent dans mon exemple)

entrez la description de l'image ici

2) Vous pouvez utiliser la superposition GeoPandas

une)

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

Le GeoDataframe résultant

entrez la description de l'image ici

Les GeoPandas ajoutent les géométries d'intersection aux géométries existantes, donc

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

entrez la description de l'image ici

syndicat

union = intersection.unary_union

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

gène
la source
1

Si vous souhaitez générer une couche de polygones superposés fusionnés distincts, et pas seulement un seul polygone multiple, après avoir utilisé:

union = intersection.unary_union

vous pouvez convertir le multi-poly résultant en une GeoSeries:

shapes_series = gpd.GeoSeries([polygon for polygon in union])

ou à un GeoDataFrame:

shapes_df = gpd.GeoDataFrame([polygon for polygon in union]).set_geometry(0)
Pawel Kranzberg
la source
Cela devrait probablement être une modification de la première réponse plutôt qu'une réponse à part entière
nmtoken
Merci pour l'astuce, mais je finirais par retravailler la réponse du gène, et cela ne vaut pas la peine. Je n'ai pas pu ajouter de commentaire non plus car mon représentant est en dessous de 50.
Pawel Kranzberg