基于LBS的地理位置附近的搜索以及由近及远的排序
from:http://www.cnblogs.com/jifeng/p/4356006.html
Nosql學(xué)習(xí)之Redis資料(一)
http://redis.io/download
?
目前基于LBS地理位置的搜索已經(jīng)應(yīng)用非常廣了,的確是個(gè)很方便的東西。
我們做程序的就是要考慮如何通過(guò)這些功能,來(lái)做出更符合用戶的內(nèi)容來(lái)。
1,如何獲取位置
例如微信,可以通過(guò)發(fā)送地理位置來(lái)獲取到當(dāng)前用戶的經(jīng)緯度。查看
在網(wǎng)頁(yè)端,可以使用html5獲取地理定位。查看
2,數(shù)據(jù)表設(shè)計(jì)
數(shù)據(jù)庫(kù)中要預(yù)存自己的位置數(shù)據(jù),如何獲取數(shù)據(jù)請(qǐng)查看相關(guān)地圖api。
字段:十進(jìn)制數(shù)的緯度 latitude FLOAT(10,6) 十進(jìn)制數(shù)的經(jīng)度 longitude FLOAT(10,6)
假設(shè)我們數(shù)據(jù)庫(kù)中已經(jīng)存儲(chǔ)大量酒店的位置信息
3,根據(jù)用戶位置查詢附近
如上圖,假設(shè)當(dāng)前用戶所在的位置為坐標(biāo)O,那么我們要查詢附近的酒店,理想的范圍應(yīng)該是以O(shè)為原點(diǎn)的圓內(nèi),但是我們先不這樣做,后面會(huì)講到。
我們先以O(shè)為原點(diǎn),在坐標(biāo)上以0.3的差值標(biāo)識(shí)了4個(gè)位置,其實(shí)這樣就是一個(gè)正方形范圍,大致應(yīng)該符合我們的要求。
那么我們就要從數(shù)據(jù)庫(kù)中查詢范圍在這個(gè)正方形之內(nèi)的所有酒店了。
一,獲取到用戶的經(jīng)緯度坐標(biāo):
| 1 | $latitude;$longitude |
二,定義一個(gè)差值,設(shè)置經(jīng)度和緯度的范圍:
| 1 2 3 4 5 | $i = 0.3; //差值可自定義,值越大,范圍就越大 $min_latitude = $latitude - $i; //緯度最小值 $max_latitude = $latitude + $i; //緯度最大值 $min_longitude = $longitude - $i; //經(jīng)度最小值 $max_longitude = $longitude + $i; //經(jīng)度最大值 |
三,數(shù)據(jù)庫(kù)中查詢?cè)谶@個(gè)范圍之內(nèi)的酒店:
| 1 | SELECT * FROM table WHERE (latitude BETWEEN $min_latitude AND $max_latitude) AND (longitude BETWEEN $min_longitude AND $max_longitude); |
這樣我們的附近搜索基本完成了
四,以地理位置由遠(yuǎn)及近的排序:
如果我們要篩選出最近的10個(gè)的話,用上面的語(yǔ)句來(lái)查詢,可能會(huì)把稍遠(yuǎn)的先查出來(lái),后面的就沒(méi)有機(jī)會(huì)了,那么我們得做個(gè)排序了。
如上圖,如果我們要獲取E位置和F位置分別距離O點(diǎn)的長(zhǎng)度,那么我們就需要計(jì)算OE和OF的長(zhǎng)度分別為多少,這里我們要用到直角三角形的數(shù)學(xué)公式:C^2 = A^2 + B^2,知道A和B,那么C的值也就得到了。
注意:請(qǐng)首先在表中建立一個(gè)字段d,以作后面緩存距離使用,否則會(huì)報(bào)錯(cuò)
我們可以根據(jù)經(jīng)緯度的差分別來(lái)獲取到A和B的值,SQL語(yǔ)句是這樣的:
| 1 | 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次方
通過(guò)這樣一步,我們的范圍已經(jīng)鎖定在圓形之內(nèi)了,并且按照由近及遠(yuǎn)的方式進(jìn)行排序(在不考慮效率的情況下)。
總結(jié)
以上是生活随笔為你收集整理的基于LBS的地理位置附近的搜索以及由近及远的排序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 结合MongoDB开发LBS应用
- 下一篇: 基于LBS功能应用的Geohash方案