Berechnung einer gemittelten Breiten- und Längenkoordinate

19

Wie kann ich den Durchschnitt zwischen mehreren Längen- und Breitengraden berechnen?

Soll ich nur den arithmetischen Mittelwert für lat und lng berechnen?

aneuryzm
quelle
3
Ich denke, die Angemessenheit der Mittelwertbildung hängt von Ihrem Anwendungsfall ab. Wenn Sie nur Restaurantstandorte in der Stadt für eine Webkarte gruppieren, funktioniert die Mittelwertbildung die meiste Zeit. An einigen Stellen treten jedoch Fehler auf. Für einen Prototyp oder eine Low-Budget-App ist dies möglicherweise in Ordnung. Wenn Sie jedoch etwas Ernsthafteres tun oder einen weiten Bereich abdecken, müssen Sie wahrscheinlich Projektionsnuancen berücksichtigen.
Glenn
1
Wie wurden diese Punkte gesammelt? Anstatt zu fragen, wie die Koordinaten gemittelt werden sollen, fragen Sie möglicherweise, ob die Mittelwertbildung ein geeigneter Weg ist, um Messfehler zu kompensieren. Dieses eBook enthält viele Fehlerdefinitionen.
Kirk Kuykendall
Nur eine Anmerkung, dass es einige Randfälle gibt, in denen ein "Durchschnittspunkt" nicht genau definiert ist: Beispielsweise könnte irgendwo entlang des Äquators der "Durchschnitt" der Nord- und Südpole liegen.
Dan S.

Antworten:

15

Für einen einfachen Mittelwert möchten Sie die Längen- und Breitengradkoordinaten nicht mitteln. Dies könnte in niedrigeren Breiten ziemlich gut funktionieren, aber in höheren Breiten wird es schlechte Ergebnisse liefern und in der Nähe der Pole vollständig zusammenbrechen.

Die Methode, die ich für diese Art von Dingen verwendet habe, ist die Umwandlung der Längen- / Breitengradkoordinaten in kartesische 3D-Koordinaten (x, y, z). Diese werden gemittelt (um einen kartesischen Vektor zu erhalten) und dann wieder zurück konvertiert. Beachten Sie, dass Sie den Vektor wahrscheinlich nicht normalisieren müssen, sodass der tatsächliche Durchschnittsprozess eine einfache Summe sein kann.


Bearbeiten, hier ist mein -Code:

Das Folgende konvertiert kartesische Koordinaten in Breiten- / Längengrade (in Grad): Entfernen Sie die RAD2DEGKonstanten für das Bogenmaß.

Latitude = MPUtility.RAD2DEG * Math.Atan2(z, Math.Sqrt(x * x + y * y));
Longitude = MPUtility.RAD2DEG * Math.Atan2(-y, x);

Und hier berechnen wir kartesische Koordinaten aus Breite / Länge (angegeben in Bogenmaß):

private void CalcCartesianCoord()
{
    _x = Math.Sin(LatitudeRadians) * Math.Cos(LongitudeRadians);
    _y = Math.Sin(LatitudeRadians) * Math.Sin(LongitudeRadians);
    _z = Math.Cos(LatitudeRadians); 
}

Beide werden aus echtem Code ausgeschnitten und eingefügt, daher die Mischung aus Grad und Bogenmaß. Es gibt hier Eigenschaften, die einige der Konvertierungen durchführen (z. B. LatitudeRadianseine Eigenschaft, die einen Bogenmaßwert zurückgibt).

Beachten Sie, dass eine Optimierung möglich ist, z. B. die doppelten Sinusberechnungen. Auch die Trigger-Berechnungen können möglicherweise zwischengespeichert werden, wenn Sie sie häufig aufrufen.

winwaed
quelle
1
Toller Punkt. Ich kann nicht glauben, dass ich vergessen habe zu erwähnen, dass mich die Mittelung in der Nähe der Pole und der Datumsgrenze schon einmal gebissen hat.
Glenn
3
(+1) Das Problem ist nicht auf die Pole und den Meridian von +180 Grad beschränkt: Wenn die Breiten der zu mittelnden Punkte erheblich variieren, kommt eine gerade Mittelung der Lat / Lon-Koordinaten der Verwendung einer Plate-Carree-Projektion gleich führt eine variable metrische Verzerrung ein, die mit dem Breitengrad zunimmt. Es gibt keine numerischen Probleme, aber der Durchschnitt befindet sich einfach an der falschen Stelle. Aus diesem Grund sind die in @ Glenns Antwort vorgeschlagenen Lat / Lon-Berechnungen mit Ausnahme relativ kleiner unpolarer Regionen selten akzeptabel.
whuber
@winwaed danke, kannst du ein (Java) Code-Snippet oder ein gutes Tutorial vorschlagen, um dies zu tun?
aneuryzm
1
Die Mathematik finden Sie unter en.wikipedia.org/wiki/Spherical_coordinates unter 'Cartesian Coordinates'. (meine Implementierung ist C # und teilweise optimiert - und ich schreibe dies bei den Zahnärzten !!)
winwaed
1
Ich denke, für präzise technische Anwendungsfälle sind Sie sehr korrekt. Wenn jedoch keine extreme Präzision erforderlich ist, funktioniert die Mittelung von WGS84-Breiten-, Längenkoordinaten in Stadt- und sogar Regionalgebieten verdammt gut und liefert Ergebnisse, die für die meisten Verwendungszwecke, in denen eine Mittelung verwendet werden würde, akzeptabel genau sind.
Glenn
3

Clustering-Optionen : Ich denke, das konzeptionelle Schlagwort, das diese Art von Operation abdeckt, ist "Clustering". Die Mittelwertbildung ist bei weitem am einfachsten zu implementieren und funktioniert für die meisten Zwecke gut. Das einzige Mal, dass ich etwas anderes verwenden würde, ist, wenn Sie sich Sorgen über Ausreißer [Bearbeiten] -> oder die Pole oder die internationale Datumsgrenze machen. [Bearbeiten] -> Auch wenn die Mittelung etwas ergibt, das in der Nähe der Mitte des Clusters aussieht, kommt es zu Abweichungen aufgrund von Ungenauigkeiten in der Projektion, die dadurch verursacht werden, dass die Winkelgrade nicht immer gleich groß sind auseinander in km / Meilen. Je größer die durchschnittliche Fläche ist, desto größer ist die Verzerrung.

Hier finden Sie einen Vergleich einiger Clustering-Optionen

Durchschnitt (einfach, am schnellsten, ungenau): Summieren Sie einfach die Lat-Werte und dividieren Sie durch die Zählung und machen Sie dasselbe für die Lng-Werte. Achten Sie darauf, auf Überlauf zu achten, wenn Sie ein Int32 verwenden. Einige Systeme (insbesondere c #) werden stillschweigend auf die niedrigen Werte zurückgesetzt. Sie können diese Fehler vermeiden, indem Sie die Gleitkommapräzision für Ihren Summenakkumulator verwenden. Ein Problem bei dieser Methode ist, dass Ausreißer Ihren Standort verzerren können. [Bearbeiten] -> Eine andere ist, dass Mathe in der Nähe der Pole und der internationalen Datumsgrenze nicht gut im Durchschnitt ist und Standorte schlecht verzerrt.

Nächster Nachbar (etwas härter, langsamer, nicht ausreißerorientiert) Anstatt den Durchschnitt zu berechnen, können Sie den aktuellen Standort mit der geringsten durchschnittlichen Entfernung zu allen Nachbarn verwenden. Dies ist wie ein "Median". Der Nachteil ist, dass dies rechenintensiv ist, da Sie jeden Punkt mit jedem anderen Punkt vergleichen und den Abstand zwischen ihnen berechnen. Zum Beispiel würde das Clustering von 10.000 Punkten 100 Millionen Entfernungsberechnungen erfordern. Nicht so langsam, aber definitiv nicht gut skalierbar.

Grid Cell (benötigt ein wenig mehr Setup, viel schneller, nicht ausreißerbasiert) Dies ähnelt dem nächsten Nachbarn, ist aber viel schneller. Sie können eine beliebige Genauigkeitsstufe auswählen, z. B. 0,01 Grad (was ungefähr 1 km bei bevölkerten Breitengraden entspricht), und Ihre Punkte in Eimern von 0,01 x 0,01 Grad gruppieren. Sie können dann den Eimer mit den meisten Punkten auswählen und entweder den Durchschnitt dieser Punkte ermitteln oder eine Analyse des nächsten Nachbarn nur für diese Punkte durchführen. Ich verwende diese Methode häufig bei sehr großen Datenmengen (Hunderte von Milliarden Datensätzen) und finde, dass sie eine gute Balance zwischen Präzision und Geschwindigkeit darstellt.

Konvexer Rumpfschwerpunkt (harte, langsamere, saubere Ergebnisse): Sie können auch einen Streifen um Ihre Punkte ziehen, um eine Form zu definieren, die alle bedeckt ( siehe Wikipedia ), und dann den Mittelpunkt dieser Form berechnen. Typische Schwerpunktfunktionen sind nicht zentrumsgewichtet, daher müssten Sie eine Art inverse Nachbaranalyse unter Verwendung von Stichprobenpunkten in Ihrer Form durchführen, bis Sie denjenigen gefunden haben, der am weitesten von den Kanten entfernt ist. Diese Methode ist wirklich interessanter, weil der konvexe Rumpf selbst und nicht der eigentliche Algorithmus für die Zentrumsermittlung weder schnell noch besonders präzise ist. Die Rumpfform kann jedoch andere nützliche Anwendungen mit Ihren Daten haben.

Glenn
quelle
@winwaed legt großen Wert auf die Mittelung von Koordinaten in der Nähe der Pole und ich möchte auch die internationale Datumsgrenze hinzufügen. Wenn Sie beispielsweise einen Punkt auf einer Seite und einen auf der anderen Seite haben, erhalten Sie einige schlechte Durchschnittswerte (und auch Begrenzungsrahmen). Das taucht selten auf, aber wenn es so ist, ist es ein echtes Problem zu debuggen
Glenn
@whuber macht einen guten Punkt über Center-Drifting, wenn Sie durchschnittlich sind. Während die Mittelwertbildung etwas ergibt, das in der Nähe der Clustermitte aussieht, ist sie aufgrund von Projektionsungenauigkeiten, die durch die Tatsache verursacht werden, dass die Winkelgrade in km / Meilen nicht immer gleich weit voneinander entfernt sind, etwas abweichend. Je größer die durchschnittliche Fläche ist, desto größer ist die Verzerrung.
Glenn
0

Nicht sicher, was Sie erreichen möchten, aber der Punkt, dessen Breitengrad der Durchschnitt der Längengrade des ursprünglichen Punktsatzes und dessen Längengrad der Durchschnitt der Längengrade des ursprünglichen Punktsatzes ist, ist der Durchschnitt des ursprünglichen Punktsatzes. [UPDATE]: Oben ist avg das arithmetische Mittel.

GuillaumeC
quelle
In Ihrer Antwort ist avg = arithmetisches Mittel?
aneuryzm
1
Ja richtig. Das ist es, was ich für den Mangel an Klarheit entschuldigen wollte. Ich habe die Antwort aktualisiert. Aber ich bin mir nicht sicher, ob ich hier etwas fürchterlich Nützliches auf den Tisch bringe ...
GuillaumeC