Showing posts with label google. Show all posts
Showing posts with label google. Show all posts

Sunday, February 5, 2012

[Matlab] Convert a 2D mesh to a single kml file

function mesh2kml(kmlfile,long,lat,iskip,jskip)
% convert a 2D mesh grid into a single plain kml file
%             will create the horizontal and vertical mesh-line seperately
% usage:
%             mesh2kml(kml-filename,longitude,latitude [iskip, jskip])
%                     iskip: reduce the points when to generate i-direction-mesh-line
%                     jskip: reduce the points when to generate j-direction-mesh-line
%     e.g.,
%             lon=-90:2:20;
%             lat=37:65;
%             [lon,lat]=meshgrid(lon,lat);
%             mesh2kml('mesh2kml_test',lon,lat,1,1);
%             will produce a kml file named mesh2kml_test in current folder
%
%             http://scriptdemo.blogspot.com

if nargin<3
   help mesh2kml
   return
end
if nargin==3
   iskip=5;
   jskip=5;
elseif nargin==4
   jskip=5;
end

fid=fopen([kmlfile,'.kml'],'wt');
writekmlHeader(fid,kmlfile);
if length(long)~=numel(long) % mesh
   [NY,NX]=size(long);
   %i-index
   longUD=flipud(long); latUD=flipud(lat);
   longI=long; latI=lat;
   longI(:,2:2:end)=longUD(:,2:2:end);
   latI(:,2:2:end)=latUD(:,2:2:end); clear longUD latUD
   jindex=sort(unique([1 jskip:jskip:NY NY]));
   longI=reshape(longI(jindex,:),1,[]); latI=reshape(latI(jindex,:),1,[]);
   fprintf(fid,'%s \n','<Placemark>');
   fprintf(fid,'%s \n',['<name>',kmlfile,'-I</name>']);
   fprintf(fid,'%s \n','<LineString>');
   fprintf(fid,'%s \n','<tessellate>1</tessellate>'); %
   fprintf(fid,'%s \n','<coordinates>');
   fprintf(fid,'%0.6f,%0.6f,0.0 \n', [longI;latI]);
   fprintf(fid,'%s \n','</coordinates>');
   fprintf(fid,'%s \n','</LineString>');
   fprintf(fid,'%s \n','</Placemark>');

   %j-index
   longLR=fliplr(long); latLR=fliplr(lat);
   longJ=long; latJ=lat;
   longJ(2:2:end,:)=longLR(2:2:end,:);
   latJ(2:2:end,:)=latLR(2:2:end,:); clear longLR latLR
   longJ=longJ'; latJ=latJ';
   iindex=sort(unique([1 iskip:iskip:NX NX]));
   longJ=reshape(longJ(iindex,:),1,[]); latJ=reshape(latJ(iindex,:),1,[]);

   fprintf(fid,'%s \n','<Placemark>');
   fprintf(fid,'%s \n',['<name>',kmlfile,'-J</name>']);
   fprintf(fid,'%s \n','<LineString>');
   fprintf(fid,'%s \n','<tessellate>1</tessellate>'); %
   fprintf(fid,'%s \n','<coordinates>');
   fprintf(fid,'%0.6f,%0.6f,0.0 \n', [longJ;latJ]);
   fprintf(fid,'%s \n','</coordinates>');
   fprintf(fid,'%s \n','</LineString>');
   fprintf(fid,'%s \n','</Placemark>');

else
   long=reshape(long,1,[]); lat=reshape(lat,1,[]);
   fprintf(fid,'%s \n','<Placemark>');
   fprintf(fid,'%s \n',['<name>',kmlfile,'</name>']);
   fprintf(fid,'%s \n','<LineString>');
   fprintf(fid,'%s \n','<tessellate>1</tessellate>'); %
   fprintf(fid,'%s \n','<coordinates>');
   fprintf(fid,'%0.6f,%0.6f,0.0 \n', [long;lat]);
   fprintf(fid,'%s \n','</coordinates>');
   fprintf(fid,'%s \n','</LineString>');
   fprintf(fid,'%s \n','</Placemark>');
end

writekmlEnd(fid);
fclose(fid);

function writekmlHeader(fid,kmlName)
fprintf(fid,'%s \n','<?xml version="1.0" encoding="UTF-8"?>');
fprintf(fid,'%s','<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" ');
fprintf(fid,'%s \n','xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">');
fprintf(fid,'%s \n','<Document>');
fprintf(fid,'%s \n',['<name>',kmlName,'.kml</name>']);


function writekmlEnd(fid)

fprintf(fid,'%s \n','</Document>');
fprintf(fid,'%s \n','</kml>');

[Matlab] Convert a line to a polygon or line kml file

function line2kml(kmlfile,long,lat,varargin)
% convert a line to a kml line or polygon feature file with limited
%              attributes support
% usage:
%              line2kml(kml-filename,longitude,latitude [, other opts])
%    opts:
%              'style' : polygon or line
%              'linecolor' : color of edge line
%              'linealpha' : alpha value for edgecolor [1-255]
%              'linewidth' : width of the edge line
%              'fillcolor' : facecolor of the polygon
%              'fillalpha' : alpha value for facecolor [1-255]
%    e.g.,
%              np=1000;
%              t=0:2*pi/np:2*pi;
%              r=sin(t).*sqrt(abs(cos(t)))./(sin(t)+7/5)-2*sin(t)+2;
%              long=r.*cos(t); lat=r.*sin(t);
%              long=long/max(abs(long))*31-45;
%              lat=lat/max(abs(lat))*35+38;
%              line2kml('myheart',long,lat,'fillalpha',127,'style','polygon','linewidth',5,'linecolor','y','linealpha',255,'fillcolor','r');
%              will produce a kml file named myheart in current folder
%
%             @ http://scriptdemo.blogspot.com

% demo case
if nargin==0
   np=1000;
   t=0:2*pi/np:2*pi;
   r=sin(t).*sqrt(abs(cos(t)))./(sin(t)+7/5)-2*sin(t)+2;
   long=r.*cos(t); lat=r.*sin(t);
   long=long/max(abs(long))*31-45;
   lat=lat/max(abs(lat))*35+38;
   line2kml('myheart',long,lat,'style','polygon','fillcolor','r','fillalpha',127,'linecolor','y','linewidth',5,'linealpha',255);
   disp(['Please open the myheart.kml file and have a look in GoogleEarth!'])
   return
end

if nargin<3
   help line2kml
   return
end

% check input arguments
mykml.type='Polygon';
mykml.linecolor='r';
mykml.linecolorstr='r';
mykml.linewidth=1;
mykml.fillcolor='r';
mykml.fillcolorstr='7f0000ff';
mykml.linealpha=127;
mykml.fillalpha=127;
while(size(varargin,2)>0)
   switch lower(varargin{1})
     case {'type','style'}
          mykml.type=varargin{2};
          varargin(1:2)=[];
     case {'linewidth','lw'}
          mykml.linewidth=varargin{2};
          varargin(1:2)=[];
     case {'linecolor','lc'}
          mykml.linecolor=varargin{2};
          varargin(1:2)=[];
     case {'linealpha','linetransparency'}
          mykml.linealpha=varargin{2};
          varargin(1:2)=[];
     case {'fillalpha','filltransparency','facealpha'}
          mykml.fillalpha=varargin{2};
          varargin(1:2)=[];
     case {'fillcolor','fcolor'}
          mykml.fillcolor=varargin{2};
          varargin(1:2)=[];
    otherwise
          disp(['Unknown property: ',varargin{1}])
          return
   end
end
mykml.linecolorstr=getColor(mykml.linecolor,mykml.linealpha);
mykml.fillcolorstr=getColor(mykml.fillcolor,mykml.fillalpha);

fid=fopen([kmlfile,'.kml'],'wt');
writekmlHeader(fid,kmlfile);

long=reshape(long,1,[]); lat=reshape(lat,1,[]);
switch (mykml.type)
  case {'Polygon','polygon','poly'}
     fprintf(fid,'%s \n','<Style id="idpolyfill">');
     fprintf(fid,'%s \n','<LineStyle>');
     fprintf(fid,'%s \n',['<color>',mykml.linecolorstr,'</color>']);
     fprintf(fid,'%s \n',['<width>',num2str(mykml.linewidth),'</width>']);
     fprintf(fid,'%s \n','</LineStyle>');
     fprintf(fid,'%s \n','<PolyStyle>');
     fprintf(fid,'%s \n',['<color>',mykml.fillcolorstr,'</color>']);
     fprintf(fid,'%s \n','</PolyStyle>');
     fprintf(fid,'%s \n','</Style>');

     fprintf(fid,'%s \n','<Placemark>');
     fprintf(fid,'%s \n',['<name>',kmlfile,'</name>']);
     fprintf(fid,'%s \n','<styleUrl>#idpolyfill</styleUrl>');
     fprintf(fid,'%s \n','<Polygon>');
     fprintf(fid,'%s \n','<tessellate>1</tessellate>'); %
     fprintf(fid,'%s \n','<outerBoundaryIs>');
     fprintf(fid,'%s \n','<LinearRing>');
  case {'line'}
     fprintf(fid,'%s \n','<Style id="idlineOnly">');
     fprintf(fid,'%s \n','<LineStyle>');
     fprintf(fid,'%s \n',['<color>',mykml.linecolorstr,'</color>']);
     fprintf(fid,'%s \n',['<width>',num2str(mykml.linewidth),'</width>']);
     fprintf(fid,'%s \n','</LineStyle>');
     fprintf(fid,'%s \n','</Style>');
     fprintf(fid,'%s \n','<Placemark>');
     fprintf(fid,'%s \n',['<name>',kmlfile,'</name>']);
     fprintf(fid,'%s \n','<styleUrl>#idlineOnly</styleUrl>');
     fprintf(fid,'%s \n','<LineString>');
     fprintf(fid,'%s \n','<tessellate>1</tessellate>'); %
  otherwise
   disp('Not defined')
end

fprintf(fid,'%s \n','<coordinates>');
%fprintf(fid,'%0.6f, %0.6f, 0.0 \n', [long;lat]);
fprintf(fid,'%0.6f,%0.6f,0 \n', [long;lat]); % update for new version google earth, 2012.10
fprintf(fid,'%s \n','</coordinates>');

switch (mykml.type)
  case {'Polygon','polygon','poly'}
     fprintf(fid,'%s \n','</LinearRing>');
     fprintf(fid,'%s \n','</outerBoundaryIs>');
     fprintf(fid,'%s \n','</Polygon>');
  case {'line'}
     fprintf(fid,'%s \n','</LineString>');
  otherwise
   disp('Not defined')
end
fprintf(fid,'%s \n','</Placemark>');

writekmlEnd(fid);
fclose(fid);

function writekmlHeader(fid,kmlName)
fprintf(fid,'%s \n','<?xml version="1.0" encoding="UTF-8"?>');
fprintf(fid,'%s','<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" ');
fprintf(fid,'%s \n','xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">');
fprintf(fid,'%s \n','<Document>');
fprintf(fid,'%s \n',['<name>',kmlName,'.kml</name>']);


function writekmlEnd(fid)

fprintf(fid,'%s \n','</Document>');
fprintf(fid,'%s \n','</kml>');

function colorHex=getColor(colorRGB,alpha)
colorHex='00000000';
if ischar(colorRGB)
   switch lower(colorRGB)
     case {'r','red'}
       colorHex(1:6)='FF0000';
     case {'g','green'}
       colorHex(1:6)='00FF00';
     case {'b','blue'}
       colorHex(1:6)='0000FF';
     case {'k','black'}
       colorHex(1:6)='000000';
     case {'y','yellow'}
       colorHex(1:6)='FFFF00';
     case {'m','p'}
       colorHex(1:6)='FF00FF';
     otherwise
          error(['Unkow color option: ',colorRGB])
   end
else
   if (max(colorRGB)>1)
      colorHex(1:2)=dec2hex(round(colorRGB(1)),2);
      colorHex(3:4)=dec2hex(round(colorRGB(2)),2);
      colorHex(5:6)=dec2hex(round(colorRGB(3)),2);
   else
      colorHex(1:2)=dec2hex(round(colorRGB(1)*255),2);
      colorHex(3:4)=dec2hex(round(colorRGB(2)*255),2);
      colorHex(5:6)=dec2hex(round(colorRGB(3)*255),2);
   end
end

if alpha>1
   colorHex(7:8)=dec2hex(round(alpha),2);
else
   colorHex(7:8)=dec2hex(round(alpha*255),2);
end
colorHex=colorHex([7 8 5 6 3 4 1 2]);
The demo case [run the script without any argument]:

Saturday, August 23, 2008

Bash shell demo

#!/bin/bash
# function to convert the reference in alert letter from AGU to Endnote
# Usage A2S FileName
# http://scriptdemo.blogspot.com

sed '/^$/d' $1 > $1.temp
sed 's/^[ \t]*//' $1.temp > $1
sed 'n;n;n;n;n;d;' $1 > $1.temp
mv $1.temp $1

Nline=$( wc -l $1 | awk '{print $1}' )
Nfile=$( expr $[ $Nline + 1 ] / 5 )
# let "Nfile = $Nfile / 5" or Nfile=$[ $Nfile / 5 ]

Nfs=1
while [ ${Nfs} -le ${Nfile} ]
do
SCHfile=scholar${Nfs}.enw
if [ -e $SCHfile ]
then
echo "$SCHfile exist!"
echo "Going on anyway or not [y/n]"
read YesNo
case $YesNo in
y | Y ) # or [y,Y])
rm -f $SCHfile
;;
n | N)
echo 'Convert aborted!'
exit
;;
esac
fi
touch $SCHfile
echo '%0 Journal Article' > $SCHfile
Topic=$( sed -n "$( expr $Nfs \* 5 - 3 )p" $1)
echo "%T $Topic" >> $SCHfile

Ln=$( expr $Nfs \* 5 - 4 )
NumName=$( sed -n "${Ln}p" $1 | awk -F\; '{print NF }')
Ns=0
echo "NumName is $NumName"
while [ $Ns -lt $NumName ]
do
Ns=$( expr $Ns + 1 )
Name=$(sed -n "${Ln}p" $1 | awk -F\; '{print $NL}' NL=$Ns )
echo "%A $Name" >> $SCHfile
done

Ln=$( expr $Ln + 2 )
Jname=$( sed -n "${Ln}p" $1 | awk -F, '{print $1}')
Vnum=$( sed -n "${Ln}p" $1 | awk -F, '{print $2}' | awk '{print $2}')
Nnum=$( sed -n "${Ln}p" $1 | awk -F, '{print $3}' | awk '{print $2}')
Pnum=$( sed -n "${Ln}p" $1 | awk -F, '{print $4}')
Nyear=$( sed -n "$[ $Ln + 2 ]p" $1 | awk '{print $3}')
Uname=$( sed -n "$[ $Ln + 1 ]p" $1 )
echo "%J $Jname" >> $SCHfile
echo "%V $Vnum" >> $SCHfile
echo "%N $Nnum" >> $SCHfile
echo "%P $Pnum" >> $SCHfile
echo "%D $Nyear" >> $SCHfile
echo "%U $Uname" >> $SCHfile

Nfs=$( expr $Nfs + 1 )
done

ShowCalendar