根据经纬度计算两点之间的距离、点到直线的距离

以下内容适合初学者,我用来评估跑路径跟踪结果的代码。

简单的看了其他人的博客,基本都是用半正矢公式(Haversine formula)计算距离的。

其中,a=lat1-lat2(经度差);b=lon1-lon2(纬度差);

计算函数如下,找半天不知道地球半径该取多少,但是实际算起来差距不明显,反正都用这个算法了,对精度要求也不高。

#include
#include
using namespace std;
#define PI  3.1415926535897932384626
#define R0 6378137//地球半径m
#define D2R    (PI/180.0)    
#define R2D    (180.0/PI)

先定义一些要用到数据。下面是计算两点距离的公式,经纬度感觉不用转换成度分秒表示:

double Getdistance(double Lon1, double Lat1, double Lon2, double Lat2)
{//半正矢公式(Haversine formula):
    //经纬度先转换为角度制 rad
    double rLon1 = Lon1 * D2R;
    double rLon2 = Lon2 * D2R;
    double rLat1 = Lat1 * D2R;
    double rLat2 = Lat2 * D2R;
    double a = rLat1 - rLat2;
    double b = rLon1 - rLon2;
    double below_sqrt = sin(a / 2) * sin(a / 2) + cos(rLat1) * cos(rLat2) *sin(b / 2) * sin(b / 2);
    double Long = 2 * asin(sqrt(below_sqrt)) * R0;
    //tip:asin的取值范围是[-pi/2,pi/2]
    return Long;
}

看别人的思路用了海伦公式计算面积,然后当成平面算距离,不过这适用于近距离的3个点,对精度要求也不高的情况。(同样只考虑了一种情况,三点构成锐角三角形)

经纬坐标系中求点到线段距离的方法_ufoxiong21的博客-CSDN博客_经纬度点到直线距离

double Halun(double aa ,double bb,double cc)
{
    double pp = (aa + bb + cc) / 2;
    double S = sqrt(pp*(pp-aa)*(pp-bb)*(pp-cc));//面积
    return S;
}

下面为点到线段距离的函数,lat1,lon1,lat2, lon2为两个构成线段的点,lat3,lon3为要计算的到前面的线段距离的点。

double GetDotToLine(double lon1, double  lat1, double lon2, double lat2, double lon3, double lat3)
{
    double d1 = Getdistance(lon1, lat1, lon2, lat2);//起始点距离
    cout << "起始点距离=" << d1 << endl;
    double a = d1;
    double b = Getdistance(lon1, lat1, lon3, lat3);
    cout << "点到起点距离=" << b << endl;
    double c = Getdistance(lon2, lat2, lon3, lat3);
    cout << "点到终点距离=" << c << endl;
    double PointToLine = 2 * Halun(a, b, c) / a;
    cout << "点到直线距离=" << PointToLine << endl;
    return PointToLine;
}

主函数如下

int main() {
    double lon1, lon2, lon3;
    double lat1, lat2, lat3;
    lat1 = 30.885327;
    lat2 = 30.884438;
    lon1 = 120.072081;
    lon2 = 120.072986;//两个要构成的线段的点的坐标

    lat3 = 30.884991;
    lon3 = 120.072346;//第三个点的坐标

    double d = GetDotToLine(lon1, lat1, lon2, lat2, lon3, lat3);

    system("pause");
    return 0;
}

在VS2019下运行,距离单位全部是m,要计算两点距离,直接在main调用Getdistance(lon1, lat1, lon2, lat2);就行,测试结果如下:

根据经纬度计算两点之间的距离、点到直线的距离_第1张图片

 

你可能感兴趣的:(导航,c++)