Подтвердить что ты не робот

Расчет расстояния между двумя городами

Как вы рассчитываете расстояние между двумя городами?

4b9b3361

Ответ 1

Если вам нужно учитывать кривизну земли, расстояние Великого круга - это то, что вы ищете. Wikipedia статья, вероятно, лучше объясняет, как работает эта формула, чем я, а также this авиационная формальная страница, которая охватывает это более подробно.

Формулы - это только первая часть головоломки, хотя, если вам нужно сделать эту работу для любых городов, вам понадобится база данных местоположений, чтобы получить lat/long. К счастью, вы можете получить это бесплатно от Geonames.org, хотя есть коммерческие db доступны (спросите Google). Итак, в общем, посмотрите два города, которые вы хотите, получите lat/long co-orinates и подключите их к формуле, как в Wikipedia Работающий пример.

Другие предложения:

  • Для полного коммерческого решения, там PC Miler, который используется от многих автотранспортных компаний до рассчитать стоимость доставки.
  • Выполнять вызовы на Google Maps (или другие) api. Если вам нужно делать много запросов в день, подумайте о кешировании результатов на сервере.
  • Также важно рассмотреть вопрос о создании базы данных эквивалентности для городов, пригородов, городов и т.д., если вы считаете, что вам когда-либо понадобится группировать ваши данные. Это становится очень сложным, хотя, возможно, вы не найдете решение для решения всех проблем.

И последнее, но не менее важное: Джоэл написал статью об этой проблеме некоторое время назад, поэтому здесь вы идете: Новая функция: Поиск работы

Ответ 2

Вы используете формулу Haversine.

Ответ 3

Это очень легко сделать с типом географии в SQL Server 2008.

SELECT geography::Point(lat1, lon1, 4326).STDistance(geography::Point(lat2, lon2, 4326))
-- computes distance in meters using eliptical model, accurate to the mm

4326 - SRID для модели эллипсоидальной Земли WGS84

Ответ 4

Вы можете использовать алгоритм A*, чтобы найти кратчайший путь между этими двумя городами, и таким образом вы будете иметь дистанцию.

Ответ 5

Если вы работаете в самолете, и вы хотите Евклидово расстояние "как ворона":

// Cities are points x0,y0 and x1,y1 in kilometers or miles or Smoots[1]
dx = x1 - x0;
dy = y1 - y0;
dist = sqrt(dx*dx + dy*y);

Не требуется тригонометрия! Просто теорема Пифагора и тот факт, что квадраты всегда положительны, поэтому вам не нужно dx = abs (x1 - x0) и т.д. получите положительное число, чтобы перейти к sqrt().

Обратите внимание, что вы, вероятно, могли бы сделать это в одной строке, и компилятор, вероятно, уменьшил бы его эквивалентный код выше:

dist = sqrt((x1-x0)*(x1-x0) + (y1-y0)*(y1-y0));

[1] http://en.wikipedia.org/wiki/Smoot

Ответ 6

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

Ответ 7

Вы можете получить расстояние между двумя городами из google map api. Вот реализация его в Python

#!/usr/bin/python
import requests
from sys import argv 
def get_distance(origin,destination):
    gmap='http://maps.googleapis.com/maps/api/distancematrix/json'
    payload={"origins":origin,"destinations":destination,"sensor":'false' }
    try:
        a=requests.get(gmap,params=payload)
        data = a.json()
        origin = str(data['origin_addresses'][0])
        destination= str(data['destination_addresses'][0])
        distance = data['rows'][0]['elements'][0]['distance']['text']
        return distance,origin,destination
    except Exception,e:
        print "The %s or %destination does not exists :(" %(origin,destination)
        exit()

if __name__=="__main__":
    if len(argv)<3:
        print "sorry Check the format"
    else:
        origin=argv[1]
        destination=argv[2]
        distance,origin,destination=get_distance(origin,destination)
        print "%s ---> %s    :   %s" %(origin,destination,distance)

Пример ссылки: https://gist.github.com/sarathsp06/cf063e47bcc515b51c84

Ответ 8

Вы найдете Lat/Lon города, затем используйте алгоритм оценки расстояния для координат Lat/Lon.

Ответ 9

если вам нужен пример кода, я думаю, что у меня есть один, который я мог бы выкопать дома, но, как и многие предыдущие ответы, вам нужно использовать long/lat db для расчета

Ответ 10

Лучше использовать справочную таблицу для получения расстояния между двумя городами.

Это имеет смысл, потому что * Формула для вычисления расстояния ais достаточно вычислительно интенсивна.. * Расстояние между городами вряд ли изменится.

Поэтому, если вам не очень нужны (например, отображение местности с помощью спутника или какой-либо алгоритм топографии или что-то еще), вы должны просто сохранить список городов и расстояний между ними, в таблицу и посмотреть ее по мере необходимости.

Ответ 11

Недавно я много работал с этим. Я нахожу, что новые возможности SQL2008 действительно облегчают это. Я могу найти все точки, которые имеют Xkm стоп-записи 100 000 в суб-второй раз... не слишком потрепанный.

Метод большого круга (сферическое предположение) в моем тестировании был примерно в 2,5 милях от по сравнению с формулой vincenty (элипсоидальное предположение, которое является землей).

Реальный трюк - это получение lat и long..for того, что я использую Google.

Ответ 12

@Jared - незначительная поправка к вашему примеру кода. Последняя строка первого примера кода должна выглядеть следующим образом:

dist = sqrt(dx*dx + dy*dy);

Ответ 13

Я согласен, что как только у вас будет информация, если она не изменится, сохраните ее как-то. @Marko Tinto Спасибо за образец T-SQL. Для тех, кто не имеет доступа к SQL Server или предпочитает другой метод: если вам нужна высокая точность, посмотрите запись в Википедии по алгоритму Винченти для больше информации. Я считаю, что есть реализация js, которая (если не была) легко перенесена на другие языки. Кроме того, внизу этой страницы есть ссылка на geographicLib, которая на 1000 раз точнее, чем алгоритм Винченти (если вы есть данные, что хорошо, это может иметь значение).

Почему вы используете что-то вроде метода Винценти? Поскольку земля не является идеальной сферой, и подобные методы позволяют вводить более точную основную и вспомогательную ось для моделирования Земли.

Ответ 14

Я использую distancy так просто и чисто