www.gusucode.com > gps卫星位置预报,MATLAB编写,有动画界面源码程序 > code5/gps_final_new/xyz2llh.m
function pos_llh=xyz2llh(pos_ecef) %function pos_llh=xyz2llh(pos_ecef) % % Input: a 3x1 position vector in WGS-84 ECEF Coordinates % units for pos_ecef are in meters % Output: a 3x1 position vector in Latitude, Longitude, Height % coordinates, as defined by the WGS-84 ellipsoid. % units for latitude and longitude are degrees, height % in meters % % Derived from Table 2.1 of Kaplan, Understanding GPS, p. 28. % Author: G. Lightsey, The Univ. of Texas at Austin % Last Modified: 01/25/01 % k=size(pos_ecef); if ((k(1)~=3)|(k(2)~=1)), s=['vector length error, size(pos_ecef) = [',int2str(k),']']; disp(s); break; end xu=pos_ecef(1); xu_squared=xu^2; yu=pos_ecef(2); yu_squared=yu^2; zu=pos_ecef(3); zu_squared=zu^2; % if ((xu==0)&(yu==0)), s=['range error, lat/lon indeterminate']; disp(s); break; end % r=sqrt(xu_squared+yu_squared); r_squared=xu_squared+yu_squared; a=6378137.0; % semimajor axis of WGS-84 ellipsoid in meters a_squared=a^2; b=6356752.3142; % semiminor axis of WGS-84 ellipsoid in meters b_squared=b^2; e_squared=1-b_squared/a_squared; % eccentricity of WGS-84 ellipsoid (squared) E_squared=a_squared-b_squared; F=54*b_squared*zu_squared; G=r_squared+(1-e_squared)*zu_squared-e_squared*E_squared; c=(e_squared)^2*F*r_squared/(G^3); s=(1+c+sqrt(c^2+2*c))^(1/3); P=F/(3*(s+1/s+1)^2*G^2); Q=sqrt(1+2*(e_squared^2)*P); r0=-P*e_squared*r/(1+Q)+sqrt(1/2*a_squared*(1+1/Q)-P*(1-e_squared)*zu_squared/(Q*(1+Q))-1/2*P*r_squared); U=sqrt((r-e_squared*r0)^2+zu_squared); V=sqrt((r-e_squared*r0)^2+(1-e_squared)*zu_squared); z0=b_squared*zu/(a*V); % h=real(U*(1-b_squared/(a*V))); % if (h<=-b), s=['range error, altitude indeterminate']; break; end phi=180/pi*real(atan((zu+a_squared/b_squared*e_squared*z0)/r)); lam=180/pi*real(atan2(yu,xu)); % pos_llh=[phi;lam;h];