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

tech2022-12-05  125

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

#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; }

 

最新回复(0)