mysql計算距離最近的店鋪

2022-04-02 10:13:24 字數 1261 閱讀 9988

傳入引數 緯度 40.0497810000 經度 116.3424590000

/*傳入的引數為 緯度 緯度 經度 asc公升序由近至遠 desc 降序 由遠到近

*/select

*,round

( 6378.138 * 2 * asin

(

sqrt

(

pow(

sin(

(40.0497810000 * pi() / 180 - lat * pi() / 180) / 2),

2) + cos(40.0497810000 * pi() / 180) * cos(lat * pi() / 180) * pow

(

sin(

(116.3424590000 * pi() / 180 - lon * pi() / 180) / 2),2))

) * 1000)

asjuli

from

customer

order by

juli asc

這樣會把資料庫中所有店鋪都計算一遍,而在實際的使用中,不太可能會發生需要計算該使用者與所有其他使用者的距離,然後再排序的情況,當使用者數量達到乙個級別時,就可以在乙個較小的範圍裡進行搜尋,而非在所有使用者中進行搜尋.

所以對於這個例子,我增加了4個where條件,只對於經度和緯度大於或小於該使用者1度(111公里)範圍內的使用者進行距離計算,同時對資料表中的經度和緯度兩個列增加了索引來優化where語句執行時的速度.

最終的sql語句如下

$sql='select * from users_location where

latitude > '.$lat.'-1 and

latitude < '.$lat.'+1 and

longitude > '.$lon.'-1 and

longitude < '.$lon.'+1

order by acos(sin(('.$lat.' * 3.1415) / 180 ) *sin((latitude * 3.1415) / 180 ) +cos(('.$lat.' * 3.1415) / 180 ) * cos((latitude * 3.1415) / 180 ) *cos(('.$lon.'* 3.1415) / 180 - (longitude * 3.1415) / 180 ) ) * 6380 asc limit 10';

店鋪經緯度計算距離然後分頁排序

根據經緯度計算距離,根據距離排序或者是根據店鋪銷量排序 如下 topapi user.shop.list 店鋪分頁距離排序 介面作用說明 public apidescription 店鋪列表 定義api傳入的應用級引數 desc 用於在呼叫界面前,根據定義的引數,過濾必填引數是否已經參入,並且定義引...

如何計算點到線段的最近距離

在二維 三維圖形學系統當中,線段的拾取是乙個經常使用的功能 如何根據滑鼠點來判斷線段是否被選擇了,最主要的方法之一是通過點到線段的最小距離來判定的 無論二維還是三維情況下,使用點到直線的距離公式似乎是最直接的選擇 但是不要忘記點到直線公式計算的是點和直線之間的關係,而不是點和線段之間的關係 演算法如...

如何計算點到線段的最近距離

在二維 三維圖形學系統當中,線段的拾取是乙個經常使用的功能 如何根據滑鼠點來判斷線段是否被選擇了,最主要的方法之一是通過點到線段的最小距離來判定的 無論二維還是三維情況下,使用點到直線的距離公式似乎是最直接的選擇 但是不要忘記點到直線公式計算的是點和直線之間的關係,而不是點和線段之間的關係 演算法如...