純量涵式:
View Code
create FUNCTION dbo.fn_GetDistance ( @LngBegin REAL, @LatBegin REAL, @LngEnd REAL, @LatEnd REAL ) RETURNS FLOAT AS BEGIN DECLARE @Distance REAL DECLARE @EARTH_RADIUS REAL SET @EARTH_RADIUS = 6378.137 --地球半徑 已經是除以1000的值,所以後面計算出來的是千米及公裡 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
調用方法:方法名稱前面一定要加 dbo.
--參數1:開始經度 參數2:開始緯度 參數3:結束點經度 參數4:結束點緯度
select dbo.fn_GetDistance(115.9856,36.4507,115.75,36.12)
select dbo.fn_GetDistance('115.9856','36.4507','115.75','36.12')
以上列印出結果為:如,單位為公裡或千米
DBO是每個資料庫的預設使用者,具有所有者許可權,即DbOwner
通過用DBO作為所有者來定義對象,能夠使資料庫中的任何使用者引用而不必提供所有者名稱。
比如:你以User1登入進去並建表Table,而未指定DBO,
當使用者User2登進去想訪問Table時就得知道這個Table是你User1建立的,要寫上User1.Table,如果他不知道是你建的,則訪問會有問題。
如果你建表時把所有者指給了Dbo,則別的使用者進來時寫上Dbo.Table就行了,不必知道User1。
不光表是如此,視圖等等資料庫物件建立時也要如此才算是好。
建表、預存程序、視圖等資料庫物件時,其對應的所有者是建立它的使用者。則除了該使用者其他登入使用者要引用這些東東時,都要加上首碼,很是麻煩。而且,程式因此易出錯,你查來查去問題確出在這,浪費你時間。
C#的實現方法,原理與上面的是一樣的,網路上搜集到的。兩種方法的原理一樣,因為結果也是一樣的
View Code
/// <summary> /// 計算地球上任意兩點距離 /// </summary> /// <param name="long1"></param> /// <param name="lat1"></param> /// <param name="long2"></param> /// <param name="lat2"></param> /// <returns>返回長度單位是米</returns> private static double Distance(double long1, double lat1, double long2, double lat2) { double a, b, R; R = 6378137; //地球半徑 lat1 = lat1 * Math.PI / 180.0; lat2 = lat2 * Math.PI / 180.0; a = lat1 - lat2; b = (long1 - long2) * Math.PI / 180.0; double d; double sa2, sb2; sa2 = Math.Sin(a / 2.0); sb2 = Math.Sin(b / 2.0); d = 2 * R * Math.Asin(Math.Sqrt(sa2 * sa2 + Math.Cos(lat1) * Math.Cos(lat2) * sb2 * sb2)); return d; }
C#方法2
google maps的指令碼裡代碼
/** * google maps的指令碼裡代碼 */ private const double EARTH_RADIUS = 6378.137; private static double rad(double d) { return d * Math.PI / 180.0; } /** * 根據兩點間經緯度座標(double值),計算兩點間距離,單位為米 */ public static double GetDistance(double lat1, double lng1, double lat2, double lng2) { double radLat1 = rad(lat1); double radLat2 = rad(lat2); double a = radLat1 - radLat2; double b = rad(lng1) - rad(lng2); double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a / 2), 2) + Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Pow(Math.Sin(b / 2), 2))); s = s * EARTH_RADIUS; s = Math.Round(s * 10000) / 10000; return s; }
調用方法:
double dis = Distance(115.9856, 36.4507, 115.75, 36.11);
double dis1 = GetDistance(36.4507, 115.9856,36.11,115.75);
Response.Write("兩點之間的距離:"+dis+"---"+dis1);