У меня есть фреймворк с кругами, некоторые из которых пересекаются с другими. Я хочу объединить эти пересекающиеся области в новые строки в фреймворке данных, добавив атрибуты из пересекающихся регионов. Я только вижу, как использовать sjoin между двумя фреймами данных.
Как объединить пересекающиеся геометрии в одном фрейме данных Geopandas
Ответы (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
Благодарю. это полезная часть ответа, но тогда в gdf будут исходные многоугольники и их пересечения. Я хочу их разделить. Итак, я хочу пересечение, а затем части, которые не пересекаются. Что касается вышеприведенных графиков, мне нужен полумесяц, обращенный вправо, перекресток и полумесяц, обращенный влево. Простите за двусмысленность в моем первоначальном вопросе
- person J. Doe; 22.09.2017
Не за что ... просто хочу сообщить, что вы принимаете этот ответ, и это то, что только дало мне репутацию более 90 000 человек. Спасибо!
- person piRSquared; 22.09.2017
Для меня большая честь, и я уверен, что вы этого заслуживаете!
- person J. Doe; 22.09.2017
эй, поэтому я только что вернулся к работе над этим и теперь вижу, что это находит одно пересечение, независимо от того, сколько непересекающихся наборов пересекающихся многоугольников. Не могу придумать разумного способа сделать это (я мог бы перебирать таблицу, начиная с пар, затем с троек и т. Д., Чтобы найти все возможные пересечения, но это очень дорого). В основном я хочу, чтобы это было похоже на объединение arcmap, как показано здесь, но в одной таблице
- person J. Doe; 29.09.2017