




Вы находите широту и долготу города, а затем используете алгоритм оценки расстояния для координат широты и долготы.
Вы используете Формула гаверсина.
Вы можете использовать алгоритм А *, чтобы найти кратчайший путь между этими двумя городами, и таким образом у вас будет расстояние.
если вам нужен пример кода, я думаю, у меня есть один, который я мог бы выкопать дома, но, как и во многих предыдущих ответах, вам нужен long / lat db для выполнения расчета
Для определения расстояния между двумя городами лучше использовать справочную таблицу.
Это имеет смысл, потому что * Формула для расчета расстояния 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));
Если вы говорите о кратчайшем расстоянии между двумя реальными городами на реальной сферической планете, такой как Земля, вам нужен расстояние по большому кругу.
Если вам нужно принять во внимание кривизну земли, расстояние по Большому кругу - это то, что вам нужно. Статья в Википедии, вероятно, лучше меня объясняет, как работает формула, чем я, и есть также эта страница авиационного формуляра, который описывает это более подробно.
Формулы - это только первая часть головоломки, если вам нужно сделать это для произвольных городов, вам понадобится база данных местоположений, чтобы получить широту / долготу. К счастью, вы можете получить это бесплатно от Geonames.org, хотя есть коммерческие базы данных (спросите в Google). Итак, в общем, найдите два города, которые вы хотите, получите координаты широты и долготы и вставьте их в формулу, как в Пример работы из Википедии.
Другие предложения:
И последнее, но не менее важное: Джоэл недавно написал статью об этой проблеме, так что готово: Новая функция: поиск работы
Ваша ссылка на JoS устарела (щелкнув ссылку, вы перейдете на страницу с ошибкой). Я считаю, что теперь это правильная ссылка: joelonsoftware.com/items/2006/10/09.html
Я обновил ссылку и добавил дополнительную информацию.
В последнее время я много работал с этим. Я считаю, что новые функции SQL2008 действительно упрощают эту задачу. Я могу найти все точки, которые находятся в пределах X км таблицы записей 100k за менее чем секунды ... не так уж плохо.
Метод большого круга (сферическое предположение) в моем тестировании был примерно в 2,5 милях по сравнению с формулой Винсенти (предположение о эллипсоиде, которым и является Земля).
Настоящая уловка - получить широту и долготу ... для этого я использую Google.
@Jared - небольшая поправка к вашему примеру кода. Последняя строка первого примера кода должна гласить:
dist = sqrt(dx*dx + dy*dy);
Это очень просто сделать с типом 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.
В PostGIS это так же просто.
Я согласен с тем, что, если у вас есть информация, если она не изменится, сохраните ее как-нибудь. @Marko Tinto Спасибо за образец T-SQL. Для тех, кто не имеет доступа к SQL Server или предпочитает другой метод: если вам нужна высокая точность, ознакомьтесь с Запись в Википедии об алгоритме Винсенти для получения дополнительной информации. Я считаю, что существует реализация js, которую (если еще не было) легко портировать на другие языки. Кроме того, внизу этой страницы есть ссылка на geographicLib, который претендует на то, чтобы быть в 1000 раз более точным, чем алгоритм Винсенти (если у вас есть такие хорошие данные, это может иметь значение).
Зачем вам использовать что-то вроде метода Винсенти? Поскольку Земля не является идеальной сферой, и подобные методы позволяют вводить более точные большие и малые оси для моделирования Земли.
я использую отдаленность так просто и чисто
Вы можете получить расстояние между двумя городами из 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
Смотрите это связанный вопрос StackOverflow