0
点赞
收藏
分享

微信扫一扫

用经纬度计算距离

Scheme 1:


关于用经纬度计算距离:


 地球赤道上环绕地球一周走一圈共 40075.04公里, 而@一圈分成360°,而每1°(度)有60', 每一度一秒在赤道上的长度计算如下:


 40075.04km/360°=111.31955km


 111.31955km/60'=1.8553258km=1855.3m


 而每一分又有60秒, 每一秒就代表 1855.3m/60=30.92m


 任意两点距离计算公式为


 d=111.12cos{1/[sinΦAsinΦB十 cosΦAcosΦBcos(λB—λA)]}


 其中A点经度,纬度分别为λA和ΦA,B点的经度、纬度分别为λB和ΦB,d为距离。



表 Select NLat As 纬度,NLon As 经度 From t_Data_G0001 Where STID='' And DStampTime='';

   Select LLat As 纬度2,LLon As 经度2 From o_GISLabel Where SID =@SID;

 时间为基准



经纬度的计算函数是这样的:

double D_jw(double wd1,double jd1,double wd2,double jd2) 
{ 
    double x,y,out; 
    double PI=3.14159265; 
    double R=6.371229*1e6; 

    x=(jd2-jd1)*PI*R*cos( ((wd1+wd2)/2) *PI/180)/180; 
    y=(wd2-wd1)*PI*R/180; 
    out=hypot(x,y); 
    return out/1000; 
} 

//Not Accurate



Scheme 2:


c# 根据经纬度计算两点之间的距离。项目中实际使用。大家放心使用。


public static double Fun_Rad(double d)

        {

            return d * Math.PI / 180.0;

        }

        public static double Fun_GetDistance(double lat1, double lng1, double lat2, double lng2)

        {

            double d_EarthRadius = 6378.137;

            double radLat1 = Fun_Rad(lat1);

            double radLat2 = Fun_Rad(lat2);

            double radLat = Fun_Rad(lat1) - Fun_Rad(lat2);

            double radLng = Fun_Rad(lng1) - Fun_Rad(lng2);

            double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(radLat / 2), 2) +

             Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Pow(Math.Sin(radLng / 2), 2)));

            s = s * d_EarthRadius;

            s = Math.Round(s * 10000) / 10000;

            return s;

//More Accurate

Scheme 3:


C# co de

// 计算已知经纬度的两点间的距离 // Thu 2005.08.04 using System; struct JWD { double JD, JF, JM; double WD, WF, WM; public double Jd, Wd, J, W; public const double Ea = 6378137 ; // 赤道半径 public const double Eb = 6356725 ; // 极半径 public readonly double Ec; public readonly double Ed; // 构造函数, 经度: a 度, b 分, c 秒; 纬度: d 度, e 分, f 秒 public JWD( double a, double b, double c, double d, double e, double f) { JD = a; JF = b; JM = c; WD = d; WF = e; WM = f; Jd = JD + JF / 60 + JM / 3600 ; Wd = WD + WF / 60 + WM / 3600 ; J = Jd * Math.PI / 180 ; W = Wd * Math.PI / 180 ; Ec = Eb + (Ea - Eb) * ( 90 - Wd) / 90 ; Ed = Ec * Math.Cos(W); } } class Test { static void Main() { JWD A0 = new JWD( 120 , 36 , 0 , 28 , 0 , 0 ); JWD A1 = new JWD( 130 , 0 , 0 , 30 , 0 , 0 ); Calc(A0, A1); } static void Calc(JWD A, JWD B) { double dx = (B.J - A.J) * A.Ed; double dy = (B.W - A.W) * A.Ec; double d = Math.Sqrt(dx * dx + dy * dy); Console.WriteLine( " {0:N1}M " , d); } }


举报

相关推荐

0 条评论