参考博客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米,用新的经纬度反算距离验证,是没问题的。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。