基於微信地理位置的附近商家距離座標數據查詢方法

要解決的問題:java

1.經過微信公衆平臺獲取用戶地理位置(也就是座標啦,精度和緯度)mysql

2.獲取到地理位置後,記錄用戶的座標git

3.計算出當前的用戶座標和數據表裏商戶的座標的距離sql

4.距離排序與距離的用戶體驗顯示緩存

好吧,如今咱們開始具體的細節問題解決微信

 

1.經過微信公衆平臺獲取用戶地理位置cookie

經過微信獲取用戶地理位置有兩種方式session

方式a:此方式必須是服務號,用戶進入微信公衆號的時候,會向微信服務端推送關於用戶的相關信息,若是你設置了微信開發者模式,那麼這些信息能接收到用戶的相關信息微信開發

用戶贊成上報地理位置後,每次進入公衆號會話時,都會在進入時上報地理位置,上報地理位置以推送XML數據包到開發者填寫的URL來實現。微信公衆平臺

經過這種方式,咱們的服務端接收到的信息格式是這樣的

提示:只有服務號才能獲取用戶地理位置,而且服務號通過認證,而且須要在開發者的接口權限中去【開啓】

<xml>
<ToUserName><![CDATA[gh_f6bce85ce621]]></ToUserName> 
<FromUserName><![CDATA[obxLljpChQwixH0mAZYR1ESeWv3Y]]></FromUserName> 
<CreateTime>1460636400</CreateTime> 
<MsgType><![CDATA[event]]></MsgType> 
<Event><![CDATA[LOCATION]]></Event> 
<Latitude>30.660822</Latitude>
<Longitude>104.066566</Longitude> <Precision>65.000000</Precision> </xml>

 

能夠看到其中有元素LatitudeLongitude,獲取到了座標就好說啦

 

方式b:用戶訪問咱們的微網站的時候,經過微信的JS-SDK模式獲取用戶的地理位置(服務號訂閱號均可以)

什麼是JS-SDK呢?

微信JS-SDK是微信公衆平臺面向網頁開發者提供的基於微信內的網頁開發工具包。
微信官方描述:經過使用微信JS-SDK,網頁開發者可藉助微信高效地使用拍照、選圖、語音、位置等手機系統的能力,同時能夠直接使用微信分享、掃一掃、卡券、支付等微信特有的能力,爲微信用戶提供更優質的網頁體驗

這種方式獲取到用戶座標是基於網頁的形式得到的,因此用戶的地理位置座標須要經過異步的模式存儲到你本身的系統中

這個是經過JS-SDK的部分代碼

wx.getLocation({ 
  type: "wgs84", // 默認爲wgs84的gps座標,若是要返回直接給openLocation用的火星座標,可傳入&#39;gcj02&#39;
  success: function (res) {
    var latitude = res.latitude; // 緯度,浮點數,範圍爲90 ~ -90
    var longitude = res.longitude; // 經度,浮點數,範圍爲180 ~ -180。
    var speed = res.speed; // 速度,以米/每秒計
    var accuracy = res.accuracy; // 位置精度
   }
})

 

2.獲取到地理位置後,記錄用戶的座標

用戶的座標獲取到後,自行記錄到你的系統裏,經過緩存也好,session也好,cookie也好,仍是數據表也好隨便你

 

3.計算出當前的用戶座標和數據表裏商戶的座標的距離

咱們目前來個假設一個獲取到座標

例如個人座標是:30.664385188806,104.07559730274

表名:merchants

表字段:itemid,title,hits,lat,lng lat是經度 lat是緯度

 

 

經過SQL語句的運算把距離和排序一次性解決。

mysql函數計算座標距離

其中30.664385188806是你的經度,104.07559730274是你的緯度

如下SQL語句是所有查詢並運算出座標的的語句

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

經過以下方式的SQL運行就可查詢出相應的距離+排序+多少千米範圍的條件檢索

下面的檢索出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方式

//輸入distance,而後對數字作優化顯示 
 
 
function mToKm($number){
 if(!is_numeric($number)) 
    return ""; 
    switch ($number){ 
case $number>1800&&$number<=2000: 
$v="2"; break; 
case $number>1500&&$number<=1800: 
$v="1.8"; break; 
case $number>1200&&$number<=1500: 
$v="1.5"; break; 
case $number>1000&&$number<=1200: 
$v="1.2"; break; 
case $number>900&&$number<=1000: 
$v="1"; break; 
default: $v=ceil($number/100)*100; break;  
}  
 if($v<100){ 
$v= "距離我【".$v."】公里內。";
} else{ 
$v= "距離我【".$v."】米內。"; 
}
 return $v;  
}
 
 

 

 

 



B方式

function distanceDesc($number){
 if(!is_numeric($number))
 return "";
 switch ($number){
 case $number>3000&&$number<=5000: $v="5"; break; 
case $number>2000&&$number<=3000: $v="3"; break;
 case $number>1000&&$number<=2000: $v="2"; break;
 case $number>500&&$number<=1000: $v="1"; break;
 case $number<=500: $v="0.5"; break; default: $v=ceil($number/1000); break; } 
if($number<=300) {
 $distance = "【500米內】";
 }else{ 
$distance = "【".$v."公里內】"; 
}
 return $distance; 
 }
相關文章
相關標籤/搜索