Я задал очень похожий вопрос раньше. Поскольку решение arcpy
очень громоздко, теперь я ищу в основном ту же функцию в geopandas
. Возникает вопрос: каков самый быстрый / лучший способ применить функцию бинарного предиката (например touches
), где каждая функция x
сравнивается с всеми остальными функциями либо x
, либо другого набора данных y
. Я ожидал, что результат будет аналогичен поведению по умолчанию в R:
Если y отсутствует, эффективно вызывается
st_predicate(x, x)
, и возвращается квадратная матрица с диагональными элементамиst_predicate(x[i], x[i])
.
Чтобы проиллюстрировать это с помощью фиктивных данных и функции st_overlaps()
:
library(sf)
b0 = st_polygon(list(rbind(c(-1,-1), c(1,-1), c(1,1), c(-1,1), c(-1,-1))))
a0 = b0 * 0.8
a1 = a0 * 0.5 + c(2, 0.7)
a2 = a0 + 1
a3 = b0 * 0.5 + c(2, -0.5)
x = st_sfc(a0,a1,a2,a3)
plot(x)
st_overlaps(x)
#> Sparse geometry binary predicate list of length 4, where the predicate was `overlaps'
#> 1: 3
#> 2: 3
#> 3: 1, 2
#> 4: (empty)
Как добиться аналогичного поведения в python
/ geopandas
? Очевидно, geopandas
автоматически выравнивает x
и _16 _ / _ 17_, и выполняется поэлементное сравнение (см. этот вопрос SO и этот выпуск на github). В python запуск x.overlaps(x)
просто возвращает серию панд с четырьмя True
значениями.
import geopandas as gpd
x.overlaps(x)
0 True
1 True
2 True
3 True