日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2025/7/25 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于LBS的地理位置附近的搜索以及由近及远的排序 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。