Как перевести широту или долготу в метры? - PullRequest
101 голосов
/ 12 марта 2009

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

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

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

Ответы [ 15 ]

1 голос
/ 02 марта 2013

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

1 голос
/ 12 марта 2009
    '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
0 голосов
/ 24 мая 2018

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

0 голосов
/ 16 апреля 2010

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

0 голосов
/ 24 марта 2010

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

...