Distância para o ponto mais próximo para cada ponto SpatialPointsDataFrame em R

8

Eu tenho um SpatialPointsDataFrame com o qual estou trabalhando em R. Quero adicionar um novo vetor ao dataframe que contenha, para cada ponto, a distância até o outro ponto mais próximo no SpatialPointsDataFrame. Eu observei knearneigh no pacote spdep, bem como spDistsN1 e spDists no pacote sp, mas nenhum deles me fornece exatamente o que eu quero. Para ficar claro, todos esses pontos estão em ONE SpatialPointsDataFrame.

Amadou Kone
fonte
Isso pode ajudá-lo a stackoverflow.com/questions/21977720/…
MickyT 30/01

Respostas:

13

Existem várias maneiras de resolver isso em R, incluindo spDists em sp e gDistance em rgeos. Uma maneira eficiente, expansível para vários kNN IDs e distâncias, é usar 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

Outra maneira, muito rápida, é o pacote nabor. Como a distância é retornada junto com o ID do vizinho, você pode adicionar os dois simultaneamente. A função nabor :: knn retorna auto-vizinhos, portanto, você deve definir k como> = 2 e soltar a primeira coluna nas matrizes resultantes. Uma vantagem aqui é que, desde que as matrizes tenham a mesma dimensão, é possível obter vizinhos a partir dos mesmos dados ou de dados independentes.

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
fonte