Wie rechne ich Längen- oder Breitengrade in Meter um?


125

Wenn ich einen Längen- oder Breitengrad im Standard-NMEA-Format habe, gibt es eine einfache Möglichkeit / Formel, diesen Messwert in Meter umzuwandeln, die ich dann in Java (J9) implementieren kann?

Bearbeiten: Ok scheint, was ich tun möchte, ist nicht einfach möglich , aber was ich wirklich tun möchte, ist:

Angenommen, ich habe einen Lat- und Long-Wegpunkt und einen Lat- und Long-Weg eines Benutzers. Gibt es eine einfache Möglichkeit, diese zu vergleichen, um zu entscheiden, wann dem Benutzer mitgeteilt werden soll, dass er sich in angemessener Entfernung vom Wegpunkt befindet? Mir ist klar, dass das Thema vernünftig ist, aber ist das leicht machbar oder immer noch übermäßig mathematisch?



1
Was meinst du mit der Umrechnung von Lat / Long in Meter? Meter von wo? Suchen Sie nach einer Möglichkeit, die Entfernung entlang der Erdoberfläche von einer Koordinate zur anderen zu berechnen?
Baltimark

2
Definieren Sie "Wegpunkt". Definieren Sie "vernünftig". Wollen Sie das wirklich wissen: "Wie berechnen Sie den Abstand zwischen zwei Punkten aufgrund ihrer Breite und Länge?"
Baltimark

2
Ich bin auf diese Frage gestoßen, als ich SQL-Abfragen zu Längen- und Breitengraden durchführen wollte, und habe diesen großartigen Artikel mit etwas Java-Code unten gefunden. Es könnte dich auch interessieren.
Kristof Van Landschoot

Antworten:


171

Hier ist eine Javascript-Funktion:

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
}

Erläuterung: https://en.wikipedia.org/wiki/Haversine_formula

Die Haversine-Formel bestimmt den Großkreisabstand zwischen zwei Punkten auf einer Kugel aufgrund ihrer Längen- und Breitengrade.


2
Für diejenigen, die nach einer Bibliothek suchen, die zwischen wgs und utm konvertiert werden kann: github.com/urbanetic/utm-converter
Aram Kocharyan

3
Wäre wirklich dankbar, wenn jemand einige erklärende Kommentare zum obigen Code hinzufügen könnte. Danke im Voraus!
Ravindranath Akila

Fand dies, von dem dieser Kommentar eine Annahme zu sein scheint. Der Link sagt auch, dass er auf diesem Artikel zur Entfernungsberechnung basiert . Alle unbeantworteten Fragen finden Sie im ursprünglichen Link. :)
Joachim

62

Wenn Sie nach einer einfachen Formel suchen, ist dies wahrscheinlich der einfachste Weg, vorausgesetzt, die Erde ist eine Kugel mit einem Umfang von 40075 km.

Länge in Metern von 1 ° Breitengrad = immer 111,32 km

Länge in Metern von 1 ° Längengrad = 40075 km * cos (Breitengrad) / 360


2
Wie funktioniert die Längengradgleichung? Bei einem Breitengrad von 90 Grad würde man erwarten, dass es in der Nähe von 111 km angezeigt wird. aber stattdessen zeigt es 0; In ähnlicher Weise sind auch Werte in der Nähe nahe 0.
Reece

9
Der Breitengrad beträgt 0 ° am Äquator und 90 ° am Pol (und nicht das Gegenteil). Für den Äquator ergibt die Formel 40075 km * cos (0 °) / 360 = 111 km. Für die Stange ergibt die Formel 40075 * cos (90 °) / 360 = 0 km.
Ben

Ich denke, dieser Ansatz ist einfach, zumal die Frage nicht nach dem genauen Abstand zwischen zwei Punkten gefragt hat, sondern ob sie "ziemlich nahe genug" sind. Mit diesen Formeln können wir leicht überprüfen, ob sich der Benutzer innerhalb eines auf dem Wegpunkt zentrierten Quadrats befindet . Es ist viel einfacher, nach einem Quadrat zu suchen als nach einem Kreis.
Ben

29

Für die Annäherung kurzer Abstände zwischen zwei Koordinaten habe ich Formeln von http://en.wikipedia.org/wiki/Lat-lon verwendet :

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

.

Im folgenden Code habe ich die Rohzahlen belassen, um ihre Beziehung zur Formel aus Wikipedia zu zeigen.

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) );

Der Wikipedia-Eintrag besagt, dass die Entfernungsberechnungen für 100 km in Längsrichtung innerhalb von 0,6 m und für 100 km in Längsrichtung innerhalb von 1 cm liegen. Ich habe dies jedoch nicht überprüft, da die Genauigkeit für meine Verwendung in der Nähe liegt.


3
Beachten Sie, dass die Wikipedia-Seite 2017 eine andere (verfeinerte) Formel enthält.
Gorka Llona

3
Ja, die Formel in Wikipedia ist etwas anders, aber es scheint, dass die andere Wikipedia- Formel auf den ähnlichen Ergebnissen dieser großartigen SO-Antwort basiert , bei der tatsächlich jemand die Berechnungen durchlaufen hat.
not2qubit

10

Breiten- und Längengrade geben Punkte an, nicht Entfernungen, daher ist Ihre Frage etwas unsinnig. Wenn Sie nach der kürzesten Entfernung zwischen zwei (lat, lon) Punkten fragen, lesen Sie diesen Wikipedia-Artikel über Großkreisentfernungen.


9
Er spricht über referentielle Konvertierung, so dass Ihre Antwort nicht auf den Punkt kommt (kein Wortspiel beabsichtigt)
Paulo Neves

1
Und als Referenz eine Konvertierungsanleitung für die Bezugstransformation von GPS-Positionen. www.microem.ru/pages/u_blox/tech/dataconvert/GPS.G1-X-00006.pdf
Paulo Neves

2
Er möchte wissen, wie viele Grad pro Meter, damit er Abstand zwischen 2 Punkten finden kann. Zwischen den Zeilen lesen.
theAnonymous

1
und Ihre Antwort ist viel unsinniger
jerinho.com

7

Es gibt viele Tools, die dies vereinfachen. Weitere Informationen zu den Themen finden Sie in der Antwort von Monjardin .

Dies ist jedoch nicht unbedingt schwierig. Es hört sich so an, als würden Sie Java verwenden, daher würde ich empfehlen, sich mit etwas wie GDAL zu befassen . Es bietet Java-Wrapper für ihre Routinen und verfügt über alle Tools, die zum Konvertieren von Lat / Lon (geografische Koordinaten) in UTM (projiziertes Koordinatensystem) oder eine andere vernünftige Kartenprojektion erforderlich sind.

UTM ist schön, weil es Messgeräte sind, mit denen man so einfach arbeiten kann. Sie müssen jedoch die entsprechende UTM-Zone erhalten, damit sie gute Arbeit leistet. Es gibt einige einfache Codes, die per Googeln verfügbar sind, um eine geeignete Zone für ein Lat / Long-Paar zu finden.


7

Die Erde ist eine störend unregelmäßige Oberfläche, daher gibt es keine einfache Formel, um dies genau zu tun. Sie müssen mit einem ungefähren Modell der Erde leben und Ihre Koordinaten darauf projizieren. Das Modell, das ich normalerweise dafür sehe, ist WGS 84 . Dies ist, was GPS-Geräte normalerweise verwenden, um genau das gleiche Problem zu lösen.

NOAA hat einige Software, die Sie herunterladen können, um dies auf ihrer Website zu unterstützen .


6

Hier ist die R-Version der Funktion von bh-s , nur für den Fall:

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

Eine Seemeile (1852 Meter) ist definiert als eine Bogenminute Längengrad am Äquator. Sie müssen jedoch eine Kartenprojektion definieren (siehe auch UTM ), in der Sie daran arbeiten, dass die Konvertierung wirklich Sinn macht.


1
Nein, die Seemeile ist nach internationalem Standard ( v en.wikipedia.org/wiki/Nautical_mile ) auf 1852 m festgelegt. Seine Beziehung zur Messung eines Bogens auf der Oberfläche eines Sphäroids wie der Erde ist jetzt sowohl historisch als auch ungefähr.
Hochleistungsmarke


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

Ich sehe, der Link ist voll von kaputten.
Tshepang

1

Um Breiten- und Längengrade in x- und y-Darstellungen umzuwandeln, müssen Sie entscheiden, welche Art von Kartenprojektion verwendet werden soll. Elliptical Mercator scheint mir sehr gut zu sein. Hier finden Sie eine Implementierung (auch in Java).


0

Wenn es ausreichend nah ist, können Sie davonkommen, indem Sie sie als Koordinaten auf einer flachen Ebene behandeln. Dies funktioniert beispielsweise auf Straßen- oder Stadtebene, wenn keine perfekte Genauigkeit erforderlich ist und Sie lediglich eine grobe Schätzung der Entfernung benötigen, um sie mit einem beliebigen Grenzwert zu vergleichen.


3
Nein, das geht nicht! Der x-Abstand in m ist für verschiedene Breitengradwerte unterschiedlich. Am Äquator könnten Sie damit davonkommen, aber je näher Sie den Polen kommen, desto extremer werden Ihre Ellipsoide.
RickyA

3
Ihr Kommentar ist zwar vernünftig, beantwortet jedoch nicht die Frage des Benutzers nach der Umrechnung der Lat / Lng-Differenz in Meter.
JivanAmara

0

Basierend auf der durchschnittlichen Entfernung für Degress in der Erde.

1 ° = 111 km;

Wenn Sie dies für Bogenmaß umrechnen und für Meter dividieren, nehmen Sie eine magische Zahl für den RAD in Metern: 0,000008998719243599958;

dann:

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

3
Endlich eine einfache Antwort :)
Ben Hutchison

Was ist, wenn der Breitengrad -179 und der andere 179 ist, sollte der x-Abstand 2 Grad statt 358 sein
OMGPOP

7
Verwenden Sie diese Antwort nicht (aus irgendeinem Grund ist sie positiv bewertet). Es gibt keine einzige Skalierung zwischen Längengrad und Entfernung. Die Erde ist nicht flach.
CPBL

1
Ich glaube, es ist 111.1
Abel Callejo

6
Beachten Sie, dass ein Längengrad am Äquator 111 km beträgt, in anderen Breiten jedoch weniger. Es gibt eine einfache Näherungsformel, um die Länge in km von 1 ° Längengrad in Abhängigkeit vom Breitengrad zu ermitteln: 1 ° Längengrad = 40000 km * cos (Breitengrad) / 360 (und natürlich 111 km für Breitengrad = 90 °). Beachten Sie auch, dass 1 ° Längengrad fast immer eine andere Entfernung ist als 1 ° Breitengrad.
Ben

-1

Wenn Sie eine einfache Lösung wünschen, verwenden Sie die Haversine-Formel, wie in den anderen Kommentaren beschrieben. Wenn Sie eine genauigkeitsempfindliche Anwendung haben, denken Sie daran, dass die Haversine-Formel keine Genauigkeit von mehr als 0,5% garantiert, da davon ausgegangen wird, dass die Erde eine Kugel ist. Um zu betrachten, dass die Erde ein abgeflachter Sphäroid ist, sollten Sie Vincentys Formeln verwenden . Außerdem bin ich mir nicht sicher, welchen Radius wir mit der Haversine-Formel verwenden sollen: {Äquator: 6.378,137 km, Polar: 6.356,752 km, Volumen: 6.371,0088 km}.


it is assuming the earth is a circle^^ Einige seltsame Leute machen das heutzutage ... aber was du meinst ist wahrscheinlich eher it is assuming the earth is a sphere;)
derHugo

-2

Sie müssen die Koordinaten in Bogenmaß konvertieren, um die sphärische Geometrie zu erstellen. Nach der Konvertierung können Sie einen Abstand zwischen den beiden Punkten berechnen. Die Entfernung kann dann in ein beliebiges Maß umgewandelt werden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.