J'essaie de trouver l'union de deux polygones dans GeoPandas et de produire une seule géométrie qui englobe les points des deux polygones comme ses sommets. Le geopandas.overlay
la fonction me donne des polygones pour chaque union individuelle mais je voudrais un seul polygone.
Pour le contexte, j'utilise ceci pour combiner deux zones administratives ensemble en une seule zone (c'est-à-dire inclure un district urbain dans un pays).
L'exemple suivant est tiré du site Web des géopandas et illustre ce que j'aimerais:
from matplotlib import pyplot as plt
import geopandas as gpd
from shapely.geometry import Polygon
polys1 = gpd.GeoSeries([Polygon([(0,0), (2,0), (2,2), (0,2)]),
Polygon([(2,2), (4,2), (4,4), (2,4)])])
polys2 = gpd.GeoSeries([Polygon([(1,1), (3,1), (3,3), (1,3)]),
Polygon([(3,3), (5,3), (5,5), (3,5)])])
df1 = gpd.GeoDataFrame({'geometry': polys1, 'df1':[1,2]})
df2 = gpd.GeoDataFrame({'geometry': polys2, 'df2':[1,2]})
res_union = gpd.overlay(df1, df2, how='union')
res_union.plot()
Aucune des géométries de sortie ne correspond à ce que j'attendais, à savoir:
poly_union = gpd.GeoSeries([Polygon([(0,0), (0,2), (1,2), (1,3), \
(2,3), (2,4), (3, 4), (3, 5), (5, 5), (5, 3), (4, 3), (4, 2), \
(3,2), (3,1), (2, 1), (2, 0), (0, 0)])])
poly_union.plot(color = 'red')
plt.show()
Tout d'abord, comment puis-je générer le polygone ci-dessus (poly_union
) à partir des polygones d'entrée (df1
, df2
) en utilisant GeoPandas ou bien?
Deuxièmement, quelle est la nomenclature correcte associée à la géométrie (poly_union
) que j'essaye de trouver? Je l'appellerais une "union" mais chaque exemple que je trouve qui fait référence à des "unions" ne produit pas cette géométrie.
Remarque: Cet exemple ne semble pas non plus générer un seul polygone:
poly1 = df1['geometry']; poly2 = df2['geometry']
mergedpoly = poly1.union(poly2)
mergedpoly.plot()
D'après la question/réponse ici , il semble que cela s'appelle un cascaded_union
dans shapely
:
from shapely.ops import cascaded_union
polygons = [poly1[0], poly1[1], poly2[0], poly2[1]]
boundary = gpd.GeoSeries(cascaded_union(polygons))
boundary.plot(color = 'red')
plt.show()
Remarque: cascaded_union
est remplacé par unary_union
si GEOS 3.2+ est utilisé - cela permet des unions sur différents types de géométrie, pas seulement des polygones. Pour vérifier votre version,
>>> shapely.geos.geos_version
(3, 5, 1)
Si vous préférez Geopandas à Shapely, vous pouvez envisager de dissoudre et d'utiliser une colonne avec une valeur constante pour toutes les entrées: http://geopandas.org/aggregation_with_dissolve.html