Получение количества пересечений между геометриями в GeoPandas
Можно ли получить количество пересечений между двумя геометриями, используя объекты GeoPandas? То есть я хочу подсчитать количество полигонов или строк в одном GeoDataFrame, которые пересекаются с каждым полигоном в другом GeoDataFrame. Я не видел простого способа сделать это при просмотре документов GeoPandas, но хотел проверить, прежде чем переходить к инструментам более низкого уровня.
3 ответа
Вы хотите пространственное соединение: geopandas.tools.sjoin()
,
В этой записной книжке Jupyter есть пример - посмотрите на раздел " Пространственное соединение". Это подсчет набора очков (midpoints
) в набор полигонов (bins
). Обе геометрии определяют GeoDataFrame
,
На момент написания tools.sjoin()
не в текущей версии geopandas
, Я не мог получить geopandas.tools
встроить в любую из их веток, но я все-таки исправил - для меня - в своем форке. Мое исправление - открытый пиар.
Я не знаю о встроенном инструменте для этого, но я не эксперт. В то же время это легко сделать с помощью магии панд:
import geopandas as gpd
from shapely.geometry import *
p1 = Point(.5,.5)
p2 = Point(.5,1)
p3 = Point(1,1)
poly = Polygon([(0,0), (0,2), (2,2), (2,0)])
df1 = gpd.GeoSeries([p1,p2,p3])
df2 = gpd.GeoDataFrame([poly,p3], columns=['geometries'])
f = lambda x:np.sum(df1.intersects(x))
df2['geometries'].apply(f)
Должен вернуться:
0 3
1 1
Name: geometries, dtype: int64
Давайте рассмотрим 02 геометрии (точки и многоугольники), которые пересекаются хотя бы один раз.
- Пространственное соединение ваших слоев
Вы должны написать что-то вроде этого: pointsInPolygon = gpd.sjoin (points, polygons, how = "inner", op = 'пересекает')
Добавьте поле с 1 в качестве постоянного значения. Вы должны написать что-то вроде этого: pointsInPolygon ['const'] = 1
Сгруппируйте по полю в соответствии с столбцом, по которому вы хотите агрегировать данные Вы должны написать что-то вроде этого: pointsInPolygon.groupby (['field']). Sum ()
Столбец [const] даст вам количество пересечений между двумя вашими геометриями.
Если вы хотите увидеть и другие столбцы, просто введите что-то вроде этого: df = pointsInPolygon.groupby ('field'). Agg ({'columnA': 'first', 'columnB': 'first', 'const': 'сумма'}). reset_index ()