Сделайте объединение полигонов в GeoPandas или Shapely (в единую геометрию)

Я пытаюсь найти объединение двух полигонов в GeoPandas и вывести единую геометрию, которая включает точки из обоих полигонов в качестве вершин. Функция geopandas.overlay дает мне многоугольники для каждого отдельного объединения, но мне нужен один многоугольник.

Для контекста я использую это, чтобы объединить две административные области вместе в одну область (то есть включить городской район в стране).

Следующий пример взят с веб-сайта geopandas и иллюстрирует то, что мне нужно:

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

Ни одна из выходных геометрий не соответствует моим ожиданиям, а именно:

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

Во-первых, как мне вывести указанный выше многоугольник (poly_union) из входных многоугольников (df1, df2) с помощью GeoPandas или shapely?

Во-вторых, какова правильная номенклатура, связанная с геометрией (poly_union), которую я пытаюсь найти? Я бы назвал это «объединением», но каждый нахожий мне пример, относящийся к «объединениям», не выводит эту геометрию.

Примечание. Этот пример также не выводит ни одного многоугольника:

poly1 = df1['geometry']; poly2 = df2['geometry']
mergedpoly = poly1.union(poly2)
mergedpoly.plot()

merged_poly.png


person p-robot    schedule 02.11.2016    source источник
comment
Для справки, в 2020 году с geopandas v 0.8.1 все операции overlay не изменились (как я наблюдал с v 0.6.1).   -  person swatchai    schedule 21.11.2020


Ответы (3)


Из вопроса / ответа здесь кажется, что это называется _ 1_ в 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()

Примечание: cascaded_union заменяется на unary_union, если используется GEOS 3.2+ - это позволяет объединять разные типы геометрии, а не только полигоны. Чтобы проверить свою версию,

>>> shapely.geos.geos_version
(3, 5, 1)

union

person p-robot    schedule 02.11.2016

Если вы предпочитаете Geopandas, а не Shapely, вы можете рассмотреть возможность растворения и использовать столбец с постоянным значением для всех записей: http://geopandas.org/aggregation_with_dissolve.html

person Rutger Hofste    schedule 10.11.2017

Ответ @Rutger Hofste тоже сработал для меня лучше всего. Если в ваших многоугольниках отсутствует столбец с постоянным значением, просто создайте его

gdf['new_column'] = 0 gdf_new = gdf.dissolve(by='new_column')

person ConZZito    schedule 19.03.2020