这里首先是使用geosphere 的另一种方法(使用distm 制作距离矩阵),然后我将展示如何使用terra::nearby 方法(适用于长/纬度和平面坐标)。
m <- matrix(c(61, -112, 63, -113, 61, -113, 62, -111, 61, -111, 64, -120), ncol=2, byrow=TRUE)
# note that the order should be long/lat !!!
m <- m[, 2:1]
d <- geosphere::distm(m)
diag(d) <- NA
i <- order(d[4,])[1:3]
i
#[1] 5 1 2
m[i,]
# [,1] [,2]
#[1,] -111 61
#[2,] -112 61
#[3,] -113 63
现在使用terra。下面获取所有点的最近 3 个邻居。
library(terra)
v <- vect(m, crs="+proj=lonlat")
nearby(v, k=3)
# id k1 k2 k3
#1 1 3 5 4
#2 2 4 3 1
#3 3 1 5 4
#4 4 5 1 2
#5 5 1 3 4
#6 6 2 3 4
使用 terra 版本 1.3.15(目前是开发版本)您也可以这样做
nearby(v[4,], v, k=4)
# id k1 k2 k3 k4
#[1,] 1 4 5 1 2
以k=4邻居为第一个就是点本身。
要获取开发版本,请执行
install.packages('terra', repos='https://rspatial.r-universe.dev')