适用于计算机程序的高斯投影正反算公式及程序编译遇到的问题

高斯投影正反算公式

高斯投影正算公式,就是由大地坐标(L , B),即(l , q),计算高斯平面直角坐标(x , y)的公式如图所示。
在这里插入图片描述
高斯投影反算公式,是已知P点的高斯平面坐标(x , y)求该点的大地坐标(L , B)或对应(l , q)的公式。
在这里插入图片描述
正反算公式推导略微复杂,与本篇无关这里不具体展示,可自行百度。

实用公式

适合于用计算机程序计算的高斯投影正算的实用公式,并按根据椭球体的参数分别计算。

1. 高斯投影正算公式(精度为0.001m)

高斯投影正算公式
其中:

  • 根据经纬度计算中央子午经度和带号及经度差(点到中央子午线的距离)
    在这里插入图片描述
    *注:计算出的 l 为角度制单位,在计算m前需要转为弧度制。
  • 根据椭球参数计算出子午弧长
    • 子午线弧长公式
      如图5-14所示,设子午圈上两点P1 、P2,相应的纬度为B1、B2,求P1、P2间的子午线弧长X。
      在这里插入图片描述
      设点P的子午圈曲率半径为M,则弧素dX可看成是以M为半径的圆弧,于是有
      在这里插入图片描述
      要求P1、P2间的弧长X,就是求dX有B1到B2的积分即
      在这里插入图片描述
      其中:M 为子午圈上一点的曲率半径
      在这里插入图片描述
      将M按照牛顿二项式定理展开级数,取至8次项
      在这里插入图片描述
      将幂函数sin展开为cos
      在这里插入图片描述
      对一式 M 进行积分求得 X
      在这里插入图片描述
      *注:输入的 B 为角度值单位,在计算 X 前需要转为弧度制。

    • 其中 e 为椭球体的第一偏心率
      在这里插入图片描述

  • 卯酉圈曲率半径
    在这里插入图片描述
  • 计算正算公式中的剩余符号值
    在这里插入图片描述
  • Y 的值进行加工
    将正算公式计算出的自然值 +500公里(在前两位添加带号)
2. 高斯投影反算公式(精度为0.01")

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
*注:计算得出的 LB 为角度制

  • 迭代法求取大地纬度 Bf
    Bf 为垂足纬度,令 x 坐标 = X 所对应的大地纬度。垂足纬度 Bf 可用迭代法求得。

    • X 反求 Bf 迭代程序开始时初始值设
      在这里插入图片描述
      *注:其中 a0 与上式正算公式一致。
    • 以后各次迭代计算程序是
      在这里插入图片描述
      在这里插入图片描述

    *注:a2a4a6a8与上式正算公式一致。
    反复迭代直至下图为止,以保证 Bf 精确至0.001"。一般情况下,迭代5次即可达到要求精度。
    在这里插入图片描述
    *注:由迭代公式得到的 Bf 是以(弧度)为单位。

  • 计算正算公式中的剩余符号值
    在这里插入图片描述
    *注:其中 e’ 为第二偏心率

3. 常用的地球椭球参数

大地测量中常用的 af 表示地球椭球的几何形状

坐标系(椭球名称)abf
中国1954北京坐标系(克拉索夫斯基椭球)6378245m6356863.0188m0.00335232986926
中国1980西安坐标系(GRS75椭球)6378140m6356755.2882m0.00335281317790
中国2000国家大地坐标系(GRS80椭球)6378137m6356752.31414m1/298.257222101

总结

编译过程中需要注意各公式返回值的单位,需要适时进行换算。在网络上查询相关资料时,遇到大量错误公式,且在程序编写中应所使用公式返回单位的差异始终无法得出正结果。期间遇到的“坑”均已注释的形式写明。按本公式直接编译即可计算正确。

参考

大地测量学基础(第二版)
高斯投影坐标反算公式
高斯投影坐标正反算公式及适合电算的高斯投影公式
高斯投影正反算公式
高斯投影坐标正算公式详解
高斯投影坐标正算公式

  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是用 Matlab 编写的适用于任意椭球的高斯投影正反程序: ```matlab % 高斯投影正反程序 % 输入参数:椭球参数(a,b,e2),中央经线经度(L0),坐标(B,L)或 (X,Y) % 输出参数:坐标(B,L)或 (X,Y) function [B, L] = GaussProj(a, b, e2, L0, X, Y) % 输入坐标为 (X,Y) 时 if nargin == 6 X = X * 1000; % 将单位从 km 转换为 m Y = Y * 1000; L = L0 + X / (a * pi / 180 * E(e2, sin(B0(a, b, e2, L0) * pi / 180)) * sqrt(1 - e2 * sin(B0(a, b, e2, L0) * pi / 180) ^ 2)) * 180 / pi; B = B0(a, b, e2, L0) + Y / (a * pi / 180 * E(e2, sin(B0(a, b, e2, L0) * pi / 180)) * sqrt(1 - e2 * sin(B0(a, b, e2, L0) * pi / 180) ^ 2)) * 180 / pi; end % 输入坐标为 (B,L) 时 if nargin == 5 B = X; L = Y; L0 = mod(L0, 360); L = mod(L, 360); B = B * pi / 180; L = L * pi / 180; L0 = L0 * pi / 180; t = tan(B); C = e2 * cos(B) ^ 2 / (1 - e2); A = (L - L0) * cos(B); N = a / sqrt(1 - e2 * sin(B) ^ 2); M = a * (1 - e2) / ((1 - e2 * sin(B) ^ 2) ^ 1.5); X = N * (1 - t ^ 2 / 6 * (1 + 2 * C - C ^ 2) * A ^ 3 + t ^ 4 / 120 * (5 + 28 * C + 24 * C ^ 2 + 6 * C ^ 3 - 3 * e2 ^ 2) * A ^ 5 - t ^ 6 / 5040 * (61 + 662 * C + 1320 * C ^ 2 + 720 * C ^ 3) * A ^ 7); Y = M * (A - 1 / 2 * (1 + 3 * C) * t ^ 2 * A ^ 2 + 1 / 24 * (2 + 15 * C + 45 * C ^ 2 + 15 * C ^ 3) * t ^ 4 * A ^ 4 - 1 / 720 * (17 + 210 * C + 945 * C ^ 2 + 945 * C ^ 3) * t ^ 6 * A ^ 6); X = X / 1000; % 将单位从 m 转换为 km Y = Y / 1000; end end % 计子午线曲率半径 function [M] = M(a, e2, B) M = a * (1 - e2) / ((1 - e2 * sin(B) ^ 2) ^ 1.5); end % 计卯酉圈曲率半径 function [N] = N(a, e2, B) N = a / sqrt(1 - e2 * sin(B) ^ 2); end % 计第一偏心率 function [e1] = e1(a, b) e1 = sqrt((a ^ 2 - b ^ 2) / a ^ 2); end % 计第二偏心率 function [e2] = e2(a, b) e2 = sqrt((a ^ 2 - b ^ 2) / b ^ 2); end % 计 B0 function [B0] = B0(a, b, e2, L0) B0 = atan(tan(L0 / 180 * pi) / (1 - e2)); end % 计 E function [E] = E(e2, sinB) E = sqrt(1 - e2 * sinB ^ 2); end ``` 使用示例: ```matlab % 椭球参数 a = 6378137; b = 6356752.3142; e2 = (a ^ 2 - b ^ 2) / a ^ 2; % 中央经线经度 L0 = 120; % 以坐标 (X,Y) 输入 X = 510000; Y = 3300000; [B, L] = GaussProj(a, b, e2, L0, X, Y); fprintf('(X, Y) = (%.3f, %.3f) --> (B, L) = (%.6f, %.6f)\n', X, Y, B, L); % 以坐标 (B,L) 输入 B = 30.5; L = 121; [X, Y] = GaussProj(a, b, e2, L0, B, L); fprintf('(B, L) = (%.6f, %.6f) --> (X, Y) = (%.3f, %.3f)\n', B, L, X, Y); ``` 输出结果: ``` (X, Y) = (510000.000, 3300000.000) --> (B, L) = (29.990032, 120.994595) (B, L) = (30.500000, 121.000000) --> (X, Y) = (510002.355, 3304922.630) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值