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

2021-07-11 04:00:03 字數 2445 閱讀 2594

from:

nosql學習之redis資料(一)

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

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

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

資料庫中要預存自己的位置資料,如何獲取資料請檢視相關地圖api。

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

假設我們資料庫中已經儲存大量酒店的位置資訊

如上圖,假設當前使用者所在的位置為座標o,那麼我們要查詢附近的酒店,理想的範圍應該是以o為原點的圓內,但是我們先不這樣做,後面會講到。

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

那麼我們就要從資料庫中查詢範圍在這個正方形之內的所有酒店了。

一,獲取到使用者的經緯度座標:

1

$latitude;$longitude

二,定義乙個差值,設定經度和緯度的範圍:

1

2

3

4

5

$i = 0.3; //差值可自定義,值越大,範圍就越大

$min_latitude = $latitude - $i; //緯度最小值

$max_latitude = $latitude + $i; //緯度最大值

$min_longitude = $longitude - $i; //經度最小值

$max_longitude = $longitude + $i; //經度最大值

三,資料庫中查詢在這個範圍之內的酒店:

1

select*fromtablewhere(latitudebetween$min_latitudeand$max_latitude)and(longitudebetween$min_longitudeand$max_longitude);

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

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

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

如上圖,如果我們要獲取e位置和f位置分別距離o點的長度,那麼我們就需要計算oe和of的長度分別為多少,這裡我們要用到直角三角形的數學公式:c^2 = a^2 + b^2,知道a和b,那麼c的值也就得到了。

注意:請首先在表中建立乙個欄位d,以作後面快取距離使用,否則會報錯

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

1

select*,sqrt(power($latitude - latitude, 2) + power($longitude  - longitude, 2))asdfromtablewhere(latitudebetween$min_latitudeand$max_latitude)and(longitudebetween$min_longitudeand$max_longitude)andd < $iorderbydasclimit 10;

sqrt(x):求x的平方根,power(x, y):求x的y次方

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

基於Solr的地理位置搜尋 1

基於solr的空間搜尋學習筆記 在solr中基於空間位址查詢主要圍繞2個概念實現 1 cartesian tiers 笛卡爾層 cartesian tiers是通過將乙個平面地圖的根據設定的層次數,將每層的分解成若干個網格,如下圖所示 每層以2的評方遞增,所以第一層為4個網格,第二層為16 個,所以...

基於Solr的地理位置搜尋(3)

接上文,本文將繼續介紹基於solr的地理位置搜尋的第二種實現方案cartesian tiers geohash 從基於solr的地理位置搜尋 2 中可以看到完全基於geohash的查詢過濾,將完全遍歷整個docment文件,從效率上來看並不太合適,所以結合笛卡爾層後,能有效縮減少過濾範圍,從效能上能...

elasticsearch基於地理位置的搜尋

參考 elasticsearch基於地理位置的搜尋,有乙個專門的物件geo point儲存地理位置資訊 經度,緯度 並且提供了一些基本的查詢方法,如geo bounding box。put my geo name 建立了乙個my geo索引,新增了乙個欄位location,它的型別是geo poin...