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.

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


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)

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.