這陣子我剛好有一點時間,特意寫了一篇文件分享這方面的東西。
要解決的問題:
2.獲取到地理位置後,記錄使用者的座標
3.計算出當前的使用者座標和資料表裡商戶的座標的距離
4.距離排序與距離的使用者體驗顯示
好吧,現在我們開始具體的細節問題解決
通過這種方式,我們的服務端接收到的資訊格式是這樣的
<可以看到其中有元素latitude和longitude,獲取到了座標就好說啦xml><
tousername
>
gh_f6bce85ce621
]]>
tousername
>
<
fromusername
>
obxlljpchqwixh0mazyr1esewv3y
]]>
fromusername
>
<
createtime
>1460636400
createtime
>
<
msgtype
>
event
]]>
msgtype
>
<
event
>
location
]]>
event
>
<
latitude
>30.660822
latitude
>
<
longitude
>104.066566
longitude
>
<
precision
>65.000000
precision
>
xml>
什麼是js-sdk呢?
這種方式獲取到使用者座標是基於網頁的形式獲得的,所以使用者的地理位置座標需要通過非同步的模式儲存到你自己的系統中
這個是通過js-sdk的部分**
wx.getlocation(2.獲取到地理位置後,記錄使用者的座標使用者的座標獲取到後,自行記錄到你的系統裡,通過快取也好,session也好,cookie也好,還是資料表也好隨便你})
3.計算出當前的使用者座標和資料表裡商戶的座標的距離
我們目前來個假設乙個獲取到座標
例如我的座標是:30.664385188806,104.07559730274
表名:merchants
表字段:itemid,title,hits,lat,lng lat是經度 lat是緯度
當前要做的工作就是,通過乙個稍微複雜的sql語句做乙個排序
其中這個sql語句當中有個兩個座標之間的計算公式
公式如下
function rad($d當前使用getdistance方法只要你帶入兩個座標點就可以計算出這兩個座標的的距離,距離精度是以公尺為單位的)
function getdistance($lat1, $lng1, $lat2, $lng2
)
使用這種方法如果用程式語言編寫的話,資料計算非常耗時
我們需要把資料記錄全部查詢出,然後在記憶體中通過自己的方法逐條對全部查詢出資料集做過濾,並且計算出乙個距離字段,然後再做一次排序才會得到想要的結果
雖然這種方法思考邏輯上簡單容易實現,但是耗時多了。
我跟傾向於用下面的方法來實現,那就是借助於sql語句,通過sql語句的運算把距離和排序一次性解決。
mysql函式計算座標距離
其中30.664385188806是你的經度,104.07559730274是你的緯度
以下sql語句是全部查詢並運算出座標的的語句
select itemid,title,hits,telephone,round(6378.138*2通過如下方式的sql執行就可查詢出相應的距離+排序+多少公里範圍的條件檢索*asin(sqrt(pow(sin((30.664385188806
*pi()/
180-lat*
pi()/
180)/
2),2)+
cos(30.664385188806
*pi()/
180)*
cos(lat*
pi()/
180)*pow(sin((104.07559730274
*pi()/
180-lng*
pi()/
180)/
2),2)))*
1000) as
distance
from merchants order
by distance
下面的檢索出5公里範圍的語句
select查詢結果見下圖*from (select
itemid,title,hits,telephone,
round(6378.138*2
*asin(sqrt(pow(sin((30.664385188806
*pi()/
180-lat*
pi()/
180)/
2),2)+
cos(30.664385188806
*pi()/
180)*
cos(lat*
pi()/
180)*pow(sin((104.07559730274
*pi()/
180-lng*
pi()/
180)/
2),2)))*
1000) as
distance
from merchants order
by distance ) as a where a.distance<=
5000
4.距離排序與距離的使用者體驗顯示
查詢計算出的distance是數字,需要顯示的使用者體驗更好一點
例如:我和這個商家的精確距離是1290公尺,因為精度的原因,其實精確距離其實偏差非常大,不能顯示乙個具體的數字 ,所以要優化顯示為1.3公里或者1.5公里內的模式更好
我自用的方法是這樣的
a方式
//b方式輸入distance,然後對數字做優化顯示
function mtokm($number
)
if($v
<100)
else
return$v;
}
使用者地理位置模式的顯示就到此結束了
基於微信地理位置的附近商家距離座標資料查詢方法
要解決的問題 2.獲取到地理位置後,記錄使用者的座標 3.計算出當前的使用者座標和資料表裡商戶的座標的距離 4.距離排序與距離的使用者體驗顯示 好吧,現在我們開始具體的細節問題解決 通過這種方式,我們的服務端接收到的資訊格式是這樣的 xml tousername gh f6bce85ce621 to...
elasticsearch基於地理位置的搜尋
參考 elasticsearch基於地理位置的搜尋,有乙個專門的物件geo point儲存地理位置資訊 經度,緯度 並且提供了一些基本的查詢方法,如geo bounding box。put my geo name 建立了乙個my geo索引,新增了乙個欄位location,它的型別是geo poin...
微信小程式API 地理位置location
屬性 型別預設值 必填說明 latitude number 是緯度,範圍為 90 90,負數表示南緯。使用 gcj02 國測局座標系 longitude number 是經度,範圍為 180 180,負數表示西經。使用 gcj02 國測局座標系 scale number18否 縮放比例,範圍5 18...