根据起始点经纬度、方向、距离,计算目标点经纬度

以为有公式,百度不到,谷歌的看不懂(再次强调英文重要性),咬牙自己算,就当做小学数学题了。

注:自己随便写的,仅作参考。。。

#include <iostream>
#include <math.h>

using namespace std;

#define PI 3.14159265358979323846264338327950288

static bool status = false;

/*
*   起始点为 A,终点为 B(位于 A 点东北方),标出点 C(与 A 点同经度,与 B 点同纬度)
*   A、B 间空间直线距离用 ab 表示,A、B 间表面弧长用 AB 表示
*   1、由 AB 可以得到 ab;
*   2、再由航向角得到 ac 与 bc;
*   3、再根据地球半径得到 AC 与 BC,还有对象的弧度;
*   4、由 AC 与 地球半径可以得到纬度偏移量;
*   5、由 BC 与 已知纬度,可以得到经度偏移量
* 
*   地球假定为规则圆球,半径为 6371.393 千米
*   参数:起始点经度、纬度、航向角、两起止点距离
*/
bool CalTitude(double longitude0, double latitude0, double& longitude1, double& latitude1, double angle, double distance)
{    
    if (!status)
    {
        return false;
    }
    double R = 6371.393;        //地球半径
    double AB = distance;       //行进距离
    double ang = angle / 180 * PI;       //角BAC
    double lon0 = longitude0 / 180 * PI;
    double lat0 = latitude0 / 180 * PI;

    double nAB = AB / R;       //AB 对应的圆心角

    double ab = R * sin(nAB / 2) * 2;

    double ac = ab * cos(ang);
    double bc = ab * sin(ang);
    
    double nAC = asin(ac / R) * 2;      //AC 对应的圆心角
    double nBC = asin(bc / R) * 2;      //BC 对应的圆心角

    double lat1 = lat0 + nAC;           //B、C 两点的纬度角

    double r = R * cos(lat1);      //纬度圈半径

    double nbc = asin(bc / (2 * r)) * 2;          //纬度圈经度偏移量

    longitude1 = longitude0 + nbc * 180 / PI;
    latitude1 = lat1 * 180 / PI;

    return true;
}


/*
* 扩充上方函数,加一个壳,使用上方函数记录差值,然后在此函数中累加差值,可以得到实际目标经纬度
*/
bool CalTitude(double longitude0, double latitude0, double& longitude1, double& latitude1, double angle, double distance, bool b)
{
    if (!b)
    {
        return false;
    }
    else
    {
        status = true;
    }

    if (angle >= 0 && angle <= 90)
    {
        CalTitude(longitude0, latitude0, longitude1, latitude1, angle, distance);
    }
    else if (angle >= 90 && angle <= 180)
    {
        CalTitude(longitude0, latitude0, longitude1, latitude1, 180 - angle, distance);
        //起始点加上经度差值,减去纬度差值
        latitude1 -= 2 * (latitude1 - latitude0);
    }
    else if (angle >= 180 && angle <= 270)
    {
        CalTitude(longitude0, latitude0, longitude1, latitude1, angle - 180, distance);
        //起始点减去经度差值,减去纬度差值
        longitude1 -= 2 * (longitude1 - longitude0);
        latitude1 -= 2 * (latitude1 - latitude0);
    }
    else if (angle >= 270 && angle <= 360)
    {
        CalTitude(longitude0, latitude0, longitude1, latitude1, 360 - angle, distance);
        //起始点减去经度差值,加上纬度差值
        longitude1 -= 2 * (longitude1 - longitude0);
    }
    else
    {
        return false;
    }
    return true;
}

int main()
{
    double l1 = 0;
    double l2 = 0;
    CalTitude(123, 5, l1, l2, 120, 100, true);

    cout << l1 << endl;
    cout << l2 << endl;

    return 0;
}

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值