• 空间直接坐标系(XYZ)转经纬度(BLH)


    本章首先介绍空间直角坐标系与大地坐标系,然后列出XYZ转换BLH的公式,最后基于C语言完成该部分代码设计。

     

    参考书籍:

    董大男,陈俊平,王解先等,GNSS高精度定位原理,科学出版社

    黄丁发,熊永良,周乐韬等,GPS卫星导航定位技术与方法,科学出版社。

     

    公式原理 

    空间直角坐标系

    空间直角坐标系原点位于参考椭球的中心,Z轴指向参考椭球的北极,X轴指向首子午面与赤道的交点,Y轴位于赤道面上,且按右手坐标系与X轴呈90°夹角。某点在空间中坐标可用该店在次坐标系的各个坐标轴上的投影来表示。(如下图所示)

    3f0442224b8e4ea4a5c3b1ccf9b4a642.png

    空间直角坐标系

    大地坐标系

    空间大地坐标系是采用大地经纬度和大地高来描述空间位置的(下图)。维度是指P点的法线与赤道面的夹角,用B(-90°~ 90°)表示,向北为正称为北纬,向男为负称为南纬。经度是指P点的参考椭球子午面与起始子午面的二面角,用L表示(-180°~180°),由起始子午面起算,向东为正称为东京,向西为负称为西经。大地高是空间点沿该法线到椭球面的距离,用H表示,向上为正,向下为负。

    fa4e05bf012d40e890db86c43864086d.png

    空间大地坐标系

     

    XYZ转BLH

    空间直角坐标系(X,Y,Z)与大地坐标系 (B,L,H)关系如下:

    d7a99d605bb34c48b8a46124a5af2173.png

    式中:N为某点P的卯酉圈半径;(B,L,H)为P点的大地坐标系,卯酉圈半径N公式如下:

    5ac0f7a5c1ce4fb4be1237d18d252806.png

    式中:a为椭球长半轴,b为椭球短半轴,gif.latex?e%3D%5Cfrac%7B%5Csqrt%7Ba%5E%7B2%7D-b%5E%7B2%7D%7D%7D%7Ba%7D为第一离心率,B为大地维度。不难看出,大地维度是关于自身的函数,需要迭代求解。计算方式如下:

    be9f3670cc2b458dbdd90b55b51093e6.png

    初始迭代时,设:

    ff83555d518a446d9c0b1bf409fb4673.png

     于是:

    cea2359100274a78a6a949cc2fc34abf.png

    当ΔH<0.001m,B的经度保证在0.001秒即可停止迭代。

    关于上述代码的详细推导过程,请参考charlee44博主的大地经纬度坐标与地心地固坐标的的转换

     

    程序设计

    1. #define a 6378137.0//长半轴
    2. #define f (1 / 298.257223563)//扁率
    3. #define e2 (f*(2-f))//第一偏心率平方
    4. //经纬度转换(弧度)
    5. BLH XYZtoLB(double X, double Y, double Z)
    6. {
    7. BLH res = { 0 };
    8. double B = 0.0, N = 0.0, H = 0.0, R0, R1, deltaH, deltaB;
    9. R0 = sqrt(pow(X, 2) + pow(Y, 2));
    10. R1 = sqrt(pow(X, 2) + pow(Y, 2) + pow(Z, 2));
    11. //经度直接求解
    12. res.L = atan2(Y, X);
    13. //迭代求大地维度和大地高
    14. N = a;
    15. H = R1 - a;
    16. B = atan2(Z * (N + H), R0 * (N * (1 - e2) + H));
    17. do
    18. {
    19. deltaH = N;//判断收敛所用
    20. deltaB = B;
    21. N = a / sqrt(1 - e2 * pow(sin(B), 2));
    22. H = R0 / cos(B) - N;
    23. B = atan2(Z * (N + H), R0 * (N * (1 - e2) + H));
    24. } while (fabs(deltaH - H) > 1.0e-3 && fabs(deltaB - B) > 1.0e-9);
    25. res.B = B;
    26. res.H = H;
    27. return res;
    28. }

    这里的精度控制可以自己尝试修改一下,看看有什么不同。 

    其中,BLH为用于传参的结构体,代码如下:

    1. //经纬度函数传参
    2. typedef struct BLH
    3. {
    4. double B;//维度
    5. double L;//经度
    6. double H;//高
    7. }BLH;

    代码部分与上述公式部分对应,代码并不复杂按公式来即可,求出测站的经纬度后,即可求出卫星的高度角、方位角,从而进行定权、误差改正等内容。

    卫星高度角、方位角求解可参考我的博客:求解卫星高度角、方位角


    补充:

            在程序设计中,因为浮点数保存精度的原因,应该尽量避免乘除法,有些公示进行了简单换算,同学们先自己换算一下。

     

  • 相关阅读:
    对比鸿蒙,Google 的 Fuchsia 当前进度如何?
    Matlab通信仿真系列——图形处理函数
    Kotlin~作用域函数let、run、apply、with
    Blender导出FBX给UE5
    Mac M1通过homebrew安装Redis报错(perl: unknown or unsupported macOS version: :dunno)
    Python实现猎人猎物优化算法(HPO)优化Catboost回归模型(CatBoostRegressor算法)项目实战
    在 vue-cli 构建的项目中配置使用资源CDN,加速我们的项目
    MySQL 中的锁有哪些类型,MySQL 中加锁的原则
    帆软FineReports使用超级链接导出excel出现错误代码:11300004没有找到模板文件
    “客户要将赠品换为折扣”,客服如何回复?
  • 原文地址:https://blog.csdn.net/why1472587/article/details/128190538