Wie kann ich den Durchschnitt zwischen mehreren Längen- und Breitengraden berechnen?
Soll ich nur den arithmetischen Mittelwert für lat und lng berechnen?
Wie kann ich den Durchschnitt zwischen mehreren Längen- und Breitengraden berechnen?
Soll ich nur den arithmetischen Mittelwert für lat und lng berechnen?
Antworten:
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 C # -Code:
Das Folgende konvertiert kartesische Koordinaten in Breiten- / Längengrade (in Grad): Entfernen Sie die RAD2DEG
Konstanten 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. LatitudeRadians
eine 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.
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.
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.