160608、mysql距離函數st_distance


隨着近幾年各類移動終端的迅速普及,在手機移動定位app中,附近的人,附近的地點功能十分常見,基於地理位置的服務(LBS)和相關應用也越來越多,而支撐這些應用的最基礎技術之一,就是基於地理位置信息的處理。

 

st_distance 函數

st_distance 函數是從mysql5.6.1才加入的。

 

SET @g1 = POINT(1,1), @g2 = POINT(2,2);

select  st_distance (@g1, @g2);

#輸出結果:1.4142135623730951

 

SELECT  st_distance (point (1, 1),point(2,2) ) * 111195   

//輸出結果:157253.47706807632  單位:米

st_distance 計算的結果單位是度,需要乘111195(地球半徑6371000*PI/180)是將值轉化為米。

 

 

當然你也可以自定義距離函數:

CREATE FUNCTION slc (

lat1 DOUBLE,

lon1 DOUBLE,

lat2 DOUBLE,

lon2 DOUBLE

) RETURNS DOUBLE RETURN 6371 * acos(

cos(radians(lat1)) * cos(radians(lat2)) * cos(

radians(lon2) - radians(lon1)

) + sin(radians(lat1)) * sin(radians(lat2))

);

 

SELECT slc(1,1,2,2) from DUAL 

//輸出結果:157.22543203804852  km

 

 

應用場景:

假設我當時的坐標:117.069,35.86 需要查詢我附近50KM內服務區,並按照距離由近及遠排列

SELECT  

s.id,s.name,s.lng,s.lat,   

(st_distance (point (lng, lat),point(117.069,35.86) ) *111195) AS distance  

FROM  

road_servicearea s  

HAVING distance<50  

ORDER BY distance  

 

 

 

知識科普:

地球是在不停地繞地軸旋轉,在地球中腰畫一個與地軸垂直的大圓圈,使圈上的每一點都和南北兩極的距離相等,這個圓圈就叫作“赤道”。在赤道的南北兩邊,畫出許多和赤道平行的圓圈,就是“緯圈”;構成這些圓圈的線段,叫做緯線。我們把赤道定為緯度零度,向南向北各為90度,在赤道以南的叫南緯,在赤道以北的叫北緯。北極就是北緯90度,南極就是南緯90度。緯度的高低也標志着氣候的冷熱,如赤道和低緯度地地區無冬,兩極和高緯度地區無夏,中緯度地區四季分明。

 

從北極點到南極點,可以畫出許多南北方向的與地球赤道垂直的大圓圈,這叫作“經圈”;構成這些圓圈的線段,就叫經線。公元1884平面坐標圖年,國際上規定以通過英國倫敦近郊的格林尼治天文台的經線作為計算經度的起點,即經度零度零分零秒,也稱“本初子午線”。在它東面的為東經,共180度;

在它西面的為西經,共180度。因為地球是圓的,所以東經180度和西經180度的經線是同一條經線。各國公定180度經線為“國際日期變更線”。為了避免同一地區使用兩個不同的日期,國際日期變線在遇陸地時略有偏離。每一經度和緯度還可以再細分為60分,每一分再分為60秒以及秒的小數。利用經緯線,我們就可以確定地球上每一個地方的具體位置,並且把它在地圖或地球儀上表示出來。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM