Вычисление матрицы расстояний по дуге

dist(coords) предоставляет матрицу расстояний с использованием евклидовых расстояний; он также предоставляет несколько других возможностей. Но он не предлагает никаких вариантов, таких как формула гаверсина.

distHaversine() вычисляет расстояние, которое я хочу (большой круг) для заданных двух наборов координат широты и долготы. Мне интересно, существует ли существующий пакет / функция, которая вычисляет матрицу расстояний по дуге большого круга с использованием формулировки гаверсинуса.


person Çagatay Melan    schedule 12.05.2014    source источник
comment
вы пробовали library("sos"); findFn("{great circle} distance") (и варианты)?   -  person Ben Bolker    schedule 12.05.2014
comment
Вам нужна формула гаверсинуса или просто расстояние на основе матрицы?   -  person Fernando    schedule 12.05.2014


Ответы (1)


Как вы, возможно, уже заметили, distHaversine() вычисляет расстояние между единственной точкой и двухколоночной матрицей координат.

Чтобы вычислить все попарные расстояния между двумя матрицами координат, просто используйте apply() для итерации строка за строкой по одной из матриц, вычисляя расстояние от каждой ее точки до всех точек в другой.

library(geosphere)

## Example coordinates (here stored in two column matrices)
cc1 <- rbind(c(0,0),c(1,1))
cc2 <- rbind(c(90,0),c(90,90), c(45,45))

## Compute matrix of distances between points in two sets of coordinates
apply(cc1, 1, FUN=function(X) distHaversine(X, cc2))
#          [,1]    [,2]
# [1,] 10018754 9907452
# [2,] 10018754 9907435
# [3,]  6679169 6524042

Интересное примечание: беглый взгляд на sp::spDists() (который действительно вычисляет попарные расстояния между двумя матрицами) показывает, что он использует по существу идентичную стратегию на основе apply(). Основное отличие, помимо дополнительной проверки ошибок и передачи аргументов, заключается в том, что он применяет функцию spDistsN1(), где мы применяем distHaversine().

person Josh O'Brien    schedule 12.05.2014
comment
Идеально! spDists(data, longlat=TRUE) это именно то, что я ищу. Спасибо! - person Çagatay Melan; 12.05.2014
comment
Большой. Для записи: не сразу кажется, что spDists() 'использует формулу Хаверсина для вычисления расстояния по Большому кругу (эллипсоид WGS84). Однако вы будете знать, имеет ли это значение для вашего приложения. - person Josh O'Brien; 12.05.2014