目前基於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 ...