2017-05-02 89 views
0

我使用java中的SQLite連接到數據庫,在數據庫中用戶將傳入一些數據,SQLite將基於此返回5個結果列表。最接近的匹配值sqlite

我無法弄清楚使用兩個變量帶回最匹配的TEH代碼的方式導致

它自會用經緯度搜索數據庫爲5個最靠近火車站的程序,爲了離他們最近,我的問題是Long和Lat會通過android應用動態輸入。因此,我不能硬編碼的長和緯度

這是我當前的代碼

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

,你可以看到測試TEH代碼的其餘部分我已經使用通配符和類似的選項給我的德外觀它工作,但是這隻能給我列出所有列車站的按字母順序排列,一個現實的拉特將更像53.4198,最接近那個列車站可能是53.4183。

請幫助

+0

對於諸如此類的事情,你最好不要使用類似SQLite的GIS擴展SpatiaLite。 – pvg

+1

有更好的方法來做到這一點,例如http://stackoverflow.com/questions/25170175/query-database-values-based-on-users-location。如果你有更大的距離,你需要使用更好的公式,考慮地球的球形。 – Henry

回答

-1

您必須計算距離,然後按該距離排序。我認爲這會幫助你。

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; 

謝謝:)

+0

如果DBMS不支持三角函數,仍然可以使用類似的方法,不僅可以存儲緯度和長度,還可以存儲它們的正弦和餘弦值。 – Henry

+0

那麼,如果三角函數不起作用,那你怎麼做呢? @亨利 –

+0

不知道要添加到我以前的評論。在db表中存儲lat,sinlat,coslat和類似的經度,然後使用相同的公式。請注意,只需訂購記錄,您不需要'acos',因爲它在有趣的時間間隔內單調。 – Henry