WGS2UTM.M
上传用户:sfyaiting
上传日期:2009-10-25
资源大小:320k
文件大小:5k
源码类别:

GPS编程

开发平台:

Matlab

  1. function [N,E,U] = wgs2utm(X,Y,Z,zone);
  2. %WGS2UTM  Transformation of (X,Y,Z) in WGS 1984
  3. %         to (N,E,U) in UTM, zone 'zone'
  4. % Written by Kai Borre
  5. % November 1994, revised December 22, 1995
  6. %This implementation is based upon
  7. %O. Andersson & K. Poder (1981) Koordinattransformationer
  8. %  ved Geodae{}tisk Institut. Landinspektoe{}ren
  9. %  Vol. 30: 552--571 and Vol. 31: 76
  10. %An excellent, general reference (KW) is
  11. %R. Koenig & K.H. Weise (1951) Mathematische Grundlagen der 
  12. %  h"oheren Geod"asie und Kartographie. 
  13. %  Erster Band, Springer Verlag
  14. %Explanation of variables used:
  15. % f    flattening of ellipsoid
  16. % a    semi major axis in m
  17. % m0     1 - scale at central meridian; for UTM 0.0004
  18. % Q_n    normalized meridian quadrant
  19. % E0     Easting of central meridian
  20. % L0     Longitude of central meridian
  21. % bg     constants for ellipsoidal geogr. to spherical geogr.
  22. % gb     constants for spherical geogr. to ellipsoidal geogr.
  23. % gtu    constants for ellipsoidal N, E to spherical N, E
  24. % utg    constants for spherical N, E to ellipoidal N, E
  25. % tolutm tolerance for utm, 1.2E-10*meridian quadrant
  26. % tolgeo tolerance for geographical, 0.00040 second of arc
  27. % B, L refer to latitude and longitude. Southern latitude is negative
  28. % International ellipsoid of 1924, valid for ED50
  29. a = 6378388;
  30. f = 1/297;
  31. ex2 = (2-f)*f/((1-f)^2);
  32. c = a*sqrt(1+ex2);
  33. vec = [X; Y; Z-4.5];
  34. alpha = .756e-6;
  35. R = [   1    -alpha    0;
  36.      alpha         1    0;
  37.          0         0    1];
  38. trans = [89.5; 93.8; 127.6];
  39. scale = 0.9999988;
  40. v = scale*R*vec+trans;   % coordinate vector in ED50
  41. L = atan2(v(2),v(1));
  42. N1 = 6395000;             % preliminary value
  43. B = atan2(v(3)/((1-f)^2*N1), norm(v(1:2))/N1); % preliminary value
  44. U = 0.1;  oldU = 0;
  45. while abs(U-oldU) > 1.e-4
  46.    oldU = U;
  47.    N1 = c/sqrt(1+ex2*(cos(B))^2);
  48.    B = atan2(v(3)/((1-f)^2*N1+U), norm(v(1:2))/(N1+U) );
  49.    %preliminary value
  50.    %B = atan(v(3)/(norm(v(1:2))*(1-(2-f)*f*N1/(N1+U))));
  51.    U = norm(v(1:2))/cos(B)-N1;
  52. end
  53. %Normalized meridian quadrant, KW p. 50 (96), p. 19 (38b), p. 5 (21)
  54. m0 = 0.0004;
  55. n = f/(2-f);
  56. m = n^2*(1/4+n*n/64);
  57. w = (a*(-n-m0+m*(1-m0)))/(1+n);
  58. Q_n = a+w;
  59. %Easting and longitude of central meridian
  60. E0 = 500000;
  61. L0 = (zone-30)*6-3;
  62. %Check tolerance for reverse transformation
  63. tolutm = pi/2*1.2e-10*Q_n;
  64. tolgeo = 0.000040;
  65. %Coefficients of trigonometric series
  66. %ellipsoidal to spherical geographical, KW p. 186--187, (51)-(52)
  67. % bg[1] = n*(-2 + n*(2/3    + n*(4/3   + n*(-82/45))));
  68. % bg[2] = n^2*(5/3    + n*(-16/15 + n*(-13/9)));
  69. % bg[3] = n^3*(-26/15 + n*34/21);
  70. % bg[4] = n^4*1237/630;
  71. %spherical to ellipsoidal geographical, KW p. 190--191, (61)-(62)
  72. % gb[1] = n*(2        + n*(-2/3    + n*(-2  + n*116/45)));
  73. % gb[2] = n^2*(7/3    + n*(-8/5 + n*(-227/45)));
  74. % gb[3] = n^3*(56/15 + n*(-136/35));
  75. % gb[4] = n^4*4279/630;
  76. %spherical to ellipsoidal N, E, KW p. 196, (69)
  77. % gtu[1] = n*(1/2   + n*(-2/3    + n*(5/16     + n*41/180)));
  78. % gtu[2] = n^2*(13/48   + n*(-3/5 + n*557/1440));
  79. % gtu[3] = n^3*(61/240   + n*(-103/140));
  80. % gtu[4] = n^4*49561/161280;
  81. %ellipsoidal to spherical N, E, KW p. 194, (65)
  82. % utg[1] = n*(-1/2    + n*(2/3    + n*(-37/96 + n*1/360)));
  83. % utg[2] = n^2*(-1/48   + n*(-1/15 + n*437/1440));
  84. % utg[3] = n^3*(-17/480 + n*37/840);
  85. % utg[4] = n^4*(-4397/161280);
  86. %With f = 1/297 we get
  87. bg = [-3.37077907e-3;
  88.        4.73444769e-6;
  89.       -8.29914570e-9;
  90.        1.58785330e-11];
  91. gb = [ 3.37077588e-3;
  92.        6.62769080e-6;
  93.        1.78718601e-8;
  94.        5.49266312e-11];
  95. gtu = [ 8.41275991e-4; 
  96.         7.67306686e-7;
  97.         1.21291230e-9;
  98.         2.48508228e-12];
  99. utg = [-8.41276339e-4;
  100.        -5.95619298e-8;
  101.        -1.69485209e-10;
  102.        -2.20473896e-13];
  103. %Ellipsoidal latitude, longitude to spherical latitude, longitude
  104. neg_geo = 'FALSE';
  105. if B < 0
  106.    neg_geo = 'TRUE '; 
  107. end;
  108. Bg_r = abs(B);
  109. [res_clensin] = clsin(bg,4,2*Bg_r);
  110. Bg_r = Bg_r+res_clensin;
  111. L0 = L0*pi/180;
  112. Lg_r = L-L0;
  113. %Spherical latitude, longitude to complementary spherical latitude
  114. %  i.e. spherical N, E
  115. cos_BN = cos(Bg_r);
  116. Np = atan2(sin(Bg_r), cos(Lg_r)*cos_BN);
  117. Ep = atanh(sin(Lg_r)*cos_BN);
  118. %Spherical normalized N, E to ellipsoidal N, E
  119. Np = 2*Np;
  120. Ep = 2*Ep;
  121. [dN,dE] = clksin(gtu,4,Np,Ep);
  122. Np = Np/2;
  123. Ep = Ep/2;
  124. Np = Np+dN;
  125. Ep = Ep+dE;
  126. N = Q_n*Np;
  127. E = Q_n*Ep+E0;
  128. if neg_geo == 'TRUE '
  129.    N = -N+20000000; 
  130. end;
  131. %fprintf(['Cartesian coordinates (WGS84) transformed to' ...
  132. %     ' UTM zone %2.0fn'], zone);
  133. %fprintf('X =  %12.3f,  Y = %12.3f,   Z=%12.3fn', X, Y, Z);
  134. %fprintf('N =  %12.3f,  E = %12.3f,   U=%12.3fn', N, E, U);
  135. %%%%%%%%%%%%%%%%%%%% end wgs2utm %%%%%%%%%%%%%%%%%%%%