Рассчитать расстояние между двумя координатами GPS
-
21-08-2019 - |
Вопрос
Как рассчитать расстояние между двумя координатами GPS (используя широту и долготу)?
Решение
Рассчитайте расстояние между двумя координатами по широте и долготе , включаяреализация Javascript.
Запад и Юг отрицательны. Помните, что минуты и секунды выходят из 60, поэтому S31 30 'составляет -31,50 градусов.
Не забудьте преобразовать градусы в радианы .Эта функция есть во многих языках.Или его простой расчет: сгенерировать код кода.
родовое словоВот несколько примеров использования:
<цитата>distanceInKmBetweenCoordinates (0,0,0,0) // Расстояние между одинаковыми точками должно быть 0 0 distanceInKmBetweenCoordinates (51.5, 0, 38.8, -77.1) // Из Лондона в Арлингтон 5918.185064088764
Другие советы
Ищите в Google небрежность;вот мое решение:
родовое словоВерсия Haversine для C #
родовое словоВот это .NET Fiddle , так что вы можете проверить его со своими собственными долгими и долгими числами.
Это очень просто сделать с типом geography в SQL Server 2008.
родовое слово4326 - это SRID для эллипсоидальной модели Земли WGS84
Java-версия алгоритма Хаверсина на основе ответа Романа Макарова на эту тему
родовое словоЭто зависит от того, насколько он вам нужен. Если вам нужна максимальная точность, лучше всего взглянуть на алгоритм, использующий эллипсоид, а не сферу, например алгоритм Винсенти, который имеет точность до миллиметров. http://en.wikipedia.org/wiki/Vincenty%27s_algorithm
Вот функция Хаверсина в Python, которую я использую:
родовое словоВот он в C # (широта и долгота в радианах):
родовое словоЕсли широта и долгота указаны в градусах, разделите их на 180 / PI для преобразования в радианы.
Версия PHP:
(Удалите весь кодовый код-код, если ваши координаты уже указаны в радианах.)
родовое словоМне нужно было рассчитать большое расстояние между точками в моем проекте, поэтому я пошел дальше и попытался оптимизировать код, который нашел здесь.В среднем моя новая реализация в разных браузерах работает в 2 раза быстрее , чем ответ, получивший наибольшее количество голосов.
родовое словоВы можете поиграть с моим jsPerf и увидеть результаты здесь .
Недавно мне нужно было сделать то же самое на python, поэтому вот реализация на python :
родовое словоИ для полноты картины: Haversine в вики.
Функция T-SQL, которую я использую для выбора записей по расстоянию для центра
родовое словоЕсли вам нужно что-то более точное, попробуйте это . <цитата>
Формулы Винсенти - это два связанных итерационных метода, используемых в геодезии. для расчета расстояния между двумя точками на поверхности сфероид, разработанный Таддеусом Винсенти (1975a). Они основаны на предположение, что фигура Земли представляет собой сплюснутый сфероид, и следовательно, более точны, чем такие методы, как расстояние по дуге большого круга которые предполагают сферическую Землю.
Первый (прямой) метод вычисляет местоположение точки, которая является заданное расстояние и азимут (направление) от другой точки.Секунда (обратный) метод вычисляет географическое расстояние и азимут между двумя заданными точками.Они получили широкое распространение в геодезии. потому что они имеют точность 0,5 мм (0,020 дюйма) на Земле. эллипсоид.
И.Относительно метода "панировочных сухарей"
- Радиус Земли на разных широтах разный.Это необходимо учитывать в алгоритме Хаверсина.
- Рассмотрите возможность замены подшипника, при котором прямые линии превращаются в арки (которые длиннее).
- Учет изменения скорости превратит арки в спирали (которые длиннее или короче арок)
- При изменении высоты плоские спирали превращаются в трехмерные (которые снова становятся длиннее).Это очень важно для холмистой местности.
Ниже представлена функция на языке C, учитывающая # 1 и # 2:
родовое словоII.Есть более простой способ, который дает довольно хорошие результаты.
По средней скорости.
Trip_distance= Trip_average_speed * Trip_time
Поскольку скорость GPS определяется эффектом Доплера и не связана напрямую с [долгота, широта], ее можно, по крайней мере, рассматривать как вторичный (резервный или корректирующий), если не как основной метод расчета расстояния.
Если вы используете .NET, не сдавайтесь.См. System.Device.Location .Отметьте fnx в комментариях в другом ответе .
родовое словоЭтот код Lua адаптирован из материалов, найденных в Википедии и в инструменте GPSbabel Роберта Липе: родовое слово
Это версия от "Генри Вилинского", адаптированная для MySQL и Километров:
родовое слововот реализация Swift из ответа
родовое словоДумаю, вам нужно, чтобы оно было по кривизне Земли.Ваши две точки и центр Земли находятся на плоскости.Центр Земли - это центр круга на этой плоскости, и две точки находятся (примерно) по периметру этого круга.Исходя из этого, вы можете рассчитать расстояние, узнав, какой угол между одной точкой и другой.
Если точки имеют разную высоту или нужно учитывать, что Земля не является идеальной сферой, это становится немного сложнее.
Мне недавно пришлось сделать то же самое.Я обнаружил, что этот веб-сайт очень полезен, объясняет сферический триггер с примерами, которые легко отслеживать вместе с.
вы можете найти реализацию этого (с хорошим объяснением) в F # на fssnip
вот важные части:
родовое словоМне нужно было реализовать это в PowerShell, надеюсь, это поможет кому-то другому. Некоторые примечания об этом методе
- Не разделяйте строки, иначе расчет будет неверным.
- Чтобы вычислить в километрах, удалите * 1000 при расчете расстояния $
- Измените $ earthsRadius= 3963.19059 и удалите * 1000 при вычислении $ distance the, чтобы вычислить расстояние в милях.
-
Я использую Haversine, поскольку в других сообщениях указывается, что формулы Винсенти намного точнее
Function MetresDistanceBetweenTwoGPSCoordinates($latitude1, $longitude1, $latitude2, $longitude2) { $Rad = ([math]::PI / 180); $earthsRadius = 6378.1370 # Earth's Radius in KM $dLat = ($latitude2 - $latitude1) * $Rad $dLon = ($longitude2 - $longitude1) * $Rad $latitude1 = $latitude1 * $Rad $latitude2 = $latitude2 * $Rad $a = [math]::Sin($dLat / 2) * [math]::Sin($dLat / 2) + [math]::Sin($dLon / 2) * [math]::Sin($dLon / 2) * [math]::Cos($latitude1) * [math]::Cos($latitude2) $c = 2 * [math]::ATan2([math]::Sqrt($a), [math]::Sqrt(1-$a)) $distance = [math]::Round($earthsRadius * $c * 1000, 0) #Multiple by 1000 to get metres Return $distance }
Версия Scala
родовое словоЯ взял верхний ответ и использовал его в программе Scala
родовое словоЯ каррировал функцию, чтобы иметь возможность легко создавать функции, которые имеют одно из двух положений фиксированное и требуют только пары широты / долготы для определения расстояния.
// Может быть, опечатка?
У нас есть неиспользуемая переменная dlon в GetDirection,
Я предполагаю
должно быть
родовое словоВот моя реализация в Эликсире
родовое словоВерсия Dart
Алгоритм Хаверсина.
родовое слово