function [pos,latlon]=posdecode(text) % [pos,latlon]=posdecode(text); dekodiert Position aus dem Textstring % Ausgabe entweder eine oder zwei Positionen (dann Breite,Länge) in pos % und in latlon ob es sich um Breite=1 oder Länge=2 handelt % (interesant bei nur einer Ausgabeposition) % % Es werden gängige Formate wie 34.6; 34N56.8; 56 45.5W; 56 45 30W % und ähnliche verstanden. % Nicht oder nicht richtig verstanden werden z.B.: 34-45-30N; % -54 30 (wird als -53.5 verstanden) % % J.Holfort,2003 Kerror=0; pos=[]; il=length(text); text=upper(text); ii=ismember(text,'0123456789.-+'); %no Exponent allowed % remove strings often found, but have no meening for us % a='deg'; b=all letter strings longer then 3 jj=strfind(upper(text),'NORTH'); for i2=1:length(jj) text(jj(i2):jj(i2)+4)='N '; end jj=strfind(upper(text),'SOUTH'); for i2=1:length(jj) text(jj(i2):jj(i2)+4)='S '; end jj=strfind(upper(text),'EAST'); for i2=1:length(jj) text(jj(i2):jj(i2)+3)='E '; end jj=strfind(upper(text),'WEST'); for i2=1:length(jj) text(jj(i2):jj(i2)+3)='W '; end jj=strfind(upper(text),'DEG'); for i2=1:length(jj) text(jj(i2):jj(i2)+2)=' '; end jj=isletter(text); nletter=0; for i2=1:length(jj) if jj(i2); nletter=nletter+1; end if ~jj(i2); if nletter>=3; text(i2-nletter:i2-1)=' '; end nletter=0; end end % change commas % just if no points are present % to points if between two numbers % e.g. for german users using the comma , 3,5 instead of 3.5 % disregard at start and end of string ll=findstr(text,'.'); if length(ll)<1 kk=findstr(text,','); for k1=1:length(kk) if kk(k1)==1 | kk(k1)==il text(kk(k1))=' '; elseif ii(kk(k1)-1) & ii(kk(k1)+1) text(kk(k1))='.'; ii(kk(k1))= 1; end end end text1=text; text1(~ii)=' '; rr=str2num(text1); lr=length(rr); if lr<1; warning(['no position found:' text]) pos=[]; latlon=[]; return end jj=find(ismember(text,'NSEW')); latlon=[0 0]; % unbekannt, 1=latitude,2=longitude NE=[1 1]; % nord und east sind positiv for i1=1:min(length(jj),2) if strcmp(text(jj(i1)),'N'); latlon(i1)=1; NE(i1)=1; elseif strcmp(text(jj(i1)),'S'); latlon(i1)=1; NE(i1)=-1; elseif strcmp(text(jj(i1)),'E'); latlon(i1)=2; NE(i1)=1; elseif strcmp(text(jj(i1)),'W'); latlon(i1)=2; NE(i1)=-1; end end if length(jj)>2 & latlon(1)==latlon(2); Kerror=1; latlon(2)=0; NE(2)=1 end if latlon(2)>0 & mod(length(rr),2)==1; Kerror=1; latlon(2)=0; end i1=latlon(1); if i1==0; i1=1; end i2=latlon(2); if i2==0; i2=2; if i1==2; i2=1; end; end; if lr==1 pos=rr(1)*NE(1); elseif lr==2 if latlon(2)>0 pos(i1)=rr(1)*NE(1); pos(i2)=rr(2)*NE(2); else pos=(rr(1)+rr(2)/60)*NE(1); end elseif lr==3 pos=(rr(1)+rr(2)/60.+rr(3)/3600.)*NE(1); elseif lr==4 pos(i1)=(rr(1)+rr(2)/60)*NE(1); pos(i2)=(rr(3)+rr(4)/60)*NE(2); elseif lr==6 pos(i1)=(rr(1)+rr(2)/60.+rr(3)/3600.)*NE(1); pos(i2)=(rr(4)+rr(5)/60.+rr(6)/3600.)*NE(2); end if latlon(2)==1; latlon=[1 2]; end if sum(abs(pos)>360)>0; Kerror=1; end if latlon(1)==1 & abs(pos(1))>90; Kerror=1; end if length(pos)<=1; latlon=latlon(1); end if Kerror>0 fprintf(['Error in decoding Position from:' text '\n']); fprintf('Read: %f %f %i %i \n',pos,latlon); end