Получение количества пересечений между геометриями в 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 геометрии (точки и многоугольники), которые пересекаются хотя бы один раз.

  1. Пространственное соединение ваших слоев

Вы должны написать что-то вроде этого: pointsInPolygon = gpd.sjoin (points, polygons, how = "inner", op = 'пересекает')

  1. Добавьте поле с 1 в качестве постоянного значения. Вы должны написать что-то вроде этого: pointsInPolygon ['const'] = 1

  2. Сгруппируйте по полю в соответствии с столбцом, по которому вы хотите агрегировать данные Вы должны написать что-то вроде этого: pointsInPolygon.groupby (['field']). Sum ()

Столбец [const] даст вам количество пересечений между двумя вашими геометриями.

Если вы хотите увидеть и другие столбцы, просто введите что-то вроде этого: df = pointsInPolygon.groupby ('field'). Agg ({'columnA': 'first', 'columnB': 'first', 'const': 'сумма'}). reset_index ()

Другие вопросы по тегам