[分享]计算地球上的点到一条直线的距离的算法

介绍一种原创算法,用于计算地球表面上一个动态点到已知直线的垂直距离,适用于短距离高精度需求场景,如3公里范围内,误差在厘米级别。该算法基于三角形面积原理,考虑纬度变化及地球曲率影响。

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

分享一个原创的地球上点到线的距离计算方法
https://www.amobbs.com/thread-5728196-1-1.html
(出处: amoBBS 阿莫电子论坛)

描述如下,已知一条直线,直线的2端的GPS坐标已经精确测定,分别是(X1,Y1)   (X2,Y2),  当另一个点(x,y)慢慢的靠近这条线时,求这个点到线的距离, 这个会动的点的坐标是实时测量的,会变,  要连续的计算点的线的距离,根据距离来做下一步操作, 

这个程序计算出来是有误差的,因为它只考虑了纬度的变化,没有完整考虑地球的曲率。
我测试的情况是,点与线的距离范围在3KM之内,且线的长度在3KM内时,误差在cm级。
不知道这个东西用处大不大
先上程序。

/*计算点到线的距离 垂直距离  此计算方法适用于近距离计算,采用的是三角形计算面积
x,y机车所在点 纬度与经度
x1,y1,x2,y2为已知两点的直线  ( 纬度与经度为扩大1亿倍的长整形)
*/
 

#include <stdlib.h>
#define PI 3.1415926535898
#define EARTHR 6371004 
#define DIS_RANGE        5000//2698
long long Distance_point2line(long long x, long long y, long long x1, long long y1, long long x2, long long y2)
{
        long long Distance;
        long long a,b;
        long long h,v;        //垂直距离与水平距离
        double        cos_value;
        /**
        * 随着纬度的升高,纬度1圈的周长不断变短,  到南北极点,长度变成0.
        */
        cos_value=cos(x/100000000*PI/180);
        if((x1!=x2)&&(y1!=y2))
        {
                a=(x2-x1)*(y-y1)/(y2-y1)+x1;//计算出点到直线的x方向的投影
                b=(y2-y1)*(x-x1)/(x2-x1)+y1;//计算出点到直线的y方向的投影
                v=llabs(x-a);   //计算出点到直线的x方向上的距离     //计算出的单位为cm
                h=llabs(y-b)*cos_value;//计算出点到直线的y方向上的距离
                Distance=(EARTHR)*PI* h*v/sqrt(h*h+v*v)/180000000; //计算出的单位为cm
        }
        else if(x1==x2)
        {
                h=0;
                v=llabs(x-x1);
                Distance=(EARTHR)*PI* v /180000000;         //计算出的单位为cm
        }
        else if(y1==y2)
        {        h=llabs(y-y1)*cos_value;
                v=0;        
                Distance=(EARTHR)*PI* h /180000000;         //计算出的单位为cm
        }        
        printf("dis:%lldcm\r\n",Distance);
        return Distance ;                
}

具体是利用的直角三角形的 长*宽 =斜边的长*高 这一原理,MARk学习一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值