分享一个原创的地球上点到线的距离计算方法

这个程序已经STM32上实现,
描述如下,已知一条直线,直线的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;
        
        cos_value=cos(x/100000000*PI/180);
        if((x1!=x2)&&(y1!=y2))
        {
                a=(x2-x1)*(y-y1)/(y2-y1)+x1;
                b=(y2-y1)*(x-x1)/(x2-x1)+y1;
                v=llabs(x-a);        //计算出的单位为cm
                h=llabs(y-b)*cos_value;
                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 ;                
}

分享一个原创的地球上点到线的距离计算方法