在SQL SERVER下計算兩點經(jīng)緯度之間的距離

前些天客戶提出一個這樣的要求:一個手機(jī)訂餐網(wǎng),查詢當(dāng)前所在位置的5公里范圍的酒店,然后客戶好去吃飯。
拿到這個請求后,不知道如何下手,靜靜地想了一下,在酒店的表中增加兩個字段,用來存儲酒店所在的經(jīng)度和緯度,當(dāng)訂餐的時候,要求手機(jī)得到當(dāng)前客戶所在的經(jīng)度和緯度傳過來,再與數(shù)據(jù)庫中酒店的經(jīng)度和緯度計算一下,就查出來。

為了在數(shù)據(jù)庫中查詢兩點之間的距離,所以這個查詢需要在數(shù)據(jù)庫中定義。

我網(wǎng)上找了很久,卻沒有找到這個函數(shù)。最后在CSDN上,一個朋友的幫助下解決了這個問題,非常感謝lordbaby給我提供這個函數(shù),我把這個函數(shù)放到這里來,以便幫助更多許要的朋友。

代碼如下:

?--計算地球上兩個坐標(biāo)點(經(jīng)度,緯度)之間距離sql函數(shù)??  ????--作者:lordbaby??  ????--整理:www.aspbc.com???  ????CREATE?FUNCTION?[dbo].[fnGetDistance](@LatBegin?REAL,?@LngBegin?REAL,?@LatEnd?REAL,?@LngEnd?REAL)?RETURNS?FLOAT??  ??????AS??  ????BEGIN??  ??????--距離(千米)??  ??????DECLARE?@Distance?REAL??  ??????DECLARE?@EARTH_RADIUS?REAL??  ??????SET?@EARTH_RADIUS?=?6378.137????  ??????DECLARE?@RadLatBegin?REAL,@RadLatEnd?REAL,@RadLatDiff?REAL,@RadLngDiff?REAL??  ??????SET?@RadLatBegin?=?@LatBegin?*PI()/180.0????  ??????SET?@RadLatEnd?=?@LatEnd?*PI()/180.0????  ??????SET?@RadLatDiff?=?@RadLatBegin?-?@RadLatEnd????  ??????SET?@RadLngDiff?=?@LngBegin?*PI()/180.0?-?@LngEnd?*PI()/180.0?????  ??????SET?@Distance?=?2?*ASIN(SQRT(POWER(SIN(@RadLatDiff/2),?2)+COS(@RadLatBegin)*COS(@RadLatEnd)*POWER(SIN(@RadLngDiff/2),?2)))??  ??????SET?@Distance?=?@Distance?*?@EARTH_RADIUS????  ??????--SET?@Distance?=?Round(@Distance?*?10000)?/?10000????  ??????RETURN?@Distance??  ????END
-跟坐標(biāo)距離小于5公里的數(shù)據(jù)??  ????SELECT?*?FROM?商家表名?WHERE?dbo.fnGetDistance(121.4625,31.220937,longitude,latitude)?<p>這里的longitude,latitude分別是酒店的經(jīng)度和緯度字段,而121.4625,31.220937是手機(jī)得到的當(dāng)前客戶所在的經(jīng)度,后面的5表示5公里范圍之內(nèi)。</p><p>【相關(guān)推薦】</p><p>1.?<a href="http://www.php.cn/php/php-tp-demand.html" target="_blank">查詢</a></p><p>2.?<a href="http://www.php.cn/php/php-tp-demand.html" target="_blank">查詢</a></p><p>3.<a href="http://www.php.cn/php/php-tp-demand.html" target="_blank">查詢</a></p>

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊15 分享