我正在尝试根据库dirichlet()
函数生成的 Voronoi 镶嵌(又名 Dirichlet 镶嵌或泰森多边形)创建一个多边形邻居表。spatstat
例如,在下图中,右上角和右下角的瓷砖各有 2 个邻居,中间右侧的瓷砖有 4 个邻居,其余两个瓷砖各有 3 个邻居。我想捕获表中的邻居对,并理想地捕获它们共享的边界线的长度:例如,'Tile1'、'Tile2'、'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
} } }