Es gibt verschiedene Möglichkeiten, wie Sie dies in R angehen können, einschließlich spDists in sp und gDistance in rgeos. Ein effizienter Weg, der auf mehrere kNN-IDs und Entfernungen erweiterbar ist, ist die Verwendung von spdep.
require(spdep)
data(meuse)
coordinates(meuse) = ~x+y
meuse <- meuse[1:10,]
meuse@data$IDS <- 1:10
# Neighbor row indices and add neighbor attribute ID's
( knn1 <- knearneigh(coordinates(meuse), k=1)$nn )
meuse@data$nnID <- meuse@data[knn1,]$IDS
# Add neighbor distance
meuse.dist <- dnearneigh(coordinates(meuse), 0, 1000)
dist.list <- nbdists(meuse.dist, coordinates(meuse))
meuse@data$nnDist <- unlist(lapply(dist.list, FUN=function(x) min(x)))
meuse@data
Ein weiterer, sehr schneller Weg ist das Nabor-Paket. Da die Entfernung zusammen mit der Nachbar-ID zurückgegeben wird, können Sie beide gleichzeitig hinzufügen. Die Funktion nabor :: knn gibt Selbstnachbarn zurück. Sie müssen also k auf> = 2 setzen und die erste Spalte in den resultierenden Matrizen löschen. Ein Vorteil hierbei ist, dass Sie, solange die Matrizen dieselbe Dimension haben, Nachbarn aus denselben oder unabhängigen Daten erhalten können.
library(nabor)
library(sp)
data(meuse)
coordinates(meuse) = ~x+y
meuse <- meuse[1:10,]
meuse@data$IDS <- 1:10
knn1 <- knn( coordinates(meuse), coordinates(meuse), k=2)
( knn1 <- data.frame( knn=knn1[[1]][,2], knn.dist=knn1[[2]][,2] ) )