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

GPS编程

开发平台:

Matlab

  1. function bessel_1(phi1d,phi1m,phi1s,l1d,l1m,...
  2.                                     l1s,A1d,A1m,A1s,s12,a,finv)
  3. %BESSEL_1 Solution of the direct geodetic problem according to
  4. %         the Bessel-Helmert method as described in Zhang Xue-Lian.
  5. %         Given a point with coordinates (phi1, l1) and 
  6. %         a gedesic with azimuth A1 and length s12 from here. The 
  7. %         given reference ellipsoid has semi-major axis a and 
  8. %         inverse flattening finv. The coordinates and the azimuth
  9. %         have the format degree, minute, and second
  10. %         with decimals. 
  11. %
  12. %         Zhan Xue-Lian (1985): The nested coefficient method
  13. %            for accurate solutions of direct and inverse geodetic
  14. %            problems with any length. In proceedings of the 7th
  15. %            International Symposium on Geodetic Computations, 
  16. %            Cracow, June 18--21, 1985. Pages 747--763. Institute
  17. %            of Geodesy and Cartography. Wasaw, Poland, ul. Jasna 2/4.
  18. %
  19. %         A good decription of the general background of the problems
  20. %         is given in
  21. %
  22. %       Bodem"uller, H.(1954): Die geod"atischen Linien des 
  23. %          Rotationsellipsoides und die L"osung der geod"atischen
  24. %          Hauptaufgaben f"ur gross{}e Strecken unter 
  25. %            besonderer Ber"ucksichtigung der Bessel-Helmertschen
  26. %            L"osungsmethode. Deutsche Geod"atische Kommission,
  27. %            Reihe B, Nr. 13.
  28. %Kai Borre, January 24, 1999
  29. %Copyright (c) by Kai Borre
  30. %$Revision 1.1 $  $Date:2002/05/02  $
  31. dtr = pi/180;        % degrees to radians
  32. if nargin == 0
  33. phi1  = 50*dtr;
  34. l1 =    10*dtr;
  35. A1 =   140*dtr;
  36. s12 = 15000000;   % m
  37. a = 6378388;
  38. finv = 297;
  39. else
  40.    phi1 = dms2rad(phi1d,phi1m,phi1s);
  41.    l1 = dms2rad(l1d,l1m,l1s);
  42.    A1 = dms2rad(A1d,A1m,A1s);
  43. end
  44. f = 1/finv; 
  45. ex2 = (2-f)*f/(1-f)^2;         % second eccentricity squared
  46. tanu1 = (1-f)*tan(phi1);        % (1)
  47. sigma1 = atan2(tanu1,cos(A1));  % (2)
  48. u1 = atan(tanu1);
  49. cosun = cos(u1)*sin(A1);        % (3)
  50. sinun2 = 1-cosun^2;
  51. t = ex2*sinun2/4;               % (4)
  52. K1 = 1+t*(1-t*(3-t*(5-11*t))/4);
  53. K2 = t*(1-t*(2-t*(37-94*t)/8));
  54. v = f*sinun2/4;                 % (5)
  55. K3 = v*(1+f+f^2-v*(3+7*f-13*v));
  56. deltasigma_old = 0;
  57. deltasigma_new = 1;
  58. while  abs(deltasigma_old-deltasigma_new) > 1.e-12
  59.    deltasigma_old = deltasigma_new;
  60.    sigma = s12/(K1*(1-f)*a)+deltasigma_old; % (6)
  61.    sigmam = 2*sigma1+sigma;
  62.    deltasigma_new = K2*sin(sigma)*(cos(sigmam)+...
  63.                       K2*(cos(sigma)*cos(2*sigmam)+...
  64.                         K2*(1+2*cos(2*sigma))*cos(3*sigmam)/6)/4); %(7)
  65. end
  66. tanu2 = (sin(u1)*cos(sigma)+cos(u1)*sin(sigma)*cos(A1))/...
  67.                            sqrt(1-sinun2*(sin(sigma1+sigma))^2); %(8)
  68. phi2 = atan(tanu2/(1-f));
  69. disp('Phi2');
  70. rad2dms(phi2);
  71. deltaomega = (1-K3)*f*cosun*(sigma+...
  72.                K3*sin(sigma)*(cos(sigmam)+...
  73.                K3*cos(sigma)*cos(2*sigmam))); % (9)
  74. omega = atan2(sin(sigma)*sin(A1),...
  75.                cos(u1)*cos(sigma)-sin(u1)*sin(sigma)*cos(A1)); % (10)
  76. l2 = l1+omega-deltaomega;
  77. disp('lambda2')
  78. rad2dms(l2);
  79. A2 = atan2(cos(u1)*sin(A1),...
  80.                cos(u1)*cos(sigma)*cos(A1)-sin(u1)*sin(sigma)); % (11)             
  81. disp('A2');
  82. rad2dms(A2);              
  83. %----------------------------------------------
  84. function result = dms2rad(deg,min,sec);
  85. % Conversion of degrees, minutes, and seconds to radians
  86. neg_arg = 'FALSE';
  87. if deg < 0
  88.    neg_arg = 'TRUE ';
  89.    deg = -deg;
  90. end
  91. arg = deg+min/60+sec/3600;
  92. result = arg*pi/180;
  93. if neg_arg == 'TRUE ';
  94.    result = -result;
  95. end
  96. %------------------------------------------
  97. function result = rad2dms(arg)
  98. %RAD2DMS Conversion of radians to degrees, minutes, and seconds%
  99. neg_arg = 'FALSE';
  100. if arg < 0
  101.    neg_arg = 'TRUE ';
  102.    arg = -arg;
  103. end
  104. arg = arg*180/pi;
  105. result = zeros(1,3);
  106. result(1) = fix(arg);
  107. if result(1) == 0
  108.    result(2) = fix(arg*60);
  109. else
  110.    result(2) = fix(rem(arg,result(1))*60);
  111. end
  112. result(3) = (arg-result(1)-result(2)/60)*3600;
  113. if neg_arg == 'TRUE '
  114.    result(1) = -result(1);
  115. end
  116. fprintf('   %3.0f %2.0f %8.6fn',result(1),result(2),result(3))
  117. %%%%%%%%%%%%%%%%% end bessel_1.m  %%%%%%%%%%%%%%%%%%%%%%%%%%%