134 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Matlab
		
	
	
			
		
		
	
	
			134 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Matlab
		
	
	
function  [x,y,utmzone] = deg2utm(Lat,Lon)
 | 
						|
% -------------------------------------------------------------------------
 | 
						|
% [x,y,utmzone] = deg2utm(Lat,Lon)
 | 
						|
%
 | 
						|
% Description: Function to convert lat/lon vectors into UTM coordinates (WGS84).
 | 
						|
% Some code has been extracted from UTM.m function by Gabriel Ruiz Martinez.
 | 
						|
%
 | 
						|
% Inputs:
 | 
						|
%    Lat: Latitude vector.   Degrees.  +ddd.ddddd  WGS84
 | 
						|
%    Lon: Longitude vector.  Degrees.  +ddd.ddddd  WGS84
 | 
						|
%
 | 
						|
% Outputs:
 | 
						|
%    x, y , utmzone.   See example
 | 
						|
%
 | 
						|
% Example 1:
 | 
						|
%    Lat=[40.3154333; 46.283900; 37.577833; 28.645650; 38.855550; 25.061783];
 | 
						|
%    Lon=[-3.4857166; 7.8012333; -119.95525; -17.759533; -94.7990166; 121.640266];
 | 
						|
%    [x,y,utmzone] = deg2utm(Lat,Lon);
 | 
						|
%    fprintf('%7.0f ',x)
 | 
						|
%       458731  407653  239027  230253  343898  362850
 | 
						|
%    fprintf('%7.0f ',y)
 | 
						|
%      4462881 5126290 4163083 3171843 4302285 2772478
 | 
						|
%    utmzone =
 | 
						|
%       30 T
 | 
						|
%       32 T
 | 
						|
%       11 S
 | 
						|
%       28 R
 | 
						|
%       15 S
 | 
						|
%       51 R
 | 
						|
%
 | 
						|
% Example 2: If you have Lat/Lon coordinates in Degrees, Minutes and Seconds
 | 
						|
%    LatDMS=[40 18 55.56; 46 17 2.04];
 | 
						|
%    LonDMS=[-3 29  8.58;  7 48 4.44];
 | 
						|
%    Lat=dms2deg(mat2dms(LatDMS)); %convert into degrees
 | 
						|
%    Lon=dms2deg(mat2dms(LonDMS)); %convert into degrees
 | 
						|
%    [x,y,utmzone] = deg2utm(Lat,Lon)
 | 
						|
%
 | 
						|
% Author: 
 | 
						|
%   Rafael Palacios
 | 
						|
%   Universidad Pontificia Comillas
 | 
						|
%   Madrid, Spain
 | 
						|
% Version: Apr/06, Jun/06, Aug/06, Aug/06
 | 
						|
% Aug/06: fixed a problem (found by Rodolphe Dewarrat) related to southern 
 | 
						|
%    hemisphere coordinates. 
 | 
						|
% Aug/06: corrected m-Lint warnings
 | 
						|
%-------------------------------------------------------------------------
 | 
						|
 | 
						|
% Argument checking
 | 
						|
%
 | 
						|
error(nargchk(2, 2, nargin));  %2 arguments required
 | 
						|
n1=length(Lat);
 | 
						|
n2=length(Lon);
 | 
						|
if (n1~=n2)
 | 
						|
   error('Lat and Lon vectors should have the same length');
 | 
						|
end
 | 
						|
 | 
						|
 | 
						|
% Memory pre-allocation
 | 
						|
%
 | 
						|
x=zeros(n1,1);
 | 
						|
y=zeros(n1,1);
 | 
						|
utmzone(n1,:)='60 X';
 | 
						|
 | 
						|
% Main Loop
 | 
						|
%
 | 
						|
for i=1:n1
 | 
						|
   la=Lat(i);
 | 
						|
   lo=Lon(i);
 | 
						|
 | 
						|
   sa = 6378137.000000 ; sb = 6356752.314245;
 | 
						|
         
 | 
						|
   %e = ( ( ( sa ^ 2 ) - ( sb ^ 2 ) ) ^ 0.5 ) / sa;
 | 
						|
   e2 = ( ( ( sa ^ 2 ) - ( sb ^ 2 ) ) ^ 0.5 ) / sb;
 | 
						|
   e2cuadrada = e2 ^ 2;
 | 
						|
   c = ( sa ^ 2 ) / sb;
 | 
						|
   %alpha = ( sa - sb ) / sa;             %f
 | 
						|
   %ablandamiento = 1 / alpha;   % 1/f
 | 
						|
 | 
						|
   lat = la * ( pi / 180 );
 | 
						|
   lon = lo * ( pi / 180 );
 | 
						|
 | 
						|
   Huso = fix( ( lo / 6 ) + 31);
 | 
						|
   S = ( ( Huso * 6 ) - 183 );
 | 
						|
   deltaS = lon - ( S * ( pi / 180 ) );
 | 
						|
 | 
						|
   if (la<-72), Letra='C';
 | 
						|
   elseif (la<-64), Letra='D';
 | 
						|
   elseif (la<-56), Letra='E';
 | 
						|
   elseif (la<-48), Letra='F';
 | 
						|
   elseif (la<-40), Letra='G';
 | 
						|
   elseif (la<-32), Letra='H';
 | 
						|
   elseif (la<-24), Letra='J';
 | 
						|
   elseif (la<-16), Letra='K';
 | 
						|
   elseif (la<-8), Letra='L';
 | 
						|
   elseif (la<0), Letra='M';
 | 
						|
   elseif (la<8), Letra='N';
 | 
						|
   elseif (la<16), Letra='P';
 | 
						|
   elseif (la<24), Letra='Q';
 | 
						|
   elseif (la<32), Letra='R';
 | 
						|
   elseif (la<40), Letra='S';
 | 
						|
   elseif (la<48), Letra='T';
 | 
						|
   elseif (la<56), Letra='U';
 | 
						|
   elseif (la<64), Letra='V';
 | 
						|
   elseif (la<72), Letra='W';
 | 
						|
   else Letra='X';
 | 
						|
   end
 | 
						|
 | 
						|
   a = cos(lat) * sin(deltaS);
 | 
						|
   epsilon = 0.5 * log( ( 1 +  a) / ( 1 - a ) );
 | 
						|
   nu = atan( tan(lat) / cos(deltaS) ) - lat;
 | 
						|
   v = ( c / ( ( 1 + ( e2cuadrada * ( cos(lat) ) ^ 2 ) ) ) ^ 0.5 ) * 0.9996;
 | 
						|
   ta = ( e2cuadrada / 2 ) * epsilon ^ 2 * ( cos(lat) ) ^ 2;
 | 
						|
   a1 = sin( 2 * lat );
 | 
						|
   a2 = a1 * ( cos(lat) ) ^ 2;
 | 
						|
   j2 = lat + ( a1 / 2 );
 | 
						|
   j4 = ( ( 3 * j2 ) + a2 ) / 4;
 | 
						|
   j6 = ( ( 5 * j4 ) + ( a2 * ( cos(lat) ) ^ 2) ) / 3;
 | 
						|
   alfa = ( 3 / 4 ) * e2cuadrada;
 | 
						|
   beta = ( 5 / 3 ) * alfa ^ 2;
 | 
						|
   gama = ( 35 / 27 ) * alfa ^ 3;
 | 
						|
   Bm = 0.9996 * c * ( lat - alfa * j2 + beta * j4 - gama * j6 );
 | 
						|
   xx = epsilon * v * ( 1 + ( ta / 3 ) ) + 500000;
 | 
						|
   yy = nu * v * ( 1 + ta ) + Bm;
 | 
						|
 | 
						|
   if (yy<0)
 | 
						|
       yy=9999999+yy;
 | 
						|
   end
 | 
						|
 | 
						|
   x(i)=xx;
 | 
						|
   y(i)=yy;
 | 
						|
   utmzone(i,:)=sprintf('%02d %c',Huso,Letra);
 | 
						|
end
 | 
						|
 |