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

GPS编程

开发平台:

Matlab

  1. function [dphi,dlambda,h] = togeod(a,finv,X,Y,Z)
  2. %TOGEOD   Subroutine to calculate geodetic coordinates
  3. %         latitude, longitude, height given Cartesian
  4. %         coordinates X,Y,Z, and reference ellipsoid
  5. %         values semi-major axis (a) and the inverse
  6. %         of flattening (finv).
  7. %  The units of linear parameters X,Y,Z,a must all agree (m,km,mi,ft,..etc)
  8. %  The output units of angular quantities will be in decimal degrees
  9. %  (15.5 degrees not 15 deg 30 min).  The output units of h will be the
  10. %  same as the units of X,Y,Z,a.
  11. %  Copyright (C) 1987 C. Goad, Columbus, Ohio
  12. %  Reprinted with permission of author, 1996
  13. %  Fortran code translated into MATLAB
  14. %  Kai Borre 03-30-96
  15. h = 0;
  16. tolsq = 1.e-10;
  17. maxit = 10;
  18. % compute radians-to-degree factor
  19. rtd = 180/pi;
  20. % compute square of eccentricity
  21. if finv < 1.e-20
  22.    esq = 0;
  23. else  
  24.    esq = (2-1/finv)/finv; 
  25. end
  26. oneesq = 1-esq;
  27. % first guess
  28. % P is distance from spin axix
  29. P = sqrt(X^2+Y^2);
  30. % direct calculation of longitude
  31. if P > 1.e-20
  32.    dlambda = atan2(Y,X)*rtd;
  33. else
  34.    dlambda = 0; 
  35. end;
  36. if (dlambda < 0)
  37.    dlambda = dlambda + 360;
  38. end
  39. % r is distance from origin (0,0,0)
  40. r = sqrt(P^2+Z^2);
  41. if r > 1.e-20
  42.    sinphi = Z/r;
  43. else
  44.    sinphi = 0; 
  45. end
  46. dphi = asin(sinphi);
  47. % initial value of height  =  distance from origin minus
  48. % approximate distance from origin to surface of ellipsoid
  49. if r < 1.e-20
  50.    h = 0;
  51.    break;
  52. end;
  53. h = r-a*(1-sinphi*sinphi/finv);
  54. % iterate
  55. for i = 1:maxit
  56.    sinphi = sin(dphi);
  57.    cosphi = cos(dphi);
  58.    % compute radius of curvature in prime vertical direction
  59.    N_phi = a/sqrt(1-esq*sinphi*sinphi);
  60.    % compute residuals in P and Z
  61.    dP = P - (N_phi + h) * cosphi;
  62.    dZ = Z - (N_phi*oneesq + h) * sinphi;
  63.    % update height and latitude
  64.    h = h+(sinphi*dZ+cosphi*dP);
  65.    dphi = dphi+(cosphi*dZ-sinphi*dP)/(N_phi + h);
  66.    % test for convergence
  67.    if (dP*dP + dZ*dZ < tolsq)
  68.       break;
  69.    end
  70.    
  71.    % Not Converged--Warn user
  72.    if i == maxit
  73.       fprintf([' Problem in TOGEOD, did not converge in %2.0f',...
  74.             ' iterationsn'],i)
  75.    end;
  76. end;
  77. dphi = dphi*rtd;
  78. %%%%%%%% end togeod.m  %%%%%%%%%%%%%%%%%%%%%%