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

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


person Krishna Kumar    schedule 22.08.2008    source источник
comment
См. Этот вопрос, связанный с StackOverflow   -  person John D. Cook    schedule 19.10.2008


Ответы (14)


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

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

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

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

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

person Dana the Sane    schedule 22.08.2008
comment
Ваша ссылка на JoS устарела (щелкнув ссылку, вы перейдете на страницу с ошибкой). Я считаю, что теперь это правильная ссылка: joelonsoftware.com/items/2006/10 /09.html - person AgentConundrum; 29.07.2009
comment
Я обновил ссылку и добавил дополнительную информацию. - person Dana the Sane; 29.07.2009

Вы используете формулу Хаверсина.

person Ian Nelson    schedule 22.08.2008

Это очень просто сделать с типом geography в 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.

person Marko Tintor    schedule 01.02.2009
comment
В PostGIS это так же просто. - person jpmc26; 15.10.2016

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

person Michał Piaskowski    schedule 22.08.2008

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

person Mike Powell    schedule 22.08.2008

Если вы работаете в самолете и хотите, чтобы Евклидово расстояние «по прямой»:

// 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

person Jared Updike    schedule 22.08.2008

Вы можете получить расстояние между двумя городами из API карты Google. Вот его реализация на 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

person Sarath Sadasivan Pillai    schedule 25.06.2014

Вы находите широту и долготу города, а затем используете алгоритм оценки расстояния для координат широты и долготы.

person EndangeredMassa    schedule 22.08.2008

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

person jonezy    schedule 22.08.2008

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

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

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

person Pascal    schedule 22.08.2008

В последнее время я много работал с этим. Я считаю, что новые функции SQL2008 действительно упрощают эту задачу. Я могу найти все точки, которые находятся в пределах X км таблицы записей 100k за менее чем секунды ... не так уж плохо.

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

Настоящая уловка - получить широту и долготу ... для этого я использую Google.

person Webjedi    schedule 22.08.2008

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

dist = sqrt(dx*dx + dy*dy);
person Josh Brown    schedule 22.08.2008

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

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

person Stonetip    schedule 08.03.2011

я использую удаленность, так просто и чисто

person user1436185    schedule 04.06.2012