計算地理位置之間的距離


 .net 根據坐標,計算指定范圍內的最大最小經緯度、根據兩點間經緯度坐標(double值),計算兩點間距離(注意:這里的單位是米)

 #region 根據坐標,計算指定范圍內的最大最小經緯度、根據兩點間經緯度坐標(double值),計算兩點間距離,單位為米

        private static double PI = Math.PI; //3.14159265;  //π
        private static double EARTH_RADIUS = 6378137;    //地球半徑
        private static double RAD = Math.PI / 180.0;   //   π/180



        #region 根據坐標,計算指定范圍內的最大最小經緯度
        /// <summary>
        /// 根據坐標,計算指定范圍內的最大最小經緯度
        /// </summary>
        /// <param name="lng">經度</param>
        /// <param name="lat">緯度</param>
        /// <param name="raidus">范圍(米)</param>
        /// <returns>返回最大、最小經緯度minLng, minLat, maxLng, maxLat</returns>
        public double[] getAround(double lng, double lat, int raidus)
        {
            //The circumference of the earth is 24,901 miles.
            //24,901/360 = 69.17 miles / degree  

            Double latitude = lat;
            Double longitude = lng;

            Double degree = (24901 * 1609) / 360.0;   //地球的周長是24901英里
            double raidusMile = raidus;

            //先計算緯度
            Double dpmLat = 1 / degree;
            Double radiusLat = dpmLat * raidusMile;
            Double minLat = latitude - radiusLat;
            Double maxLat = latitude + radiusLat;

            //計算經度
            Double mpdLng = degree * Math.Cos(latitude * (PI / 180));  //緯度的余弦
            Double dpmLng = 1 / mpdLng;
            Double radiusLng = dpmLng * raidusMile;
            Double minLng = longitude - radiusLng;
            Double maxLng = longitude + radiusLng;
            //System.out.println("["+minLat+","+minLng+","+maxLat+","+maxLng+"]");
                               //最小經度,最小緯度,最大經度,最大緯度
            return new double[] { minLng, minLat, maxLng, maxLat };
        }
        #endregion


        #region 根據兩點間經緯度坐標(double值),計算兩點間距離,單位為米
        /// <summary>
        /// 根據兩點間經緯度坐標(double值),計算兩點間距離,單位為米
        /// </summary>
        /// <param name="lng1">經度1</param>
        /// <param name="lat1">緯度1</param>
        /// <param name="lng2">經度2</param>
        /// <param name="lat2">緯度2</param>
        /// <returns>返回距離(米)</returns>
        public double getDistance(double lng1, double lat1, double lng2, double lat2)
        {
            double radLat1 = lat1 * RAD;  // // RAD=π/180
            double radLat2 = lat2 * RAD;
            double a = radLat1 - radLat2;
            double b = (lng1 - lng2) * RAD;
            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;
        }

        #endregion

        #endregion


 

sql:計算地球上兩個坐標點(經度,緯度)之間距離sql函數(注意:這里的單位是千米)

go   


--計算地球上兩個坐標點(經度,緯度)之間距離sql函數 
 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 

sql轉自:http://www.aspbc.com/tech/showtech.asp?id=1136
百度地圖獲取兩點間的距離在線測試:http://developer.baidu.com/map/jsdemo.htm#a6_1

 


免責聲明!

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



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