r-在数据帧中查找离给定点最近的3个点



我有一个带纬度和经度的数据帧,看起来像这样:

x    y     set 
61  -112   
63  -113 
61  -113
62  -111   point 
61  -111
64  -120

我想找到与列set中标记为point的点最近的三个点。然后,对于这三个最接近的点,我想将列set修改为closest。像这样:

x    y     set 
61  -112   closest
65  -113 
62  -113   closest 
62  -111   point 
62  -111   closest
64  -120

我该怎么做?

dists <- geosphere::distHaversine(dat[dat$set=="point",c("y","x")], dat[,c("y","x")])
dists
# [1] 123339.4 151513.9 153862.4      0.0 111319.5 505814.4
dat$set[dat$set != "point" & rank(dists) < 5] <- "closest"
dat
#    x    y     set
# 1 61 -112 closest
# 2 63 -113 closest
# 3 61 -113        
# 4 62 -111   point
# 5 61 -111 closest
# 6 64 -120        

我们使用< 5的原因是自己的距离(pointpoint(将是最近的(0(,因此我们需要排名2-4。这假设存在一个"point";如果有更多,您可能需要outer(生成距离的matrix(,并在填充$set之前查看每一行。

我从sp标签推断纬度和经度,所以选择了Haversine距离计算,因为它很快,而且粗坐标的出现并不意味着需要亚毫米精度(即Vincenty椭球公式(。如果需要,还有其他距离计算。

这里首先是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

以CCD_ 17邻居作为第一个邻居是点本身。

要获得开发版本,请执行install.packages('terra', repos='https://rspatial.r-universe.dev')

最新更新