根据与 R 中坐标的距离将点分配到位置

Assigning points to locations based on distance from coordinate in R

虽然有许多类似的主题(例如 here and here),但我的最终目标与我在 SO 上看到的其他问题略有不同。作为参考,我使用的是 R v 3.1.0.

我有两个矩阵。每个都包含点的坐标。第一个 (A) 包含 2,107,377 个点,第二个 (B) 包含 26,577 个点。

我想找到 B 中与 A 中的每个点最接近的点。也就是说,我想计算 A 中的点 1 与 B 中的每个点之间的距离(26,577 个距离),并存储最小值。我想对 A 中的每个点(2,107,377 最小值)执行此操作。目标是根据 B 中最接近的点将 A 中的点分组在一起。因此,B中的一些点不会被分配;而其他人(很多)将被分配到 A.

中的多个点

我试过:

test = which.min(sapply(1:nrow(coordinates), function(i) 
            spDistsN1(matrix(A, ncol = 2), matrix(B[i,], ncol = 2), 
                      longlat = TRUE)))

但遇到内存分配问题(无法分配大于 16 Mb 的向量)。

我现在正在运行一个 for 循环:

for (i in 1:nrow(A)) {
    minimum[i] = which.min(spDistsN1(matrix(A, ncol = 2), matrix(B[i,], ncol = 2), 
                                     longlat = TRUE))  
}

但是,我预计,这将导致相同的结果,只是速度更慢。

我想在我尝试一种完全不同的方法之前(也许学习 raster 包),我会看看是否有人有任何想法。

尝试将数据分解成更小的块,以免内存过载。 reproducible example 会有所帮助,但我认为这可以完成工作:

library(sp)
# X1 is a small example and X2 is a large example
X1 <- cbind(pointX = 1:109, pointY = 1:109)
Y1 <- cbind(x = 11:20, y = 11:20)

X2 <- cbind(pointX  = 2e4 + sample(2e6), pointY  = 2e4 + sample(2e6))
Y2 <- cbind(x = sample(2e4), y = sample(2e4))

nearWrapper = function(X, Y, nBatches = 10){
    maxNumber = dim(X)[1]
    batchNumbers <- split(0:maxNumber, ceiling(seq_along(0:maxNumber)/nBatches))
    out <- numeric(maxNumber)
    for(batch in 1:(nBatches+1)){
        out[batchNumbers[[batch]]] <- apply(spDists(X[batchNumbers[[batch]],], Y), 1, which.min)
        }   
    return(out)
}
smallOut <- nearWrapper(X1, Y1)
largeOut <- nearWrapper(X2, Y2)

如果您的数据花费的时间太长,您还可以检查并行计算(在您的案例中使用 foreach 循环代替 for 循环)。