2016-06-06 8 views
0

ich eine Liste der Standorte haben, nach diesem Muster:berechnen Abstand zwischen einem Ort und einer Liste von Orten

[1] = {lat = -40.2452, longitude = -76.2489}, 
[2] = {lat = -40.2452, longitude = -76.2489}, 
[3] = {lat = -40.2452, longitude = -76.2489}, 
[4] = {lat = -40.2452, longitude = -76.2489} 

und localition

location = {lat = -40.2452, longitude = -76.2489} 

und ich möchte Welche der Orte berechnen Dies in der Ferne.

Ich habe eine Formel gefunden, die den Abstand zwischen zwei Punkten berechnet.

aber wenn diese Liste groß ist!

gibt es einen schnelleren Weg?

oder können Sie die Liste in einer Schleife durchlaufen?

FOR LOCATION IN LISTLOCATION DO 
    IF GETDISTANCE(LOCATION, LOCATION2) <= DISTANCE 
     SAVE THIS LOCATION 
    END 
END 

Diese Werte sind ein Beispiel

+0

Wenn Sie sich Sorgen um die Leistung machen, und Sie sind auf Android, warum nicht Ihre Daten in eine SQLite-Datenbank setzen und abfragen. Mehr in dieser Antwort: http://stackoverflow.com/questions/3126830/query-to-get-records-based-on-radius-in-sqlite –

+0

Ich weiß, ist zum Beispiel Zweck, aber alle Ihre Standorte sind die gleichen. –

+0

Ihr Beispiel-Array enthält alle die gleichen Elemente. Wenn es eine hohe Wahrscheinlichkeit gibt, dass es viele doppelte Objekte gibt, würde das Entfernen der Objekte vor dem Aufrufen von "GETDISTANCE (LOCATION, LOCATION2)" die Leistung erhöhen. – damjanh

Antwort

1

Grundsätzlich Sie haben um jeden Punkt, keine andere Wahl zu überprüfen. Die Abstandsformel (Haversine) ist in der Tat langsam, da sie nur wenige trigonometrische Funktionen verwendet. Was Sie wirklich wollen, ist, einen Kreis um Ihren Punkt zu zeichnen, dessen Radius R ist der Abstand, und für jeden Punkt zu prüfen, ob es innerhalb dieses Kreises ist:
enter image description here

Das Problem ist, dass Ihr Punkt gegeben als (lat, lang) Paar, nicht (x, y) Paar, so dass Sie keine "regulären" trigonometrischen Methoden wie die Gleichung des Kreises verwenden können.
Stattdessen müssen Sie ein Quadrat finden, das diesen Kreis begrenzt. Gehe 90 Grad nach Norden und Süden, finde die obere und untere Länge dieses Quadrats. Machen Sie denselben Osten und Westen rhe, findet die oberen und untere Breite:
enter image description here

Jetzt können Sie für jeden Punkt überprüfen, ob es in der Box ist, und man kann es leicht mit einfachen comparsions tun:

if lon > lon1 and lon < lon2 
    and lat > lat2 and lat < lat1 

das ist wirklich computational billig.
Das einzige Problem ist mit den Punkten, die in dem blauen Bereich sind:
enter image description here

Sie im Quadrat, aber nicht innerhalb des Kreises, so dass Sie die Haversine Formel für sie verwenden.
Wenn die meisten Ihrer Punkte nicht im Quadrat sind, spart Ihnen diese Methode Zeit, weil es ziemlich einfach ist, sie zu eliminieren.

+0

Wenn ich weiterhin die gleiche Formel verwenden, könnte ein Server die Berechnung ständig durchführen? –

+0

Ich Anfrage an einen Server, die Clients sind und senden Sie meinen Standort, und der Server macht diese Berechnung und gibt eine Liste –

+0

Sie haben nach einem schnelleren Weg gefragt und ich denke, dass meine Lösung schneller ist als die Haversine Formel für jeden Punkt verwenden . Es liegt an Ihnen, zu entscheiden, welche Methode Sie verwenden und ob Sie sie auf dem Server oder auf dem Client ausführen. – TDG

0

Wenn Sie auf Android sind, können Sie die "distanceBetween" method of the Location class verwenden. Diese Methode hat ihre Implementierung in Java (Sie können eine Schleife zum Testen der Entfernung zwischen Ihrem Standort und den Standortlistenelementen verwenden). Wenn Sie also eine höhere Leistung wünschen, sollten Sie dies nativ tun (NDK). Wenn Sie dies tun, sollten Sie die vollständige Liste an die native Methode übergeben und nicht eins nach dem anderen, da die Änderung des Kontexts zwischen der virtuellen und der nativen Umgebung kostspielig sein kann.