web-dev-qa-db-fra.com

Faire une union de polygones dans GeoPandas ou Shapely (en une seule géométrie)

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

res_union.png

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

union.png

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

merged_poly.png

24
p-robot

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)

union

27
p-robot

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

6
Rutger Hofste