0

我有两个坐标列表,mapped_coords,unmapped_coords,它们都是坐标列表。

我想采用 unmapped_coords 并为每个元素返回具有 mapped_coord 中最小距离的点的索引。

> head(mapped_coords)
[[1]]
[1] -79.2939  43.8234

[[2]]
[1] -79.7598  43.4381

[[3]]
[1] -79.4569  43.6693

[[4]]
[1] -81.2472  42.9688

[[5]]
[1] -79.1649  43.8073

[[6]]
[1] -79.7388  43.6753

 str(mapped_coords)
List of 62815
 $ : num [1:2] -79.3 43.8
 $ : num [1:2] -79.8 43.4
 $ : num [1:2] -79.5 43.7

使用 geosphere 包,我可以使用 distHaversine 计算一对的距离,但我不确定如何在整个列表中进行计算。

> distHaversine(unlist(unmapped_coords[1]), unlist(mapped_coords[1]))
[1] 100594.6
4

2 回答 2

3

您可以geosphere::distm用来制作一个距离矩阵,您可以在其中找到最小列(除了对角线,这没有用)which.min

l <- list(c(-79.2939, 43.8234), 
          c(-79.7598, 43.4381), 
          c(-79.4569, 43.6693), 
          c(-81.2472, 42.9688), 
          c(-79.1649, 43.8073), 
          c(-79.7388, 43.6753))

m <- geosphere::distm(do.call(rbind, l))
diag(m) <- NA

apply(m, 1, which.min)
#> [1] 5 6 1 2 1 3

如果您有第二个距离列表,请将其作为第二个参数传递给distm,从而使对角线变得有用。由于不会有NAs,因此可以使用 计算最小列max.col(-m)

于 2017-12-05T19:54:18.143 回答
1

您可以将distHaversine一对坐标和一个坐标矩阵(有 2 列)作为输入,这将返回一个与矩阵中的行数长度相同的距离向量。您可以使用以下方式遍历未映射的坐标列表lapply

数据:

mapped_coord = list(c(-79.29,43.82),c(-79.76,43.44))
[[1]]
[1] -79.29  43.82

[[2]]
[1] -79.76  43.44

unmapped_coord = list(c(-79.16,43.12),c(-80.52,42.95))
[[1]]
[1] -79.16  43.12

[[2]]
[1] -80.52  42.95

方法:

library(geosphere)
## Transform the list of mapped coordinates into a matrix
mat = do.call(rbind,mapped_coord)
      [,1]  [,2]
[1,] -79.29 43.82
[2,] -79.76 43.44
## Find the coordinates with the min distances
lapply(unmapped_coord,function(x) which.min(distHaversine(x,mat)))
[[1]]
[1] 2

[[2]]
[1] 2
于 2017-12-05T19:45:42.463 回答