2016-09-22 45 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

相關問題