根据R中坐标的距离为点分配点

时间:2015-01-07 18:29:50

标签: r coordinates distance sp

虽然有许多类似的主题(例如herehere),但我的结束目标与我在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包)之前我想到了,我会看看是否有人有任何想法。

1 个答案:

答案 0 :(得分:1)

尝试将数据分解为较小的块,这样就不会使内存过载。 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循环)。