Wie kann ich bei einer Reihe von Breiten- und Längengraden die Breite und Länge des Mittelpunkts dieser Menge berechnen (auch bekannt als ein Punkt, der eine Ansicht auf alle Punkte zentrieren würde)?
EDIT: Python-Lösung, die ich verwendet habe:
Convert lat/lon (must be in radians) to Cartesian coordinates for each location.
X = cos(lat) * cos(lon)
Y = cos(lat) * sin(lon)
Z = sin(lat)
Compute average x, y and z coordinates.
x = (x1 + x2 + ... + xn) / n
y = (y1 + y2 + ... + yn) / n
z = (z1 + z2 + ... + zn) / n
Convert average x, y, z coordinate to latitude and longitude.
Lon = atan2(y, x)
Hyp = sqrt(x * x + y * y)
Lat = atan2(z, hyp)
math
latitude-longitude
geo
Zeke
quelle
quelle
z
, bitte?Antworten:
Der einfache Ansatz, sie nur zu mitteln, hat seltsame Randfälle mit Winkeln, wenn sie von 359 'zurück auf 0' gewickelt werden.
In einer viel früheren Frage zu SO wurde nach dem Durchschnitt eines Satzes von Kompasswinkeln gefragt.
Eine Erweiterung des dort empfohlenen Ansatzes für sphärische Koordinaten wäre:
quelle
Vielen Dank! Hier ist eine C # -Version der OP-Lösungen mit Grad. Es verwendet die System.Device.Location.GeoCoordinate- Klasse
quelle
Ich fand diesen Beitrag sehr nützlich, daher hier die Lösung in PHP. Ich habe dies erfolgreich verwendet und wollte nur einen anderen Entwickler etwas Zeit sparen.
quelle
Sehr nützlicher Beitrag! Ich habe dies in JavaScript implementiert, hiermit meinen Code. Ich habe das erfolgreich genutzt.
quelle
Javascript-Version der ursprünglichen Funktion
quelle
Im Interesse einer möglichen Einsparung von ein oder zwei Minuten ist hier die Lösung, die in Objective-C anstelle von Python verwendet wurde. Diese Version verwendet ein NSArray von NSValues, die MKMapCoordinates enthalten, was in meiner Implementierung gefordert wurde:
quelle
<GLKit/GLKMath.h>
und verwendenGLKMathDegreesToRadians
undGLKMathRadiansToDegrees
Sehr schöne Lösungen, genau das, was ich für mein schnelles Projekt brauchte, also hier ist ein schneller Port. danke & hier ist auch ein Spielplatzprojekt: https://github.com/ppoh71/playgounds/tree/master/centerLocationPoint.playground
quelle
Wenn Sie daran interessiert sind, ein sehr vereinfachtes "Zentrum" der Punkte zu erhalten (z. B. um einfach eine Karte auf das Zentrum Ihres gmaps-Polygons zu zentrieren), dann ist hier ein grundlegender Ansatz, der für mich funktioniert hat.
Dies gibt die mittlere Lat / Lng-Koordinate für die Mitte eines Polygons zurück.
quelle
In Django ist dies trivial (und funktioniert tatsächlich, ich hatte Probleme mit einer Reihe von Lösungen, die Negative für den Breitengrad nicht korrekt zurückgaben).
Angenommen , Sie verwenden Django-Geopostcodes (deren Autor ich bin).
point
ist eine Django-Point
Instanz, die dann verwendet werden kann, um beispielsweise alle Objekte abzurufen, die sich innerhalb von 10 km von diesem Mittelpunkt befinden.Das Ändern in rohes Python ist trivial.
Unter der Haube nutzt Django GEOS - weitere Details unter https://docs.djangoproject.com/de/1.10/ref/contrib/gis/geos/
quelle
Java-Version, wenn jemand es braucht. Konstanten definiert statisch, um sie nicht zweimal zu berechnen.
quelle
Hier ist die Android-Version, die auf der C # -Antwort von @ Yodacheese mit der Google Maps-API basiert:
in app build.gradle hinzufügen:
quelle
Dies ist dasselbe wie ein gewichtetes Durchschnittsproblem, bei dem alle Gewichte gleich sind und es zwei Dimensionen gibt.
Finden Sie den Durchschnitt aller Breiten für Ihren mittleren Breitengrad und den Durchschnitt aller Längengrade für den mittleren Längengrad.
Vorbehalt Emptor: Dies ist eine Näherung aus nächster Nähe, und der Fehler wird unruhig, wenn die Abweichungen vom Mittelwert aufgrund der Erdkrümmung mehr als einige Meilen betragen. Denken Sie daran, dass Breiten- und Längengrade Grad sind (nicht wirklich ein Gitter).
quelle
Wenn Sie das verwendete Ellipsoid berücksichtigen möchten, finden Sie die Formeln hier http://www.ordnancesurvey.co.uk/oswebsite/gps/docs/A_Guide_to_Coordinate_Systems_in_Great_Britain.pdf
siehe Anhang B.
Das Dokument enthält viele andere nützliche Dinge
B.
quelle
In PHP kein Objekt. Bei einem gegebenen Array von Koordinatenpaaren wird die Mitte zurückgegeben.
Idee von # 4 übernommen
quelle
Hier ist die Python-Version zum Finden des Mittelpunkts. Lat1 und lon1 sind Breiten- und Längengrade. Dadurch werden Breite und Länge des Mittelpunkts geändert.
quelle
Dart- Implementierung für Flatter , um den Mittelpunkt für mehrere Breiten- und Längengrade zu finden.
Mathe-Paket importieren
Längen- und Breitengradliste
quelle
Wenn Sie möchten, dass alle Punkte im Bild sichtbar sind, möchten Sie die Extrema in Breiten- und Längengrad und stellen sicher, dass Ihre Ansicht diese Werte mit dem gewünschten Rand enthält.
(Nach Alnitaks Antwort mag es ein wenig problematisch sein, wie Sie die Extrema berechnen. Wenn sie jedoch ein paar Grad auf beiden Seiten des Längengrads liegen, der sich um sie dreht, rufen Sie den Schuss und nehmen die richtige Reichweite.)
Wenn Sie die Karte, auf der sich diese Punkte befinden, nicht verzerren möchten, passen Sie das Seitenverhältnis des Begrenzungsrahmens so an, dass es zu den Pixeln passt, die Sie der Ansicht zugewiesen haben, aber dennoch die Extrema enthalten.
Um die Punkte auf einer beliebigen Zoomstufe zentriert zu halten, berechnen Sie die Mitte des Begrenzungsrahmens, der wie oben "nur zu den Punkten passt", und behalten Sie diesen Punkt als Mittelpunkt bei.
quelle
Ich habe diese Aufgabe in Javascript wie unten ausgeführt
quelle
Als Anerkennung für diesen Thread ist hier mein kleiner Beitrag zur Implementierung in Ruby, in der Hoffnung, dass ich jemanden ein paar Minuten vor seiner kostbaren Zeit retten kann:
quelle
Ich habe eine Formel verwendet, die ich von www.geomidpoint.com erhalten habe, und die folgende C ++ - Implementierung geschrieben. Die
array
undgeocoords
sind meine eigenen Klassen, deren Funktionalität selbsterklärend sein sollte.quelle
Pfeil / Flattern Berechnen Sie den Mittelpunkt mehrerer Breiten- / Längenkoordinatenpaare
quelle