2017-12-05 6 views
0

두 좌표 목록 mapped_coords, unmapped_coords 두 좌표 목록이 있습니다.리스트를 통한 거리 계산

매핑되지 않은 _coord를 가져 가고 모든 요소에 대해 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 

나는 한 쌍의 거리를 계산하는 distHaversine를 사용할 수있는 지구권 패키지를 사용하지만 전체 목록에 그것을 수행하는 방법 모르겠어요.

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

답변

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 
3

당신은 당신이 찾을 수있는 거리 행렬을 만들기 위해 geosphere::distm을 사용할 수 있습니다 (유용하지 않은 대각선 이외의) 최소 열은

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에 전달하여 대각선을 유용하게 만듭니다. NA이 없기 때문에 최소 열은 max.col(-m)으로 계산할 수 있습니다.