经纬坐标系中求点到线段距离的方法

       在一些地图的应用中(如求偏航),常常需要求一个点到一条线程的距离,以判断是否远离航线。然而在经纬度坐标中,并没有类似直角坐标系中的公式来计算。在经纬度中,一般应用最广的公式是求两点距离的方法,如何通过两点之间的距离公式来达到计算出点到线段的方法呢,我们先来看在经纬度中求两点距离的计算方法。

一、经纬度中求两点距离的计算方法

       网上有很多介绍该计算方法,此处不再 一一阐述。在北半球中:

       C = sin(LatA*Pi/180)*sin(LatB*Pi/180) + cos(LatA*Pi/180)*cos(LatB*Pi/180)*cos((MLonA-MLonB)*Pi/180)

       Distance = R*Arccos(C)*Pi/180

       注1:其中LonA、LatA、LonB、LatB分别是A、B两个点的经纬度值,其中三角函数的输入和输出都采用弧度值

       注2:R(地球半径)和Distance单位是相同,如果是采用6378.137千米作为半径,那么Distance就是千米为单位

      C语言代码:

double getDistanceBtwP(double LonA, double LatA,double LonB, double LatB)//根据两点经纬度计算距离,X经度,Y纬度
{
    double radLng1 = LatA * M_PI / 180.0;
    double radLng2 = LatB * M_PI / 180.0;
    double a = radLng1 - radLng2;
    double b = (LonA - LonB) * M_PI/ 180.0;
    double s = 2 * asin(sqrt(pow(sin(a / 2), 2)+ cos(radLng1) * cos(radLng2) * pow(sin(b / 2), 2))) * 6378.137;	//返回单位为公里
    return s;
}
二、经纬坐标中求点到线段的距离的方法

        在经纬坐标系中,求点C(LonC,LatC)到以点A(LonA,LatA)和点B(LonB,LatB)为端点的线段的距离D。此问题可以分为三种情况:

       

        ①点C在线段AB的正上方时,则距离D=点C到直线AB的垂直距离,如图1;

        ②AC与AB形成钝角时,则距离D=线段AC的长度,如图2;

        ③BC与AB形成钝角时,则距离D=线段BC的长度,如图3;

        1、首先如何判断是属于哪种情况

        我们可以利用勾股定理逆定理的推广,假如AB、BC、AC的长度分别为a,b,c

        ①若b*b+c*c<a*a,则边a所对的角为钝角,即图1的情况;

        ②若a*a+c*c<b*b,则边b所对的角为钝角,即图2的情况;

        ③若a*a+b*b<c*c,则边c所对的角为钝角,即图3的情况;

        2、求图1情况的距离D

        我们希望可以通过距离公式即可求出距离D,从而联想到海伦公式。

       在海伦公式中,三角形的面积,其中,则距离D=2S/a;

三、计算方法总结

       对于图1情况以及计算出,对于图2和图3的计算均已转换为两个点之间的距离公式,此处不再累赘。因此,在经纬度坐标系中,求点到线段的距离的C语言代码如下:

//点PCx,PCy到线段PAx,PAy,PBx,PBy的距离
double GetNearestDistance(double PAx, double PAy,double PBx, double PBy,double PCx, double PCy)
{     
	double a,b,c;  
	a=getDistanceBtwP(PAy,PAx,PBy,PBx);//经纬坐标系中求两点的距离公式
	b=getDistanceBtwP(PBy,PBx,PCy,PCx);//经纬坐标系中求两点的距离公式
	c=getDistanceBtwP(PAy,PAx,PCy,PCx);//经纬坐标系中求两点的距离公式
	if(b*b>=c*c+a*a)return c;   
	if(c*c>=b*b+a*a)return b;  
	double l=(a+b+c)/2;     //周长的一半   
	double s=sqrt(l*(l-a)*(l-b)*(l-c));  //海伦公式求面积 
	return 2*s/a;   
}
        第一次发博文,不对之处敬请各位学者提出修改意见,不胜感激!


        



      

  • 12
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值