| 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>'); |
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
[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]); |
Labels:
Command line,
earth,
google,
heart curve,
kml,
Matlab,
polygon,
script
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 |
Subscribe to:
Posts (Atom)
