2016-07-07 49 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值和两个值。 –

相关问题