参考博客1:
已知一点经纬度和移动距离,计算下一点经纬度,理论模型
简单的圆和扇形弧长公式推导,原文公式看起来没问题,但注意先计算纬度,再计算经度,因为经度的计算依赖当前纬度。

参考博客2:
已知两点经纬度,计算两点距离
抄了里面googleMap的算法。

其它:
腾讯地图坐标拾取工具

实现:

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

/* 长度单位统一为m */
double Pi = 3.1415926;
double Earth_ARC = 6371.393 * 1000;

/* 角度转弧度 */
double rad(const double& a) {
    return a * Pi / 180;
}

/* 注意应先更新纬度,再更新经度,因为新的经度依赖更新后的纬度 */

/* 更新经度 */
double calc_new_long(const double& long_old, const double& lat, const double& move_x) {
    double res = long_old + move_x * 180 / (Pi * Earth_ARC * cos(rad(lat)));
    return res;
}

/* 更新纬度 */
double calc_new_lat(const double& lat_old, const double& move_y) {
    double res = lat_old + 180 * move_y / (Pi * Earth_ARC);
    return res;
}

/* 由经纬度计算两点距离,抄的googleMap */
double calc_dist(double lon1, double lat1, double lon2, double lat2) {
    double radLat1 = rad(lat1);
    double radLat2 = rad(lat2);
    double a = radLat1 - radLat2;
    double b = rad(lon1) - rad(lon2);
    double s = 2 * asin(sqrt(pow(sin(a / 2), 2) + cos(radLat1) * cos(radLat2) * pow(sin(b / 2), 2)));
    s = s * Earth_ARC;
    s = round(s * 10000) / 10000;
    return s;
}

int main() {
    
    /* 模拟数据 */
    double lati_old = 30.291042;
    double longti_old = 120.213131;
    
    /* 东北天坐标系,向东移动1000米,向北移动1000米 */
    double move_x = 1000;
    double move_y = 1000;

    /* 计算新的经纬度 */
    double new_lati = calc_new_lat(lati_old, move_y);
    double new_longti = calc_new_long(longti_old, new_lati, move_x);

    /* 反算距离验证 */
    std::cout << new_lati << "," << new_longti << "\n";
    std::cout << calc_dist(longti_old, lati_old, new_longti, new_lati);
}

模拟了向东北各移动1000米,用新的经纬度反算距离验证,是没问题的。


MorpheusDong
4 声望0 粉丝