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
							 | 
						||
| 
								 | 
							
								
							 |