高斯投影正、反算 代码

 

 
//高斯投影正、反算 
//6度带宽 54年北京坐标系 
//高斯投影由经纬度(Unit:DD)反算大地坐标(含带号,Unit:Metres) 

void GaussProjCal(double longitude, double latitude, double *X, double *Y) 
{
 int ProjNo=0; int ZoneWide; 带宽 
 double longitude1,latitude1, longitude0,latitude0, X0,Y0, xval,yval;
 double a,f, e2,ee, NN, T,C,A, M, iPI;
 iPI = 0.0174532925199433; 3.1415926535898/180.0; 
 ZoneWide = 6; 6度带宽 
 a=6378245.0; f=1.0/298.3; //54年北京坐标系参数 
 a=6378140.0; f=1/298.257; //80年西安坐标系参数 
 ProjNo = (int)(longitude / ZoneWide) ; 
 longitude0 = ProjNo * ZoneWide + ZoneWide / 2; 
 longitude0 = longitude0 * iPI ;
 latitude0=0; 
 longitude1 = longitude * iPI ; //经度转换为弧度
 latitude1 = latitude * iPI ; //纬度转换为弧度
 e2=2*f-f*f;
 ee=e2*(1.0-e2);
 NN=a/sqrt(1.0-e2*sin(latitude1)*sin(latitude1));
 T=tan(latitude1)*tan(latitude1);
 C
  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
高斯投影是一种常用的地理坐标系统转换方法,通过投影方式将地球上的经纬度坐标转换为平面直角坐标系。其反算过程可以通过C代码实现。 算是指将经纬度坐标转换为高斯平面坐标的过程。以下是实现高斯投影算的C代码示例: ```c #include <math.h> // 定义一些常数 #define PI 3.1415926535897932384626433832795 #define L0 108 // 中央经线 #define A 6378137.0 // 长半轴 #define E2 0.006694380023 #define K0 1.0 // 比例因子 #define N 0.001679220394 #define a0 32140.404 #define a2 -135.3302 #define a4 0.7092 #define a6 0.0040 #define X_ORIGIN 500000.0 #define Y_ORIGIN 0.0 // 高斯算函数 void GaussForward(double B, double L, double *X, double *Y) { double L_rad = L * PI / 180.0; double B_rad = B * PI / 180.0; double L0_rad = L0 * PI / 180.0; double cosB = cos(B_rad); double cos2B = cosB * cosB; double cos4B = cos2B * cos2B; double T = tan(B_rad); double T2 = T * T; double T4 = T2 * T2; double T6 = T2 * T4; double N_ = A / sqrt(1 - E2 * sin(B_rad) * sin(B_rad)); double n = N_ / A; double deltaL = L_rad - L0_rad; double X_ = a0 * B_rad + a2 * sin(2.0 * B_rad) + a4 * sin(4.0 * B_rad) + a6 * sin(6.0 * B_rad); double X1 = K0 * N_ * deltaL * cosB; double X2 = K0 * N_ * deltaL * deltaL * deltaL * cosB * cosB * cosB / 6.0 * (1.0 - T2 + n + 5.0 * T4 * (1.0 - 18.0 * T2 + T4)); double X3 = K0 * N_ * deltaL * deltaL * deltaL * deltaL * deltaL * cosB * cosB * cosB * cosB * cosB / 120.0 * (5.0 - 18.0 * T2 + T4 + 14.0 * n - 58.0 * T2 * n + 13.0 * n * n + 4.0 * n * n * n - 64.0 * T2 * n * n - 24.0 * T2 * T2); *X = X_ORIGIN + X_ + X1 + X2 + X3; double Y_ = N_ * tan(B_rad) * cos(deltaL) / 2.0; double Y1 = N_ * tan(B_rad) * cos(deltaL) * cos(deltaL) * cos(deltaL) / 24.0 * (5.0 - T2 + 9.0 * n + 4.0 * n * n); double Y2 = N_ * tan(B_rad) * cos(deltaL) * cos(deltaL) * cos(deltaL) * cos(deltaL) * cos(deltaL) / 720.0 * (61.0 - 58.0 * T2 + T4 + 270.0 * n - 330.0 * T2 * n + 445.0 * n * n + 324.0 * n * n * n - 680.0 * T2 * n * n + 88.0 * n * n * n * n - 600.0 * T2 * n * n * n - 192.0 * T2 * T2 - 48.0 * T2 * n * n * n * n); *Y = Y_ORIGIN + Y_ + Y1 + Y2; } // 测试函数 int main() { double B = 39.912345; double L = 116.56789; double X = 0.0; double Y = 0.0; GaussForward(B, L, &X, &Y); printf("经度:%f,纬度:%f 转换后的X坐标:%f,Y坐标:%f\n", B, L, X, Y); return 0; } ``` 反算是指将高斯平面坐标转换为经纬度坐标的过程。以下是实现高斯投影反算的C代码示例: ```c #include <math.h> // 定义一些常数 #define PI 3.1415926535897932384626433832795 #define L0 108 // 中央经线 #define A 6378137.0 // 长半轴 #define E2 0.006694380023 #define K0 1.0 // 比例因子 #define N 0.001679220394 #define a0 32140.404 #define a2 -135.3302 #define a4 0.7092 #define a6 0.0040 #define X_ORIGIN 500000.0 #define Y_ORIGIN 0.0 // 高斯反算函数 void GaussBackward(double X, double Y, double *B, double *L) { double X_ = X - X_ORIGIN; double Y_ = Y - Y_ORIGIN; double Bf = a0 * X_ + a2 * sin(2.0 * X_) + a4 * sin(4.0 * X_) + a6 * sin(6.0 * X_); double Ef = Bf - Y_ * Y_ * Y_ / (2.0 * 6378137.0 * 6378137.0 * N); double Tf = tan(Ef); double Nf = A / sqrt(1 - E2 * sin(Ef) * sin(Ef)); double Q = X_ / Nf; double B_rad = Ef - Nf * tan(Ef) * tan(Ef) * (Q * Q) / (2.0 * 6378137.0 * 6378137.0); double Bf_rad = Bf * PI / 180.0; double L_rad = L0 * PI / 180.0 + Q - tan(Ef) * tan(Ef) * (Q * Q * Q) / (6.0 * 6378137.0 * 6378137.0 * Nf); double Lf_rad = L_rad * 180.0 / PI; *B = B_rad * 180.0 / PI; *L = Lf_rad; } // 测试函数 int main() { double X = 405000.123; double Y = 3456789.456; double B = 0.0; double L = 0.0; GaussBackward(X, Y, &B, &L); printf("X坐标:%f,Y坐标:%f 转换后的经度:%f,纬度:%f\n", X, Y, B, L); return 0; } ``` 这是一个简单的高斯投影反算的C代码示例。使用时,可以将经纬度坐标传入GaussForward函数进行算,或将平面直角坐标传入GaussBackward函数进行反算,即可得到相应的转换结果。请注意,具体的高斯投影参数值可能因地区而异,需要根据实际情况进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值