Khoảng cách đến điểm gần nhất cho mọi điểm giống nhau SpatialPointsDataFrame trong R


8

Tôi có SpatialPointsDataFrame mà tôi đang làm việc trong R. Tôi muốn thêm một vectơ mới vào khung dữ liệu chứa, cho mỗi điểm, khoảng cách đến điểm khác gần nhất trong SpatialPointsDataFrame. Tôi đã xem knearneigh trong gói spdep cũng như spDistsN1 và spDists trong gói sp, nhưng cả hai đều không cho tôi chính xác những gì tôi muốn. Để rõ ràng, tất cả các điểm này đều nằm trong MỘT SpatialPointsDataFrame.


Điều này có thể giúp bạn stackoverflow.com/questions/21977720/
Kẻ

Câu trả lời:


13

Có một số cách bạn có thể giải quyết vấn đề này trong R, bao gồm spDists trong sp và gDistance trong rgeos. Một cách hiệu quả, có thể mở rộng thành nhiều kNN ID và khoảng cách, là sử dụng 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

Một cách khác, rất nhanh, là gói nabor. Vì khoảng cách được trả về cùng với ID hàng xóm, bạn có thể thêm cả hai cùng một lúc. Hàm nabor :: knn không trả về tự lân cận, do đó, bạn phải đặt k thành> = 2 và thả cột đầu tiên trong ma trận kết quả. Một lợi thế ở đây là, miễn là các ma trận có cùng chiều, bạn có thể nhận được hàng xóm từ cùng một dữ liệu hoặc độc lập.

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] ) )   
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.