Я пытаюсь создать таблицу соседей полигонов на основе мозаики Вороного (она же мозаика Дирихле или многоугольники Тиссена), созданной функцией dirichlet()
библиотеки spatstat
. Например, на рисунке ниже верхний правый и нижний правый тайлы будут иметь по 2 соседа, центральный правый тайл — 4 соседа, а остальные два тайла — по 3 соседа. Я хочу зафиксировать соседние пары в таблице и, в идеале, зафиксировать длину линии границы, которую они разделяют: например, «Плитка1», «Плитка2», «shared_edge_length».
Первоначально я пытался просмотреть и сравнить каждую пару полигонов в тесселяции, используя функции intersect.tess()
, intersect.own()
, а также polyclip
, но я предполагаю, что они не работают, потому что плитки по определению не перекрываются по площади, несмотря на то, что они разделены. края. Есть ли простая функция для этого (альтернативой может быть цикл по $bdry
точкам)? Вроде в пакете regeos
есть gTouches
, но для spatstat
ничего похожего не нашел.
Это мой текущий нерабочий подход:
library(spatstat)
points <- ppp(x=c(-77.308703, -77.256582, -77.290600, -77.135668, -77.097144),
y=c(39.288603, 39.147019, 39.372818, 39.401898, 39.689203),
window=owin(xrange=c(-77.7,-77), yrange=c(39.1, 39.7)))
vt <- dirichlet(points) # Dirichlet tesselation
plot(vt)
tilesA <- tiles(vt)
n_tiles <- length(tilesA)
boundary_calcs <- data.frame('area1_id'=numeric(), 'area2_id'=numeric(), 'neighbor'=logical()) # Store boundary pairs
for (i in 1:n_tiles) {
for (j in 1:n_tiles) {
intersection <- intersect.owin(tilesA[[i]], tilesA[[j]], fatal=FALSE) # does not work
if (!is.empty(intersection)) {
boundary_calcs[nrow(boundary_calcs)+1, ] <- c(i, j, TRUE) # add to data table as new row
} } }