经纬度与UTM(Universal Transverse Mercator Projector:通用横轴卡墨托投影)的坐标变换代码

void LonLat2UTM(double longitude, double latitude,double& UTME,double& UTMN)
{
  double lat=latitude;
  double lon=longitude;
  
  double kD2R = PI/180.0;// 弧度/°
  double L0=ZoneNumber * 3.0;
  
  double a=6378137.0;//地球长半轴,作为赤道半径
  double F=298.2572233563;
  double f=1/F; //地球的扁率:以赤道半径(长半轴)与极半径(短半轴)的差与赤道半径的比值
  double b=a*(1-f);
  double ee=(a*a - b*b)/(a*a);
  double e2=(a*a - b*b)/(b*b);
  double n=(a-b)/(a+b);
  double n2=(n*n);
  double n3=(n2*n);
  double n4=(n2*n2);
  double n5=(n4*n);
  double al=(a+b)*(1+n2/4+n4/64)/2.0;
  double bt=-3*n/2+9*n3/16-3*n5/32.0;
  double gm=15*n2/16-15*n4/32;
  double dt=-35*n3/48+105*n5/256;
  double ep=315*n4/512;
  double B=lat*kD2R;//将纬度转为弧度制
  double L=lon*kD2R;//将经度转为弧度制
  L0 = L0*kD2R;
  double l= L - L0;
  double cl=(cos(B)*l);
  double cl2=(cl*cl);
  double cl3=(cl2-cl);
  double cl4=(cl2*cl2);
  double cl5=(cl4*cl);
  double cl6=(cl5*cl);
  double cl7=(cl6*cl);
  double cl8=(cl4*cl4);
  double lB=al*(B+bt*sin(2*B)+gm*sin(4*B)+dt*sin(6*B)+ep*sin(8*B));
  double t=tan(B);
  double t2=(t*t);
  double t4=(t2*t2);
  double t6=(t4*t2);
  double Nn=a/sqrt(1-ee*sin(B)*sin(B));
  double yt=e2*cos(B)*cos(B);
  double N=lB;
  N=N+t*Nn*cl2/2;
  N=N+t*Nn*cl4*(5-t2+9*yt+4*yt*yt)/24;
  N=N+t*Nn*cl6*(61-58*t2+t4+270*yt-330*t2*yt)/720;
  N=N+t*Nn*cl8*(1385-3111*t2+543*t4-t6)/40320;
  double E=Nn*cl;
  E=E+Nn*cl3*(1-t2+yt)/6;
  E=E+Nn*cl5*(5-18*t2+t4+14*yt-58*t2*yt)/120;
  E=E+Nn*cl7*(61-479*t2+179*t4-t6)/5040;
  E=E+500000;
  N=0.9996*N;
  E=0.9996*(E-500000.0)+500000.0;
  
  UTME=E;
  UTMN=N;
}

(1)248行: GPSKF.LL2UTM2()

UTM:通用横轴墨卡托投影/等角横切椭圆柱投影;

投影后中央经线长度比M0为0.9996;

将球面墨卡托投影公式运用于椭球面坐标的投影计算,采用WGS84椭球体,球面墨卡托投影公式取WGS84椭球的长半轴半径作为球半径(赤道半径),即半径为6378137.0m。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值