Как объединить пересекающиеся геометрии в одном фрейме данных Geopandas

У меня есть фреймворк с кругами, некоторые из которых пересекаются с другими. Я хочу объединить эти пересекающиеся области в новые строки в фреймворке данных, добавив атрибуты из пересекающихся регионов. Я только вижу, как использовать sjoin между двумя фреймами данных.


person J. Doe    schedule 21.09.2017    source источник


Ответы (1)


Настройка

import geopandas as gpd, pandas as pd
from urbansim.maps import dframe_explorer
from shapely.geometry import Point
%matplotlib inline

c1 = Point(1, 0).buffer(1)
c2 = Point(.5, 0).buffer(1)

gdf = gpd.GeoDataFrame(dict(A=[1, 2], B=[3, 4]), geometry=[c1, c2])

gdf.plot()

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

Решение
Использование reduce от functools

from functools import reduce

intersection = reduce(Point.intersection, gdf.geometry) 

summed = gpd.GeoDataFrame(
    gdf.sum().to_frame().T,
    geometry=[intersection]
)

gdf.set_geometry(
    gdf.difference(intersection)
).append(summed, ignore_index=True).plot()

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

person piRSquared    schedule 21.09.2017
comment
Благодарю. это полезная часть ответа, но тогда в gdf будут исходные многоугольники и их пересечения. Я хочу их разделить. Итак, я хочу пересечение, а затем части, которые не пересекаются. Что касается вышеприведенных графиков, мне нужен полумесяц, обращенный вправо, перекресток и полумесяц, обращенный влево. Простите за двусмысленность в моем первоначальном вопросе - person J. Doe; 22.09.2017
comment
Не за что ... просто хочу сообщить, что вы принимаете этот ответ, и это то, что только дало мне репутацию более 90 000 человек. Спасибо! - person piRSquared; 22.09.2017
comment
Для меня большая честь, и я уверен, что вы этого заслуживаете! - person J. Doe; 22.09.2017
comment
эй, поэтому я только что вернулся к работе над этим и теперь вижу, что это находит одно пересечение, независимо от того, сколько непересекающихся наборов пересекающихся многоугольников. Не могу придумать разумного способа сделать это (я мог бы перебирать таблицу, начиная с пар, затем с троек и т. Д., Чтобы найти все возможные пересечения, но это очень дорого). В основном я хочу, чтобы это было похоже на объединение arcmap, как показано здесь, но в одной таблице - person J. Doe; 29.09.2017