lbs mysql 使用mysql來實現lbs排序

2021-10-17 21:35:46 字數 1356 閱讀 6474

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

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

1,如何獲取位置

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

2,資料表設計

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

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

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

3,根據使用者位置查詢附近

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

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

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

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

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

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

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次方

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

mysql 使用 MySQL 基本使用

資料庫 create database 名字 建立資料庫 show databases 檢視所有資料庫 show create database book g 檢視建立好的資料庫的定義 drop database if exists 名字 刪除資料庫 use 名字 使用資料庫 引擎 show eng...

MySQL使用學習使用 mysql學習使用

1 mysql學習 1 安裝 ubuntu下直接安裝 apt get install mysql server 2 檢查伺服器是否啟動 sudo netstat tap grep mysql,如果啟動成功,出現以下資訊 tcp00localhost.localdomain mysql listen ...

mysql使用判斷 MySQL使用判斷

1.case語法 在第乙個方案的返回結果中,value compare value。而第二個方案的返回結果是第一種情況的真實結果。如果沒有匹配的結果值,則返回結果為else後的結果,如果沒有else 部分,則返回值為 null。mysql select case 1 when 1 then one ...