用经纬度计算距离

本文提供了三种不同的方案来计算地球上两点间基于经纬度的距离,包括简单的公式估算和更精确的球面三角公式计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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# code

// 计算已知经纬度的两点间的距离 // 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); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值