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

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

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

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

Ответ 1

Вот функция 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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

Есть много инструментов, которые сделают это легким. Подробнее см. monjardin answer.

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

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

Ответ 7

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

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
}

Ответ 8

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

Ответ 9

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

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

Ответ 10

    '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

Ответ 11

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

Ответ 12

Основываясь на среднем расстоянии для дегрессии на Земле.

1 ° = 111 км;

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

то

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

Ответ 13

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

Ответ 14

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

Ответ 15

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