2016-09-22 44 views
1

我有2个数据框,它们只是2维(纬/长)矩阵。这两个数据帧看起来像下面的输入:在2个单独的矩阵中查找坐标的最近邻点以及2之间的距离

latitude longitude 
27.78833 -82.28197 
27.79667 -82.29294 

我们称之为“dfref”和“dfnew”。我想在dfref中的每个点找到dfnew中的最近点以及以米为单位的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 

我已经使用了类包的KNN功能和Searchtrees包试过,但我的脚本只发现在dfref矩阵最近的点,我不知道如何添加测量。

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

是否有确实有效且我怎样才能到一个脚本这一个功能呢?

回答

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 
+0

感谢布拉特,不过,我觉得我没有正确地解释我的问题。 我想只找到dfref中的所有点的距离,只有dfnew中的最近点,并非dfref中的所有点和dfnew中的所有点。当试图找到所有点时,我遇到了关于内存分配的问题。 '1:在forderv(byval,sort = FALSE,retGrp = TRUE): 达到8125Mb的总分配数量:see help(memory.size)' – ericbrownaustin

+0

您不需要计算距离所有点的距离点? – Bulat

+0

A K Nearest Neighbors函数可用于查找最近点,因此在查找实际距离之前只返回最近点。我试图在我原来的问题中使用一个,但不太了解结果。找到每个点的距离有点过于密集,正如我在之前的评论中提到的那样。我的数据框是10k和15k行,我需要找到一个有效的方法来处理它们。 – ericbrownaustin

相关问题