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

2022-07-13 07:03:10 字數 3795 閱讀 8910

這陣子我剛好有一點時間,特意寫了一篇文件分享這方面的東西。

要解決的問題:

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

3.計算出當前的使用者座標和資料表裡商戶的座標的距離

4.距離排序與距離的使用者體驗顯示

好吧,現在我們開始具體的細節問題解決

通過這種方式,我們的服務端接收到的資訊格式是這樣的

<

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>

可以看到其中有元素latitudelongitude,獲取到了座標就好說啦

什麼是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

)

function getdistance($lat1, $lng1, $lat2, $lng2

)

當前使用getdistance方法只要你帶入兩個座標點就可以計算出這兩個座標的的距離,距離精度是以公尺為單位的

使用這種方法如果用程式語言編寫的話,資料計算非常耗時

我們需要把資料記錄全部查詢出,然後在記憶體中通過自己的方法逐條對全部查詢出資料集做過濾,並且計算出乙個距離字段,然後再做一次排序才會得到想要的結果

雖然這種方法思考邏輯上簡單容易實現,但是耗時多了。

我跟傾向於用下面的方法來實現,那就是借助於sql語句,通過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($v

<100)

else

return$v;

}

b方式

使用者地理位置模式的顯示就到此結束了

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

要解決的問題 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...