使用sp()包计算两组坐标之间的最短距离

时间:2018-03-20 16:47:25

标签: r apply geospatial distance sp

我有两组坐标(base和amp; target)作为两个数据帧。

base.df <- data.frame(cbind(LONG = c(-73.94006,-73.95616,-73.86548,-73.99118,-73.99801,
                                 -73.96208,-73.95544,-74.09251,-73.94317,-73.98913),
                            LAT = c(0.78963,40.65378,40.83767,40.75533,40.74759,
                                40.71327,40.81450,40.62554,40.83660,40.57415)))

target.df <- data.frame(cbind(long = c(-74.00754,-74.01252,-74.00525,-74.00594,-74.00668,-73.99290),
                              lat = c(40.70347,40.71007,40.71005,40.71546,40.71976,40.71521)))

我的目标是获取基础数据帧的每一行并使用spDistsN1()来获得该行(基数)与目标数据帧的每一行之间的不同距离。在我想要最远距离的许多距离中(使用min()?)并将最短距离附加到新矢量。完成后,我应该只有10个数据点,我可以cbind()支持基础数据帧。我知道apply()可能有用,但我对使用它或在R中编写函数并不是很熟悉,有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

这是处理任务的一种方法。由于您需要spDistsN1()的矩阵,我将两个数据帧都转换为矩阵对象。在lapply()我计算了base.df中每一行与target.df中所有行之间的距离。这会创建十个列表。每个列表代表base.df中的每一行。你想要做的是在每个列表中寻找一个最小值,你可以用另一个lapply()来做。最后,我使用out将结果base.df添加到bind_cols()

library(sp)
library(dplyr)
library(purrr)

base.mtx <- as.matrix(base.df)
target.mtx <- as.matrix(target.df)

lapply(1:nrow(base.df), function(x){
    spDistsN1(pts = target.mtx, pt = base.mtx[x, ])}) %>%
lapply(min) %>%
unlist %>%
bind_cols(base.df, out = .)

        LONG      LAT         out
1  -73.94006  0.78963 39.91389704
2  -73.95616 40.65378  0.07147727
3  -73.86548 40.83767  0.17672665
4  -73.99118 40.75533  0.03880045
5  -73.99801 40.74759  0.02914923
6  -73.96208 40.71327  0.03088100
7  -73.95544 40.81450  0.10612142
8  -74.09251 40.62554  0.11529521
9  -73.94317 40.83660  0.13118157
10 -73.98913 40.57415  0.13062385