Ich habe einen Ort angegeben, der durch Breite und Länge definiert ist. Jetzt möchte ich einen Begrenzungsrahmen innerhalb von z. B. 10 Kilometern von diesem Punkt berechnen.
Der Begrenzungsrahmen sollte als latmin, lngmin und latmax, lngmax definiert werden.
Ich brauche dieses Zeug, um die Panoramio-API zu verwenden .
Kennt jemand die Formel, wie man diese Punkte bekommt?
Bearbeiten: Leute, ich suche nach einer Formel / Funktion, die lat & lng als Eingabe verwendet und einen Begrenzungsrahmen als latmin & lngmin und latmax & latmin zurückgibt. MySQL, PHP, C #, Javascript ist in Ordnung, aber auch Pseudocode sollte in Ordnung sein.
Bearbeiten: Ich suche keine Lösung, die mir den Abstand von 2 Punkten anzeigt
Antworten:
Ich schlage vor, die Erdoberfläche lokal als Kugel mit einem Radius zu approximieren, der durch das WGS84-Ellipsoid bei dem angegebenen Breitengrad angegeben wird. Ich vermute, dass die genaue Berechnung von latMin und latMax elliptische Funktionen erfordern und keine nennenswerte Erhöhung der Genauigkeit ergeben würde (WGS84 ist selbst eine Annäherung).
Meine Implementierung folgt (Es ist in Python geschrieben; ich habe es nicht getestet):
BEARBEITEN: Der folgende Code konvertiert (Grad, Primzahlen, Sekunden) in Grad + Bruchteile eines Grades und umgekehrt (nicht getestet):
quelle
Ich habe einen Artikel über das Finden der Begrenzungskoordinaten geschrieben:
http://JanMatuschek.de/LatitudeLongitudeBoundingCoordinates
Der Artikel erklärt die Formeln und bietet auch eine Java-Implementierung. (Es zeigt auch, warum Federicos Formel für die minimale / maximale Länge ungenau ist.)
quelle
public override string ToString()
Es ist sehr schlecht, eine solche globale Methode nur für einen Zweck zu überschreiben, besser nur eine andere Methode hinzuzufügen und dann die Standardmethode zu überschreiben, die in anderen Teilen der Anwendung verwendet werden kann. nicht für die gis genau ...Hier habe ich die Antwort von Federico A. Ramponi auf C # für alle Interessierten konvertiert:
quelle
Ich habe eine JavaScript-Funktion geschrieben, die die vier Koordinaten eines quadratischen Begrenzungsrahmens bei gegebenem Abstand und zwei Koordinaten zurückgibt:
quelle
minLon = void 0;
undmaxLon = MAX_LON;
es funktioniert immer noch nicht.centerPoint
Argument ein Array ist, das aus zwei Koordinaten besteht. Beispiel:getBoundingBox([42.2, 34.5], 50)
-void 0
ist die CoffeeScript-Ausgabe für "undefiniert" und hat keinen Einfluss auf die Ausführungsfähigkeit des Codes.degLat.degToRad
ist keine FunktiondegToRad
Fehler "Ist keine Funktion" erhielt. Ich habe nie herausgefunden warum, bin aberNumber.prototype.
keine gute Idee für eine solche Dienstprogrammfunktion, deshalb habe ich diese in normale lokale Funktionen konvertiert. Es ist auch wichtig zu beachten, dass die zurückgegebene Box [LNG, LAT, LNG, LAT] anstelle von [LAT, LNG, LAT, LNG] ist. Ich habe die Rückgabefunktion geändert, als ich diese verwendet habe, um Verwirrung zu vermeiden.Da ich eine sehr grobe Schätzung benötigte, um einige unnötige Dokumente in einer Elasticsearch-Abfrage herauszufiltern, habe ich die folgende Formel verwendet:
N = km erforderlich vom angegebenen Ort. Für Ihren Fall ist N = 10
Nicht genau, aber praktisch.
quelle
Sie suchen nach einer Ellipsoidformel.
Der beste Ort, an dem ich mit dem Codieren beginnen konnte, basiert auf der Geo :: Ellipsoid-Bibliothek von CPAN. Sie erhalten eine Basis, aus der Sie Ihre Tests erstellen und Ihre Ergebnisse mit den Ergebnissen vergleichen können. Ich habe es als Grundlage für eine ähnliche Bibliothek für PHP bei meinem früheren Arbeitgeber verwendet.
Geo :: Ellipsoid
Schauen Sie sich die
location
Methode an. Rufen Sie es zweimal an und Sie haben Ihre bbox.Sie haben nicht angegeben, welche Sprache Sie verwendet haben. Möglicherweise ist bereits eine Geokodierungsbibliothek für Sie verfügbar.
Oh, und wenn Sie es bis jetzt noch nicht herausgefunden haben, verwendet Google Maps das Ellipsoid WGS84.
quelle
Illustration von @Jan Philip Matuschek ausgezeichnete Erklärung. (Bitte stimmen Sie seine Antwort ab, nicht diese; ich füge dies hinzu, da ich mir etwas Zeit genommen habe, um die ursprüngliche Antwort zu verstehen.)
Die Bounding-Box-Technik zur Optimierung der Suche nach nächsten Nachbarn müsste die minimalen und maximalen Breiten- und Längengrade für einen Punkt P im Abstand d ableiten. Alle Punkte, die außerhalb dieser Punkte liegen, befinden sich definitiv in einem Abstand von mehr als d vom Punkt. Eine Sache, die hier zu beachten ist, ist die Berechnung des Breitengrads der Kreuzung, wie in der Erklärung von Jan Philip Matuschek hervorgehoben. Der Schnittpunkt liegt nicht auf dem Punkt P, sondern ist leicht versetzt dazu. Dies ist ein häufig übersehener, aber wichtiger Teil bei der Bestimmung der korrekten minimalen und maximalen Grenzlänge für Punkt P für den Abstand d. Dies ist auch bei der Überprüfung nützlich.
Der Haversine-Abstand zwischen (Schnittbreite, Länge hoch) und (Breite, Länge) von P ist gleich der Entfernung d.
Python gist hier https://gist.github.com/alexcpn/f95ae83a7ee0293a5225
quelle
Hier ist eine einfache Implementierung mit Javascript, die auf der Umrechnung des Breitengrads in km basiert, wobei
1 degree latitude ~ 111.2 km
.Ich berechne die Grenzen der Karte aus einem bestimmten Breiten- und Längengrad mit einer Breite von 10 km.
quelle
Ich habe ein PHP-Skript angepasst, das ich gefunden habe, um genau dies zu tun. Sie können es verwenden, um die Ecken einer Box um einen Punkt herum zu finden (z. B. 20 km entfernt). Mein spezielles Beispiel ist für die Google Maps-API:
http://www.richardpeacock.com/blog/2011/11/draw-box-around-coordinate-google-maps-based-miles-or-kilometers
quelle
Ich habe an dem Bounding-Box-Problem als Nebenproblem gearbeitet, um alle Punkte innerhalb des SrcRad-Radius eines statischen LAT, LONG-Punkts zu finden. Es gab einige Berechnungen, die verwendet wurden
um die Längengrade zu berechnen, aber ich fand, dass dies nicht alle Antworten gab, die benötigt wurden. Denn was Sie wirklich tun wollen, ist
Ich weiß, ich weiß, dass die Antwort dieselbe sein sollte, aber ich fand, dass es nicht so war. Es stellte sich heraus, dass ich einige Positionspunkte ausließ, indem ich nicht sicher war, ob ich zuerst das (SRCrad / RadEarth) machte und dann durch den Cos-Teil teilte.
Nachdem Sie alle Ihre Begrenzungsrahmenpunkte erhalten haben und eine Funktion haben, die den Punkt-zu-Punkt-Abstand berechnet, ist es einfach, nur die Punkte zu erhalten, die einen bestimmten Abstandsradius vom festen Punkt haben. Hier ist was ich getan habe. Ich weiß, dass es ein paar zusätzliche Schritte gedauert hat, aber es hat mir geholfen
quelle
Es ist sehr einfach, gehen Sie einfach zur Panoramio-Website und öffnen Sie dann die Weltkarte von der Panoramio-Website. Gehen Sie dann zu dem angegebenen Ort, für den Breite und Länge erforderlich sind.
Dann haben Sie Breiten- und Längengrade in der Adressleiste gefunden, zum Beispiel in dieser Adresse.
http://www.panoramio.com/map#lt=32.739485&ln=70.491211&z=9&k=1&a=1&tab=1&pl=all
lt = 32.739485 => Breite ln = 70.491211 => Länge
Dieses Panoramio JavaScript API-Widget erstellt einen Begrenzungsrahmen um ein Lat / Long-Paar und gibt dann alle Fotos mit diesen Grenzen zurück.
Eine andere Art von Panoramio JavaScript API-Widget, in dem Sie auch die Hintergrundfarbe mit Beispiel und Code ändern können, finden Sie hier .
Es wird nicht in der Kompositionsstimmung angezeigt. Es wird nach der Veröffentlichung angezeigt.
quelle
Hier habe ich Federico A. Ramponis Antwort auf PHP konvertiert, wenn jemand interessiert ist:
quelle
Vielen Dank an @Fedrico A. für die Phyton-Implementierung. Ich habe sie in eine Objective C-Kategorieklasse portiert. Hier ist:
Ich habe es getestet und scheint gut zu funktionieren. Struct BoundsLocation sollte durch eine Klasse ersetzt werden. Ich habe es nur verwendet, um es hier zu teilen.
quelle
Alle obigen Antworten sind nur teilweise richtig . Speziell in Regionen wie Australien enthalten sie immer Stangen und berechnen auch für 10 km ein sehr großes Rechteck.
Insbesondere der Algorithmus von Jan Philip Matuschek unter http://janmatuschek.de/LatitudeLongitudeBoundingCoordinates#UsingIndex enthielt für fast jeden Punkt in Australien ein sehr großes Rechteck von (-37, -90, -180, 180). Dies trifft einen großen Benutzer in der Datenbank und die Entfernung muss für alle Benutzer in fast der Hälfte des Landes berechnet werden.
Ich fand heraus, dass der Drupal API Earth-Algorithmus des Rochester Institute of Technology sowohl am Pol als auch anderswo besser funktioniert und viel einfacher zu implementieren ist.
https://www.rit.edu/drupal/api/drupal/sites%21all%21modules%21location%21earth.inc/7.54
Verwenden Sie
earth_latitude_range
undearth_longitude_range
aus dem obigen Algorithmus zur Berechnung des BegrenzungsrechtecksVerwenden Sie die von Google Maps dokumentierte Entfernungsberechnungsformel, um die Entfernung zu berechnen
https://developers.google.com/maps/solutions/store-locator/clothing-store-locator#outputting-data-as-xml-using-php
Um nach Kilometern statt nach Meilen zu suchen, ersetzen Sie 3959 durch 6371. Für (Lat, Lng) = (37, -122) und eine Markertabelle mit den Spalten lat und lng lautet die Formel:
Lesen Sie meine ausführliche Antwort unter https://stackoverflow.com/a/45950426/5076414
quelle
Hier ist Federico Ramponis Antwort in Go. Hinweis: keine Fehlerprüfung :(
quelle