Найти расстояние между двумя городами с помощью формулы Haversine в R с пользовательской функцией - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь найти расстояние между двумя точками, используя R. Хотя я видел другие ответы ( Поиск ближайших городов от фрейма данных до определенного местоположения ), я хочу использовать определенныйформула для расчета расстояния в милях.На другом сайте (https://andrew.hedges.name/experiments/haversine/), я нашел этот код в Java, который дает правильное расстояние в их графическом интерфейсе:

dlon = lon2 - lon1 
dlat = lat2 - lat1 
a = (sin(dlat/2))^2 + cos(lat1) * cos(lat2) * (sin(dlon/2))^2 
c = 2 * atan2( sqrt(a), sqrt(1-a) ) 
d = 3961 * c

Затем я преобразовал это в функцию в R:

geo_distance <- function(lon2, lon1, lat2, lat1){
  dlon <- lon2 - lon1
  dlat <- lat2 - lat1
  a <- (sin(dlat/2))^2 + cos(lat1) * cos(lat2) * (sin(dlon/2))^2
  c <- 2 * atan2(sqrt(a), sqrt(1-a))
  d <- 3961 * c
  d
}

#The wrong number of miles from Hong Kong to Grand Canyon
geo_distance(114.17, -112.11, 22.31, 36.11)

#The wrong number of miles from Hong Kong to the Bangkok
geo_distance(114.17, 100.50, 22.31, 13.75)

Тем не менее, он дает неправильный ответ для некоторых мест: например, долгота и широта Гонконга, Китай - 114,17 и 22,31, для Гранд-Каньона, США - -112,11 и 36,11, и, наконец, для Бангкока,В Таиланде они составляют 100,50 и 13,75.

На сайте правильно сказано, что Гонконг и Бангкок находятся на расстоянии 1075 миль, а Гонконг и Большой Каньон - 7399 *.1016 * миль. Напротив, мой код говорит, что Гонконг находится на расстоянии 8078 миль от Бангкока и всего на расстоянии 4886 миль от Большого каньона!

Что такоене так с моим кодом?

1 Ответ

2 голосов
/ 05 июня 2019

Вам необходимо преобразовать градусы в радианы.

Расстояние от Гонконга до Гранд-Каньона

geo_distance(114.17*pi/180, -112.11*pi/180, 22.31*pi/180, 36.11*pi/180)

#[1] 7399.113

Также проверить пакет геосферы и функцию distHaversine

HongKong <- c(114.17, 22.31)
GrandCanyon <- c(-112.11, 36.11)

distHaversine(HongKong, GrandCanyon, r=6378137)
#[1] 11914303 distance in metres

distHaversine(HongKong, GrandCanyon, r=3961)
#[1] 7399.113 distance in miles
...