Android: как узнать расстояние между двумя географическими координатами? - PullRequest
5 голосов
/ 03 июня 2010

Я использовал этот запрос URL

http://maps.google.com/maps?q=from+A+to+B&output=kml

, который дан в ответе на этот вопрос . Но после того, как я попробовал, он не работает с координатами. Работает с адресными именами tho. Я думаю, что я мог бы использовать геокодирование Google, чтобы получить адреса в первую очередь. Но мне интересно, есть ли другой способ пройти расстояние между двумя координатами?

1 Ответ

5 голосов
/ 03 июня 2010

Мой новый ответ:)

Используйте Google Directions API .

Должна быть возможность сделать запрос к http://maps.google.com/maps/api/directions/<json|xml>?<params> и указать координаты в качестве параметров origin и destination. Я кратко попробовал, но он не дал результатов. Вместе с их документами это должно работать, но они не объясняют подробно, как указать широту и долготу. Но они говорят, что это возможно. Цитата:

[...] origin (обязательно) - адрес или текстовое значение широты / долготы , из которого вы хотите рассчитать направления [...]

Тем не менее, это должно начать вас. Я бы предложил использовать выходной формат JSON. Гораздо проще анализировать и использовать меньше полосы пропускания (это менее многословно, как XML).

Работает: Вот пример URL: http://maps.google.com/maps/api/directions/json?origin=49.75332,6.50322&destination=49.71482,6.49944&mode=walking&sensor=false

Мой предыдущий ответ

Расстояние по прямой можно легко определить по формуле Хаверсайна. Если вы извлекаете маршрут из Google, вы можете рассчитать расстояние каждого сегмента и суммировать их.

Некоторое время назад я записал (общеизвестный) алгоритм ( Haversine ) в своем блоге ( python и pl / sql )

Вот копия кода Python:

from math import sin, cos, radians, sqrt, atan2

    def lldistance(a, b):
   """
   Calculates the distance between two GPS points (decimal)
   @param a: 2-tuple of point A
   @param b: 2-tuple of point B
   @return: distance in m
   """
   r = 6367442.5             # average earth radius in m
   dLat = radians(a[0]-b[0])
   dLon = radians(a[1]-b[1])
   x = sin(dLat/2) ** 2 + \
       cos(radians(a[0])) * cos(radians(b[0])) *\
       sin(dLon/2) ** 2
   #original# y = 2 * atan2(sqrt(x), sqrt(1-x))
   y = 2 * asin(sqrt(x))
   d = r * y

   return d

Перевод этого на Java должен быть тривиальным.

...