在2个单独的矩阵中找到最近的坐标邻居,并在r中找到2之间的距离

时间:2016-09-22 22:17:33

标签: r knn

我有2个数据帧,它们只是2维的矩阵(纬度/经度)。两个数据框看起来都像下面的输入:

latitude  longitude
27.78833  -82.28197
27.79667  -82.29294

我们称他们为“dfref”和“dfnew”。我想在dfnew中为dfref中的每个点找到最近的点,以及以米为单位的2点之间的距离。

输出如下:

dr.latitude  dr.longitude  dn.latitude  dn.longitude  dist
27.78833     -82.28197     27.54345     -82.33233     162.34
27.79667     -82.29294     27.56543     -82.12323     232.23

我已尝试在类包和Searchtrees包中使用knn函数,但我的脚本只找到了dfref矩阵中的最近点,我不知道如何添加测量值。

knn1(train=cbind(dfref), test=cbind(dfnew), cl=seq_len(nrow(dfnew))) 

是否有一个功能可以有效地完成这两个脚本?

1 个答案:

答案 0 :(得分:0)

我不是地理数学的专家,但似乎你可以从这样的事情开始:

dfref <- read.table(text = 
"latitude  longitude
27.78833  -82.28197
27.79667  -82.29294", header = T)
dtref <- data.table(dfref)

dfnew <- read.table(text = 
"latitude  longitude
27.54345     -82.33233", header = T)
dtnew <- data.table(dfnew)

# Make cartesian product of to tables.
dtref$fake <- 1
dtnew$fake <- 1
dtall <- merge(dtref, dtnew, by = "fake", allow.cartesian = T)

# Calculate distance.
library(geosphere)
dtall[, distance := distVincentyEllipsoid(c(longitude.x, latitude.x), c(longitude.y, latitude.y)), by = 1:nrow(dtall)]

# Print results.
dtall[, .(latitude.x, longitude.x, latitude.y, longitude.y, distance)]

#      latitude.x longitude.x latitude.y longitude.y distance
# 1:   27.78833   -82.28197   27.54345   -82.33233 27587.29
# 2:   27.79667   -82.29294   27.54345   -82.33233 28328.19