2017-05-02 2 views
0

Ich benutze SQLite in Java, um eine Verbindung zu einer Datenbank herzustellen, in der Datenbank werden Benutzer einige Daten übergeben und SQLite wird eine Liste von 5 Ergebnissen basierend darauf zurückgeben.am nächsten passende Werte sqlite

Ich bin nicht in der Lage, einen Weg teh Code unter Verwendung von zwei Variablen, um herauszufinden, die am besten passende bringen Ergebnisse

Das Programm es sich von selbst Länge und Breite verwenden, um die Datenbank für die 5 nächsten Bahnhöfe zu suchen, Um sie am nächsten zu finden, ist mein Problem, dass die Long und Lat dynamisch über eine Android-App eingegeben werden. so kann ich nicht hart Code die Lang und Lat

dies ist mein aktueller Code

SELECT Latitude, Longitude, StationName FROM stations WHERE Latitude like '51%' AND Longitude like '-3%' LIMIT 5 

, wie Sie für die Prüfung der übrigen teh Code sehen können ich verwendet habe eine Wildcard und wie Möglichkeit zu geben, mir teh Aussehen Es funktioniert, aber das gibt mir nur eine ganze Liste aller Bahnhöfe in alphabetischer Reihenfolge, ein realistischer Breitengrad wäre mehr wie 53,4198 und ein Bahnhof, der diesem am nächsten liegt, könnte bei 53,4183 liegen.

Hilfe bitte

+0

Für so was du bist besser dran so etwas wie die SQLite GIS Erweiterung SpatiaLite verwenden. – pvg

+1

Es gibt bessere Möglichkeiten, dies zu tun, zum Beispiel http://stackoverflow.com/questions/25170175/query-database-values-based-on-users-location. Wenn Sie größere Entfernungen haben, müssen Sie bessere Formeln verwenden und die Kugelform der Erde berücksichtigen. – Henry

Antwort

-1

Sie haben Abstand zu berechnen, und dann, um von dieser Entfernung. Ich denke, das wird dir helfen.

SELECT Latitude, Longitude, StationName, 
(
    3959 * 
    acos(cos(radians(UserLatitude)) * 
    cos(radians(Latitude)) * 
    cos(radians(Longitude) - 
    radians(UserLongitude)) + 
    sin(radians(UserLatitude)) * 
    sin(radians(Latitude))) 
) AS distance 
FROM stations 
ORDER BY distance ASC LIMIT 0,5; 

Thanks :)

+0

Wenn das DBMS trigonometrische Funktionen nicht unterstützt, kann man immer noch eine ähnliche Methode verwenden, indem nicht nur lat und long, sondern auch ihre sin und cos Werte gespeichert werden. – Henry

+0

Was also, wenn trigonometrische Funktionen nicht funktionieren, wie geht das? @Henry –

+0

Ich weiß nicht, was ich zu meinem vorherigen Kommentar hinzufügen soll. Speichere lat, sinlat, coslat und ähnliches für die geografische Länge in der db-Tabelle und verwende dann die gleiche Formel. Beachten Sie, dass Sie die "acos" nicht brauchen, da Sie nur die Datensätze bestellen müssen, da es über das interessante Intervall monoton ist. – Henry