SQL SERVER 根據地圖經緯度計算距離函數

前些天客戶提出一個這樣的要求:一個手機訂餐網,查詢當前所在位置的5千米範圍的酒店,而後客戶好去吃飯。
拿到這個請求後,不知道如何下手,靜靜地想了一下,在酒店的表中增長兩個字段,用來存儲酒店所在的經度和緯度,當訂餐的時候,要求手機獲得當前客戶所在的經度和緯度傳過來,再與數據庫中酒店的經度和緯度計算一下,就查出來。javascript

爲了在數據庫中查詢兩點之間的距離,因此這個函數須要在數據庫中定義。java

我網上找了好久,卻沒有找到這個函數。最後在CSDN上,一個朋友的幫助下解決了這個問題,很是感謝lordbaby給我提供這個函數,我把這個函數放到這裏來,以便幫助更多許要的朋友。mysql

 

[sql]  view plain  copy
 
 print?在CODE上查看代碼片派生到個人代碼片
  1. --計算地球上兩個座標點(經度,緯度)之間距離sql函數  
  2. --做者:lordbaby  
  3. --整理:www.aspbc.com   
  4. CREATE FUNCTION [dbo].[fnGetDistance](@LatBegin REAL, @LngBegin REAL, @LatEnd REAL, @LngEnd REAL) RETURNS FLOAT  
  5.   AS  
  6. BEGIN  
  7.   --距離(公里)  
  8.   DECLARE @Distance REAL  
  9.   DECLARE @EARTH_RADIUS REAL  
  10.   SET @EARTH_RADIUS = 6378.137    
  11.   DECLARE @RadLatBegin REAL,@RadLatEnd REAL,@RadLatDiff REAL,@RadLngDiff REAL  
  12.   SET @RadLatBegin = @LatBegin *PI()/180.0    
  13.   SET @RadLatEnd = @LatEnd *PI()/180.0    
  14.   SET @RadLatDiff = @RadLatBegin - @RadLatEnd    
  15.   SET @RadLngDiff = @LngBegin *PI()/180.0 - @LngEnd *PI()/180.0     
  16.   SET @Distance = 2 *ASIN(SQRT(POWER(SIN(@RadLatDiff/2), 2)+COS(@RadLatBegin)*COS(@RadLatEnd)*POWER(SIN(@RadLngDiff/2), 2)))  
  17.   SET @Distance = @Distance * @EARTH_RADIUS    
  18.   --SET @Distance = Round(@Distance * 10000) / 10000    
  19.   RETURN @Distance  
  20. END  

 

[sql]  view plain  copy
 
 print?在CODE上查看代碼片派生到個人代碼片
  1. --經度 Longitude 簡寫Lng,  緯度 Latitude 簡寫Lat  
  2. --跟座標距離小於5千米的數據  
  3. SELECT * FROM 商家表名 WHERE dbo.fnGetDistance(121.4625,31.220937,longitude,latitude) < 5  

 

這裏的longitude,latitude分別是酒店的經度和緯度字段,而121.4625,31.220937是手機獲得的當前客戶所在的經度,後面的5表示5千米範圍以內。git

JS版本sql

 

[javascript]  view plain  copy
 
 print?在CODE上查看代碼片派生到個人代碼片
    1. function toRadians(degree) {  
    2.     return degree * Math.PI / 180;  
    3. }  
    4. function distance(latitude1, longitude1, latitude2, longitude2) {  
    5.     // R is the radius of the earth in kilometers  
    6.     var R = 6371;  
    7.     var deltaLatitude = toRadians(latitude2-latitude1);  
    8.     var deltaLongitude = toRadians(longitude2-longitude1);  
    9.     latitude1 =toRadians(latitude1);  
    10.     latitude2 =toRadians(latitude2);  
    11.     var a = Math.sin(deltaLatitude/2) *  
    12.     Math.sin(deltaLatitude/2) +  
    13.     Math.cos(latitude1) *  
    14.     Math.cos(latitude2) *  
    15.     Math.sin(deltaLongitude/2) *  
    16.     Math.sin(deltaLongitude/2);  
    17.     var c = 2 * Math.atan2(Math.sqrt(a),  
    18.     Math.sqrt(1-a));  
    19.     var d = R * c;  
    20.     return d;  
    21. }  
相關文章
相關標籤/搜索