Как преобразовать широту или долготу в метры?


127

Если у меня есть показания широты или долготы в стандартном формате NMEA, есть ли простой способ / формула для преобразования этих показаний в метры, которые я затем могу реализовать на Java (J9)?

Изменить: Хорошо, кажется, то, что я хочу сделать, нелегко , однако я действительно хочу сделать следующее:

Скажем, у меня есть широта и долгота точки пути и широта и долгота пользователя, есть ли простой способ сравнить их, чтобы решить, когда сообщить пользователю, что они находятся на достаточно близком расстоянии от точки пути? Я понимаю, что разумное - это предмет, но это легко выполнимо или все еще слишком математически?


2
Вы имеете в виду UTM? en.wikipedia.org/wiki/…
Адриан Арчер,

1
Что вы имеете в виду, переводя широту и долготу в метры? метров откуда? Вы ищете способ вычислить расстояние по поверхности земли от одной координаты до другой?
Baltimark,

2
Определите «путевую точку». Определите «разумный». Это действительно то, что вы хотите знать: «как вы вычисляете расстояние между двумя точками, учитывая их широту и долготу?»
Baltimark,

2
Я наткнулся на этот вопрос, желая выполнить SQL-запросы по широте и долготе, и нашел эту замечательную статью с некоторым кодом Java внизу. Это тоже может вас заинтересовать.
Кристоф Ван Ландсхут, 01

Ответы:


173

Вот функция javascript:

function measure(lat1, lon1, lat2, lon2){  // generally used geo measurement function
    var R = 6378.137; // Radius of earth in KM
    var dLat = lat2 * Math.PI / 180 - lat1 * Math.PI / 180;
    var dLon = lon2 * Math.PI / 180 - lon1 * Math.PI / 180;
    var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
    Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
    Math.sin(dLon/2) * Math.sin(dLon/2);
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    var d = R * c;
    return d * 1000; // meters
}

Пояснение: https://en.wikipedia.org/wiki/Haversine_formula

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


2
Для тех, кто ищет библиотеку для конвертирования между wgs и utm: github.com/urbanetic/utm-converter
Арам Кочарян

3
Был бы очень признателен, если бы кто-нибудь мог добавить некоторые пояснительные комментарии к приведенному выше коду. Заранее спасибо!
Равиндранат Акила

Нашел то, что этот комментарий кажется принятием. Ссылка также говорит, что она основана на этой статье о вычислении расстояния. Поэтому любые оставшиеся без ответа вопросы следует искать в исходной ссылке. :)
Иоахим

Как мне добавить высоту в этот расчет?
dangalg

62

Учитывая, что вы ищете простую формулу, это, вероятно, самый простой способ сделать это, если предположить, что Земля представляет собой сферу с окружностью 40075 км.

Длина в метрах 1 ° широты = всегда 111,32 км.

Длина в метрах 1 ° долготы = 40075 км * cos (широта) / 360


2
Как работает уравнение долготы? с широтой 90 градусов можно ожидать, что он будет показывать около 111 км; но вместо этого он показывает 0; аналогично, значения, близкие к нему, также около 0.
Рис

9
Широта равна 0 ° на экваторе и 90 ° на полюсе (а не наоборот). Для экватора формула дает 40075 км * cos (0 °) / 360 = 111 км. Для полюса формула дает 40075 * cos (90 °) / 360 = 0 км.
Бен

Я думаю, что этот подход прост, особенно потому, что вопрос не требует точного расстояния между двумя точками, а скорее, находятся ли они «достаточно близко». С помощью этих формул мы легко проверяем, находится ли пользователь в пределах квадрата с центром в путевой точке. , Проверить на квадрат гораздо проще, чем на круг.
Бен,

29

Для аппроксимации коротких расстояний между двумя координатами я использовал формулы из http://en.wikipedia.org/wiki/Lat-lon :

m_per_deg_lat = 111132.954 - 559.822 * cos( 2 * latMid ) + 1.175 * cos( 4 * latMid);
m_per_deg_lon = 111132.954 * cos ( latMid );

,

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

double latMid, m_per_deg_lat, m_per_deg_lon, deltaLat, deltaLon,dist_m;

latMid = (Lat1+Lat2 )/2.0;  // or just use Lat1 for slightly less accurate estimate


m_per_deg_lat = 111132.954 - 559.822 * cos( 2.0 * latMid ) + 1.175 * cos( 4.0 * latMid);
m_per_deg_lon = (3.14159265359/180 ) * 6367449 * cos ( latMid );

deltaLat = fabs(Lat1 - Lat2);
deltaLon = fabs(Lon1 - Lon2);

dist_m = sqrt (  pow( deltaLat * m_per_deg_lat,2) + pow( deltaLon * m_per_deg_lon , 2) );

В википедии указано, что расчетное расстояние находится в пределах 0,6 м для 100 км в продольном направлении и 1 см для 100 км по широте, но я не проверял это, поскольку почти такая точность подходит для моего использования.


3
Обратите внимание, что в 2017 году на странице Википедии есть еще одна (кажется, уточненная) формула.
Gorka

3
Да, формула в Википедии немного отличается, но похоже, что другая формула Википедии основана на аналогичных результатах из этого замечательного ответа SO , где кто-то действительно провел вычисления.
not2qubit

10

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


9
Он говорит о ссылочном преобразовании, так что ваш ответ не по делу (каламбур не предназначен)
Пауло Невес

1
И для справки руководство по преобразованию данных для преобразования координат GPS-координат. www.microem.ru/pages/u_blox/tech/dataconvert/GPS.G1-X-00006.pdf
Пауло Невес

2
Он хочет знать, сколько градусов на метр, чтобы найти расстояние между двумя точками. Читай между строк.
theAnonymous

1
и ваш ответ куда более бессмысленный
jerinho.com

7

Есть много инструментов, которые сделают это легко. См . Ответ Монжардена для получения более подробной информации о том, что происходит.

Однако сделать это не обязательно сложно. Похоже, вы используете Java, поэтому я бы порекомендовал изучить что-то вроде GDAL . Он предоставляет java-оболочки для их подпрограмм, и у них есть все инструменты, необходимые для преобразования из широты / долготы (географические координаты) в UTM (систему координат проекции) или другую разумную картографическую проекцию.

UTM хорош тем, что это счетчики, с которыми так легко работать. Однако вам нужно будет получить соответствующую зону UTM, чтобы она работала нормально. Есть несколько простых кодов, доступных через поиск в Google, чтобы найти подходящую зону для пары широта / долгота.


7

Земля - ​​это раздражающе неровная поверхность, поэтому нет простой формулы, чтобы сделать это в точности. Вы должны жить с приблизительной моделью Земли и проецировать на нее свои координаты. Обычно я использую для этого модель WGS 84 . Это то, что обычно используют устройства GPS для решения той же проблемы.

У NOAA есть программное обеспечение, которое вы можете скачать на их веб-сайте, чтобы помочь в этом .


6

Вот на всякий случай R-версия функции bh- :

measure <- function(lon1,lat1,lon2,lat2) {
    R <- 6378.137                                # radius of earth in Km
    dLat <- (lat2-lat1)*pi/180
    dLon <- (lon2-lon1)*pi/180
    a <- sin((dLat/2))^2 + cos(lat1*pi/180)*cos(lat2*pi/180)*(sin(dLon/2))^2
    c <- 2 * atan2(sqrt(a), sqrt(1-a))
    d <- R * c
    return (d * 1000)                            # distance in meters
}

2

Одна морская миля (1852 метра) определяется как одна угловая минута долготы на экваторе. Однако вам необходимо определить проекцию карты (см. Также UTM ), в которой вы работаете, чтобы преобразование действительно имело смысл.


1
Нет, морская миля определена международным стандартом ( v en.wikipedia.org/wiki/Nautical_mile ) как 1852 м. Его связь с измерением дуги на поверхности сфероида, такого как Земля, теперь является исторической и приблизительной.
High Performance Mark

2

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

попробуйте http://www.movable-type.co.uk/scripts/latlong.html, чтобы узнать о некоторых методах и коде на разных языках.


1
    'below is from
'http://www.zipcodeworld.com/samples/distance.vbnet.html
Public Function distance(ByVal lat1 As Double, ByVal lon1 As Double, _
                         ByVal lat2 As Double, ByVal lon2 As Double, _
                         Optional ByVal unit As Char = "M"c) As Double
    Dim theta As Double = lon1 - lon2
    Dim dist As Double = Math.Sin(deg2rad(lat1)) * Math.Sin(deg2rad(lat2)) + _
                            Math.Cos(deg2rad(lat1)) * Math.Cos(deg2rad(lat2)) * _
                            Math.Cos(deg2rad(theta))
    dist = Math.Acos(dist)
    dist = rad2deg(dist)
    dist = dist * 60 * 1.1515
    If unit = "K" Then
        dist = dist * 1.609344
    ElseIf unit = "N" Then
        dist = dist * 0.8684
    End If
    Return dist
End Function
Public Function Haversine(ByVal lat1 As Double, ByVal lon1 As Double, _
                         ByVal lat2 As Double, ByVal lon2 As Double, _
                         Optional ByVal unit As Char = "M"c) As Double
    Dim R As Double = 6371 'earth radius in km
    Dim dLat As Double
    Dim dLon As Double
    Dim a As Double
    Dim c As Double
    Dim d As Double
    dLat = deg2rad(lat2 - lat1)
    dLon = deg2rad((lon2 - lon1))
    a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) + Math.Cos(deg2rad(lat1)) * _
            Math.Cos(deg2rad(lat2)) * Math.Sin(dLon / 2) * Math.Sin(dLon / 2)
    c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a))
    d = R * c
    Select Case unit.ToString.ToUpper
        Case "M"c
            d = d * 0.62137119
        Case "N"c
            d = d * 0.5399568
    End Select
    Return d
End Function
Private Function deg2rad(ByVal deg As Double) As Double
    Return (deg * Math.PI / 180.0)
End Function
Private Function rad2deg(ByVal rad As Double) As Double
    Return rad / Math.PI * 180.0
End Function

Вижу ссылка битая полная.
tshepang 06

1

Чтобы преобразовать широту и долготу в представление x и y, вам необходимо решить, какой тип проекции карты использовать. Мне кажется, что Эллиптический Меркатор очень хорош. Здесь вы можете найти реализацию (в том числе и на Java).


0

Если это достаточно близко, вы можете рассматривать их как координаты на плоской плоскости. Это работает, скажем, на уровне улицы или города, если безупречная точность не требуется, и все, что вам нужно, - это приблизительное предположение о расстоянии, которое нужно сравнить с произвольным пределом.


3
Нет, не работает! Расстояние по оси x в м различно для разных значений широты. На экваторе это может сойти с рук, но чем ближе вы подойдете к полюсам, тем сильнее будут ваши эллипсоиды.
RickyA

3
Хотя ваш комментарий является разумным, он не отвечает на вопрос пользователя о преобразовании разницы в градусах широты и долготы в метры.
JivanAmara

0

На основе среднего расстояния для падения на Земле.

1 ° = 111 км;

Преобразовав это в радианы и разделив на метры, получим магическое число для RAD в метрах: 0,000008998719243599958;

затем:

const RAD = 0.000008998719243599958;
Math.sqrt(Math.pow(lat1 - lat2, 2) + Math.pow(long1 - long2, 2)) / RAD;

3
наконец, прямой ответ :)
Бен Хатчисон

что, если широта -179, а другая - 179, расстояние по x должно быть 2 градуса вместо 358
OMGPOP

7
Не используйте этот ответ (по какой-то причине за него проголосовали). Между долготой и расстоянием нет единой шкалы; Земля не плоская.
CPBL

1
Я считаю, что это 111,1
Абель Каллехо

6
Обратите внимание, что один градус долготы составляет 111 км на экваторе, но меньше для других широт. Существует простая приближенная формула, чтобы найти длину в км 1 ° долготы в зависимости от широты: 1 ° долготы = 40000 км * cos (широта) / 360 (и, конечно, это дает 111 км для широты = 90 °). Также обратите внимание, что 1 ° долготы почти всегда отличается от 1 ° широты.
Бен

-1

Если вам нужно простое решение, используйте формулу Хаверсина, как указано в других комментариях. Если у вас есть приложение, чувствительное к точности, имейте в виду, что формула Хаверсина не гарантирует точность выше 0,5%, поскольку предполагает, что Земля представляет собой сферу. Чтобы считать, что Земля представляет собой сплюснутый сфероид, рассмотрите возможность использования формул Винсенти . Кроме того, я не уверен, какой радиус мы должны использовать с формулой Хаверсина: {Экватор: 6 378,137 км, Полярный: 6 356,752 км, Объемный: 6 371,0088 км}.


it is assuming the earth is a circle^^ Некоторые странные люди делают это в наши дни ... но то, что вы имеете в виду, скорее всего it is assuming the earth is a sphere;)
derHugo

-2

Вам нужно преобразовать координаты в радианы, чтобы получить сферическую геометрию. После преобразования вы можете рассчитать расстояние между двумя точками. Затем расстояние можно преобразовать в любую нужную меру.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.