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