Вопрос

Как рассчитать расстояние между двумя координатами 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 дюйма) на Земле. эллипсоид.

И.Относительно метода "панировочных сухарей"

  1. Радиус Земли на разных широтах разный.Это необходимо учитывать в алгоритме Хаверсина.
  2. Рассмотрите возможность замены подшипника, при котором прямые линии превращаются в арки (которые длиннее).
  3. Учет изменения скорости превратит арки в спирали (которые длиннее или короче арок)
  4. При изменении высоты плоские спирали превращаются в трехмерные (которые снова становятся длиннее).Это очень важно для холмистой местности.

Ниже представлена функция на языке C, учитывающая # 1 и # 2:

родовое слово

II.Есть более простой способ, который дает довольно хорошие результаты.

По средней скорости.

Trip_distance= Trip_average_speed * Trip_time

Поскольку скорость GPS определяется эффектом Доплера и не связана напрямую с [долгота, широта], ее можно, по крайней мере, рассматривать как вторичный (резервный или корректирующий), если не как основной метод расчета расстояния.

Если вы используете .NET, не сдавайтесь.См. System.Device.Location .Отметьте fnx в комментариях в другом ответе .

родовое слово

Этот код Lua адаптирован из материалов, найденных в Википедии и в инструменте GPSbabel Роберта Липе: родовое слово

родовое слово

Это версия от "Генри Вилинского", адаптированная для MySQL и Километров:

родовое слово

вот реализация Swift из ответа

родовое слово

Думаю, вам нужно, чтобы оно было по кривизне Земли.Ваши две точки и центр Земли находятся на плоскости.Центр Земли - это центр круга на этой плоскости, и две точки находятся (примерно) по периметру этого круга.Исходя из этого, вы можете рассчитать расстояние, узнав, какой угол между одной точкой и другой.

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

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

вы можете найти реализацию этого (с хорошим объяснением) в F # на fssnip

вот важные части:

родовое слово

Мне нужно было реализовать это в PowerShell, надеюсь, это поможет кому-то другому. Некоторые примечания об этом методе

  1. Не разделяйте строки, иначе расчет будет неверным.
  2. Чтобы вычислить в километрах, удалите * 1000 при расчете расстояния $
  3. Измените $ earthsRadius= 3963.19059 и удалите * 1000 при вычислении $ distance the, чтобы вычислить расстояние в милях.
  4. Я использую 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

Алгоритм Хаверсина.

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