基於LBS的地理位置附近的搜索以及由近及遠的排序



Nosql學習之Redis資料(一)

http://redis.io/download

 

目前基於LBS地理位置的搜索已經應用非常廣了,的確是個很方便的東西。

我們做程序的就是要考慮如何通過這些功能,來做出更符合用戶的內容來。

1,如何獲取位置

例如微信,可以通過發送地理位置來獲取到當前用戶的經緯度。查看

在網頁端,可以使用html5獲取地理定位。查看

2,數據表設計

數據庫中要預存自己的位置數據,如何獲取數據請查看相關地圖api。

字段:十進制數的緯度 latitude FLOAT(10,6) 十進制數的經度 longitude FLOAT(10,6)

假設我們數據庫中已經存儲大量酒店的位置信息

3,根據用戶位置查詢附近

如上圖,假設當前用戶所在的位置為坐標O,那么我們要查詢附近的酒店,理想的范圍應該是以O為原點的圓內,但是我們先不這樣做,后面會講到。

我們先以O為原點,在坐標上以0.3的差值標識了4個位置,其實這樣就是一個正方形范圍,大致應該符合我們的要求。

那么我們就要從數據庫中查詢范圍在這個正方形之內的所有酒店了。

一,獲取到用戶的經緯度坐標:

$latitude;$longitude

  

二,定義一個差值,設置經度和緯度的范圍:

$i = 0.3; //差值可自定義,值越大,范圍就越大
$min_latitude = $latitude - $i; //緯度最小值
$max_latitude = $latitude + $i; //緯度最大值
$min_longitude = $longitude - $i; //經度最小值
$max_longitude = $longitude + $i; //經度最大值

  

三,數據庫中查詢在這個范圍之內的酒店:

SELECT * FROM table WHERE (latitude BETWEEN $min_latitude AND $max_latitude) AND (longitude BETWEEN $min_longitude AND $max_longitude);

  

這樣我們的附近搜索基本完成了

四,以地理位置由遠及近的排序:

如果我們要篩選出最近的10個的話,用上面的語句來查詢,可能會把稍遠的先查出來,后面的就沒有機會了,那么我們得做個排序了。

如上圖,如果我們要獲取E位置和F位置分別距離O點的長度,那么我們就需要計算OE和OF的長度分別為多少,這里我們要用到直角三角形的數學公式:C^2 = A^2 + B^2,知道A和B,那么C的值也就得到了。

注意:請首先在表中建立一個字段d,以作后面緩存距離使用,否則會報錯

我們可以根據經緯度的差分別來獲取到A和B的值,SQL語句是這樣的:

SELECT *,SQRT(POWER($latitude - latitude, 2) + POWER($longitude  - longitude, 2)) AS d FROM table WHERE (latitude BETWEEN $min_latitude AND $max_latitude) AND (longitude BETWEEN $min_longitude AND $max_longitude) AND d < $i ORDER BY d ASC LIMIT 10;

  

SQRT(X):求X的平方根,POWER(X, Y):求X的Y次方

通過這樣一步,我們的范圍已經鎖定在圓形之內了,並且按照由近及遠的方式進行排序(在不考慮效率的情況下)。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM