2017-12-05 8 views
0

Ich habe zwei Koordinaten, mapped_coords, unmapped_coords, die beide eine Liste von Koordinaten sind.Berechnung der Entfernung über eine Liste

Ich möchte die unmapped_coords nehmen und für jedes Element den Index des Punktes mit dem Mindestabstand in mapped_coord zurückgeben.

> 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 

Mit der Geosphäre Paket Ich kann distHaversine verwenden, um die Entfernung eines ein Paar zu berechnen, aber ich bin mir nicht sicher, wie es über die gesamte Liste zu tun.

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

Antwort

1

Sie können als Eingabe für distHaversine ein Paar von Koordinaten und eine Matrix von Koordinaten (mit 2 Säulen) geben, und das einen Vektor von Abständen von der gleichen Länge wie die Anzahl der Zeilen in der Matrix zurück. Sie können Ihre Liste der nicht zugeordneten Koordinaten Schleife durch Verwendung lapply:

Daten:

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 

Methode:

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

Sie können geosphere::distm verwenden, um eine Distanzmatrix zu machen, von denen Sie das finden können minimale Spalte (neben der Diagonalen, die nicht nützlich ist) mit 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 

Wenn Sie eine zweite Liste von Entfernungen haben, übergeben Sie diese als zweiten Parameter an distm, wodurch die Diagonale nützlich wird. Da es keine NA s geben wird, kann die minimale Spalte mit max.col(-m) berechnet werden.

Verwandte Themen