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.
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:
Le GeoDataFrame
import geopandas as gpd
g1 = gpd.GeoDataFrame.from_file("poly_intersect.shp")
g1.shape
(4, 3)
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")
syndicat
union_iter = intersection_iter.unary_union
b) Si vous souhaitez fusionner les polygones intersectés, changez intersection
de union
(tous les polygones se chevauchent dans mon exemple)
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
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")
syndicat
union = intersection.unary_union
b) utiliser gpd.overlay(g1, g1, how='union')
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)