sql server 純量值函式 計算兩個經緯度之間的距離

來源:互聯網
上載者:User

 

純量涵式:

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);

 

 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.