Создайте объединение полигонов в GeoPandas или Shapely (в одну геометрию)
Я пытаюсь найти объединение двух полигонов в GeoPandas и вывести одну геометрию, которая охватывает точки из обоих полигонов как ее вершины. Функция geopandas.overlay
дает мне многоугольники для каждого отдельного объединения, но мне geopandas.overlay
один многоугольник.
Для контекста я использую это, чтобы объединить две административные области в единую область (например, включить городской район в пределах страны).
Следующий пример представлен на сайте геоданных и иллюстрирует, что мне хотелось бы:
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()
Ни одна из выходных геометрий - это то, что я ожидал, а именно:
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()
Во-первых, как я могу вывести вышеупомянутый многоугольник (poly_union
) из входных многоугольников (df1
, df2
) с помощью GeoPandas или красиво?
Во-вторых, какова правильная номенклатура, связанная с геометрией (poly_union
), которую я пытаюсь найти? Я бы назвал это "союзом", но каждый пример, который я нахожу, относится к "союзам", не выводит эту геометрию.
Примечание. Этот пример, похоже, не выводит ни одного полигона:
poly1 = df1['geometry']; poly2 = df2['geometry']
mergedpoly = poly1.union(poly2)
mergedpoly.plot()
Ответы
Ответ 1
Из вопроса/ответа здесь, кажется, это называется cascaded_union
внутри 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)
Ответ 2
Если вы предпочитаете Geopandas над Shapely, вы можете рассмотреть возможность растворения и использования столбца с постоянным значением для всех записей: http://geopandas.org/aggregation_with_dissolve.html