2016-07-07 47 views
2

我有一個數據框,其中包含UTM(通用橫軸墨卡託)座標中的地點列表和地理位置。查找哪些點位於每個點的給定距離內

它看起來是這樣的:

Place X_UTM Y_UTM 
    1 574262.0 6140492 
    2 571251.2 6141669 
    3 570841.9 6142535 
    4 570233.8 6141213 
    5 578269.2 6140304 
    6 575067.1 6137444 

我想確定,每個地方(數據幀中的每一行)外,其他地方的這是一個給定的歐氏距離之內。在這種情況下,我想找出哪些地方比1公里更近。

我已經試過這樣的事情:

foo <- function(x, y) dist(c(x, y), method = "euclidian") < 1000 

這應該是返回的1000多米的更近點的功能。然後:

x <- lapply(df(,c(i, x, y)), FUN = foo) 

其中i"Place"x"X_UTM"y"Y_UTM"。這根本不起作用。

我應該後看起來像這樣(而不是從上面給出的數字)中獲得的輸出:

# Place Closest 
#  1 2, 5 
#  2  1 
#  3  NA 
#  4  5 
#  5 1, 4 
#  6  NA 
+0

糾正我,如果我是不正確的,但不應該將距離函數接受兩個_points_,即兩個X和兩個Y值? –

+0

是的。我想計算每一行之間的距離。對於所有行,這應該是sqr((X_UTM [1] - X_UTM [i])^ 2 - (Y_UTM [1] - Y_UTM [i])^ 2),然後記錄哪個[i]小於1000. –

+1

can你不會做'dst < - as.matrix(dist(d [-1])); diag(dst)< - NA; (dst,1,function(x)paste(其中(x <1000),collapse =「,」))' – user20650

回答

2

您也可以使用sp::spDists返回距離矩陣,然後查找每個滿足條件的列/行的元素。

例如:

d <- read.table(text='Place X_UTM  Y_UTM 
1  574261.98 6140492.13 
2  571251.23 6141669.26 
3  570841.92 6142534.86 
4  570233.75 6141212.5 
5  578269.25 6140303.78 
6  575067.07 6137444.36', header=TRUE) 
library(sp) 
i <- apply(spDists(as.matrix(d[, c('X_UTM', 'Y_UTM')])), 2, 
      function(x) paste(which(x < 1000 & x != 0), collapse=', ')) 

data.frame(Place=d$Place, Closest=i) 

## Place Closest 
## 1  1   
## 2  2  3 
## 3  3  2 
## 4  4   
## 5  5   
## 6  6   
+1

完美地工作。只需補充說明spDist在包sp中。非常感謝。 –

+0

'dist'也可以正常工作,因爲[指出](http://stackoverflow.com/questions/38246575/how-to-find-the-elements-of-a-vector-wich-distance-is-less -than-a-value-in-r/38257822?noredirect = 1#comment63915843_38246575)by @ user20650。此外,我的答案將無法返回任何巧合點 - 也就是說,距離爲零的任何點都將被忽略。忽略「自我」的更好方法是將用戶20650的評論中提到的對角線設置爲「NA」。 – jbaums

0

我想你會需要交叉連接的位置座標。原因是任何一對地方都可能是最近的鄰居,並且假設您沒有任何先驗信息可以排除某些對,您需要檢查所有這些信息。

讓你的數據幀df的交叉連接的一種方式是與自身進行合併,設置by = NULL作爲參數傳入merge

df.cross <- merge(x = df, y = df, by = NULL) 
df.cross$distance <- apply(df.cross[, c('X_UTM.x', 'X_UTM.y', 'Y_UTM.x', 'Y_UTM.y')], 
     1, 
     function(x) dist(x[1], x[2], x[3], x[4])) 

現在,所有你需要做的是找到的最小距離每一雙地方。

+0

親愛的@Tim Biegeleisen,謝謝你的回答。在運行您分享的腳本時,我有以下幾點:Dist(x [1],x [2],x [3],x [4])中的錯誤:無效距離方法 –

+0

您需要重新定義dist函數爲兩個笛卡爾點取兩個x值和兩個值。 –

相關問題