Объединение шейп-файлов в Python / GeoPandas

У меня есть три многоугольных шейп-файла, которые перекрывают друг друга. Назовем их:

  • file_one.shp (Имя многоугольника 1)
  • file_two.shp (Имя многоугольника 2)
  • file_three.shp (Имя многоугольника 3)

Я хочу объединить их и сохранить такие ценности.

введите здесь описание изображения

Как я могу добиться результата (как показано на рисунке) на Python, пожалуйста?

Спасибо!


person TheRealJimShady    schedule 05.07.2019    source источник
comment
Я не понимаю, каков ваш ожидаемый результат. Под объединением вы имеете в виду просто собрать все три файла вместе и сохранить перекрытия? Или какие-то пространственные операции?   -  person martinfleis    schedule 06.07.2019
comment
В результате первый многоугольник будет пустым, как и второй. Многоугольник три не годится. Думаю, я хочу их пересечь, может быть?   -  person TheRealJimShady    schedule 06.07.2019
comment
Входными данными будут три файла. Результатом будет один файл с тремя функциями.   -  person TheRealJimShady    schedule 06.07.2019
comment
Сейчас я хотел бы указать вам сюда geopandas.org/set_operations.html. Вы должны предоставить мин. рабочий пример, если вам нужен обзор кода.   -  person martinfleis    schedule 07.07.2019


Ответы (2)


Сначала сгенерируем данные для демонстрации:

import geopandas as gpd
from shapely.geometry import Point
shp1 = gpd.GeoDataFrame({'geometry': [Point(1, 1).buffer(3)], 'name': ['Shape 1']})
shp2 = gpd.GeoDataFrame({'geometry': [Point(1, 1).buffer(2)], 'name': ['Shape 2']})
shp3 = gpd.GeoDataFrame({'geometry': [Point(1, 1).buffer(1)], 'name': ['Shape 3']})

Теперь возьмем симметричную разницу для всех, кроме самой маленькой формы, которую можно оставить как есть:

diffs = []
gdfs = [shp1, shp2, shp3]
for idx, gdf in enumerate(gdfs):
    if idx < 2:
        diffs.append(gdf.symmetric_difference(gdfs[idx+1]).iloc[0])
diffs.append(shp3.iloc[0].geometry)

Итак, теперь у вас есть желаемые формы в виде списка в различиях. Если вы хотите объединить их в один GeoDataFrame, просто сделайте следующее:

all_shapes = gpd.GeoDataFrame(geometry=diffs)
person bexi    schedule 19.07.2019

Если вы хотите просто создать один шейп-файл из упомянутых вами файлов, вы можете попробовать следующий код (я предполагаю, что в шейп-файлах есть одинаковые столбцы).

import pandas as pd
import geopandas as gpd

gdf1 = gpd.read_file('file_one.shp')
gdf2 = gpd.read_file('file_two.shp')
gdf3 = gpd.read_file('file_three.shp')

gdf = gpd.GeoDataFrame(pd.concat([gdf1, gdf2, gdf3]))
person lukaszKielar    schedule 18.07.2019