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

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

Смотрите это связанный вопрос StackOverflow

John D. Cook 19.10.2008 07:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
16
1
14 618
14
Перейти к ответу Данный вопрос помечен как решенный

Ответы 14

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

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

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

если вам нужен пример кода, я думаю, у меня есть один, который я мог бы выкопать дома, но, как и во многих предыдущих ответах, вам нужен 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));

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

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

Ответ принят как подходящий

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

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

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

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

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

Ваша ссылка на JoS устарела (щелкнув ссылку, вы перейдете на страницу с ошибкой). Я считаю, что теперь это правильная ссылка: joelonsoftware.com/items/2006/10/09.html

AgentConundrum 29.07.2009 08:11

Я обновил ссылку и добавил дополнительную информацию.

Dana the Sane 29.07.2009 23:58

В последнее время я много работал с этим. Я считаю, что новые функции 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 это так же просто.

jpmc26 15.10.2016 01:24

Я согласен с тем, что, если у вас есть информация, если она не изменится, сохраните ее как-нибудь. @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

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