Ich möchte eine App erstellen, die den nächstgelegenen Ort überprüft, an dem sich ein Benutzer befindet. Ich kann den Standort des Benutzers leicht ermitteln und habe bereits eine Liste von Orten mit Längen- und Breitengraden.
Was wäre der beste Weg, um den nächstgelegenen Ort der Liste anhand des aktuellen Benutzerstandorts zu ermitteln?
Ich konnte nichts in den Google-APIs finden.
android
geolocation
maps
Chmouel Boudjnah
quelle
quelle
import android.location.Location;
oder welchehttp://developer.android.com/reference/android/location/Location.html
Schauen Sie in distanceTo oder distanceBetween. Sie können ein Standortobjekt aus einem Breiten- und Längengrad erstellen:
quelle
distanceTo
Methode.Eine ungefähre Lösung (basierend auf einer gleichwinkligen Projektion), viel schneller (es werden nur 1 Trigger und 1 Quadratwurzel benötigt).
Diese Annäherung ist relevant, wenn Ihre Punkte nicht zu weit voneinander entfernt sind. Es wird immer im Vergleich zur tatsächlichen Haversine-Entfernung überschätzt. Beispielsweise wird die tatsächliche Entfernung um nicht mehr als 0,05382% erhöht , wenn der Delta-Breiten- oder Längengrad zwischen Ihren beiden Punkten 4 Dezimalgrad nicht überschreitet .
Die Standardformel (Haversine) ist die exakte (das heißt, sie funktioniert für alle Längen- / Breitengrade auf der Erde), ist jedoch viel langsamer, da sie 7 trigonometrische und 2 Quadratwurzeln benötigt. Wenn Ihre Punkte nicht zu weit voneinander entfernt sind und die absolute Genauigkeit nicht von größter Bedeutung ist, können Sie diese ungefähre Version (gleichwinklig) verwenden, die viel schneller ist, da nur eine trigonometrische und eine Quadratwurzel verwendet werden.
Sie können dies weiter optimieren, indem Sie entweder:
Weitere Informationen finden Sie unter: http://www.movable-type.co.uk/scripts/latlong.html
Es gibt eine schöne Referenzimplementierung der Haversine-Formel in mehreren Sprachen unter: http://www.codecodex.com/wiki/Calculate_Distance_Between_Two_Points_on_a_Globe
quelle
O(n)
.O(1)
Verwenden Sie für eine Lösung einen räumlichen 2D-Index, um die potenziellen Übereinstimmungen zu kürzen, bevor Sie die genaue Lösung berechnen. Wir verlassen den Rahmen dieser Frage :)Es gibt einige Methoden, die Sie verwenden können, aber um festzustellen, welche die beste ist, müssen wir zuerst wissen, ob Sie die Höhe des Benutzers sowie die Höhe der anderen Punkte kennen.
Abhängig von der Genauigkeit, nach der Sie suchen, können Sie entweder die Haversine- oder die Vincenty-Formel betrachten ...
Diese Seiten beschreiben die Formeln und bieten für weniger mathematische Neigungen auch eine Erklärung, wie sie in Skripten implementiert werden können!
Haversine-Formel: http://www.movable-type.co.uk/scripts/latlong.html
Vincenty-Formel: http://www.movable-type.co.uk/scripts/latlong-vincenty.html
Wenn Sie Probleme mit einer der Bedeutungen in den Formeln haben, kommentieren Sie einfach und ich werde mein Bestes tun, um sie zu beantworten :)
quelle
Es gibt zwei Möglichkeiten, um die Entfernung zwischen LatLng zu ermitteln.
Sieh dir das an
und zweitens
public float distanceTo (Location dest)
wie von praveen beantwortet.quelle
quelle
Verwenden Sie einfach die folgende Methode, übergeben Sie sie lat und long und ermitteln Sie die Entfernung in Metern:
quelle
Sie können Entfernung und Zeit mit der Google Map API ermitteln. Google Map API
Übergeben Sie einfach heruntergeladenes JSON an diese Methode. Sie erhalten Echtzeitentfernung und -zeit zwischen zwei Latlongs
quelle
quelle