Вопрос

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

Это очень легко сделать с помощью типа 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

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

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

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

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

Вы можете получить расстояние между двумя городами с помощью 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

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

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

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

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

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

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

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

Настоящий фокус в том, чтобы получить широту и длину .. для этого я использую Google.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top