Abstand zum nächsten Punkt für jeden Punkt des gleichen SpatialPointsDataFrame in R.

8

Ich habe einen SpatialPointsDataFrame, mit dem ich in R arbeite. Ich möchte dem Datenrahmen einen neuen Vektor hinzufügen, der für jeden Punkt den Abstand zum nächstgelegenen anderen Punkt im SpatialPointsDataFrame enthält. Ich habe mir knearneigh im spdep-Paket sowie spDistsN1 und spDists im sp-Paket angesehen, aber keiner von beiden gibt mir genau das, was ich will. Alle diese Punkte befinden sich in ONE SpatialPointsDataFrame.

Amadou Kone
quelle
Dies kann Ihnen helfen, stackoverflow.com/questions/21977720/…
MickyT

Antworten:

13

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] ) )   
Jeffrey Evans
quelle