mesh2kml.m

来自「MATLAB语言下的(有源码):Mike Zero系列软件的前后处理 GE中岸线」· M 代码 · 共 95 行

M
95
字号
function mesh2kml(UserPath,X_Shift,Y_Shift)
%将mike生成的三角网格转储为google earth上的线
%必须为经纬度坐标形式的网格
%X_Shift,Y_Shift,分别为经度、纬度偏移量,单位度
%%
%打开文件
[MeshFileName,MeshFilePath]=uigetfile(strcat(UserPath,'*.mesh'),'请选择需转换的mesh文件:');
if strcmp(MeshFilePath(length(MeshFilePath)),'\')~=1
    MeshFilePath(length(MeshFilePath)+1)='\';
end
MeshFilePathName=strcat(MeshFilePath,MeshFileName); %Mesh 文件绝对路径引用
LineName=MeshFileName(1:length(MeshFileName)-5);
KmlFileName=strcat(LineName,'.kml');
KmlFilePathName=strcat(MeshFilePath,KmlFileName); %Kml 文件绝对路径引用,生成的同名Kml文件存于与Mesh文件相同目录中。
Fid_Mesh=fopen(MeshFilePathName,'r');
if Fid_Mesh==-1
    error(strcat(MeshFilePathName,'无法打开!'));
end
%
Fid_Kml=fopen(KmlFilePathName,'w');
if Fid_Kml==-1
    error(strcat(KmlFilePathName,'无法打开!'));
end
%
Fid_Str=fopen('Mesh2Kml_kmlstr.txt','r');
if Fid_Str==-1
    error('Mesh2Kml_kmlstr.txt无法打开!');
end
%%
H_Wait=waitbar(0,'数据转储中,轻稍候。。。。。。');
%读取网格节点坐标
TempStr=fgetl(Fid_Mesh);
Tag_Space=findstr(TempStr,' ');
Num_MeshNode=str2num(TempStr(1:Tag_Space(1)));
NodePosition=[];
for c1=1:Num_MeshNode
    TempLine=str2num(fgetl(Fid_Mesh));
    NodePosition(c1,1:2)=TempLine(2:3);
end
%%
%写入文件头,用文件名命名
fprintf(Fid_Kml,'<?xml version="1.0" encoding="UTF-8"?>\n');
fprintf(Fid_Kml,'<kml xmlns="http://earth.google.com/kml/2.1">\n');
fprintf(Fid_Kml,'<Document>\n	<name>');
bytes_LineName = unicode2native(LineName, 'UTF-8');
fwrite(Fid_Kml, bytes_LineName, 'uint8');
fprintf(Fid_Kml,'</name>\n');
%
while feof(Fid_Str)~=1
    TempStr=fgetl(Fid_Str);
    fprintf(Fid_Kml,'%s\n',TempStr);
end
%
fprintf(Fid_Kml,'		<name>');
bytes_LineName = unicode2native(LineName, 'UTF-8');
fwrite(Fid_Kml, bytes_LineName, 'uint8');
fprintf(Fid_Kml,'</name>\n');
%%
%读取三角形顶点配置
TempLine=str2num(fgetl(Fid_Mesh));
Num_Cell=TempLine(1);
clear TempLine;
for c1=1:Num_Cell
    TempLine=str2num(fgetl(Fid_Mesh));
    TempCellNum=c1;
    TempCellNode=TempLine(2:length(TempLine));
    %写入该三角形
    fprintf(Fid_Kml,'		<Placemark>\n');
    fprintf(Fid_Kml,'		<name>');
    bytes_LineName = unicode2native(strcat('网格单元',num2str(TempCellNum)), 'UTF-8');
    fwrite(Fid_Kml, bytes_LineName, 'uint8');
    fprintf(Fid_Kml,'</name>\n');
    fprintf(Fid_Kml,'			<styleUrl>#msn_ylw-pushpin</styleUrl>\n');
    fprintf(Fid_Kml,'			<LineString>\n');
    fprintf(Fid_Kml,'				<tessellate>1</tessellate>\n');
    fprintf(Fid_Kml,'				<coordinates>\n');
    for c2=1:length(TempCellNode)
        fprintf(Fid_Kml,'%.8f,%.8f,0,',NodePosition(TempCellNode(c2),1),NodePosition(TempCellNode(c2),2));
    end
    fprintf(Fid_Kml,'%.8f,%.8f,0',NodePosition(TempCellNode(1),1),NodePosition(TempCellNode(1),2)); %闭合多边形
    fprintf(Fid_Kml,'</coordinates>\n');
    fprintf(Fid_Kml,'			</LineString>\n');
    fprintf(Fid_Kml,'		</Placemark>\n');
    waitbar(c1./Num_Cell,H_Wait);
end
%
close(H_Wait);
%%
fprintf(Fid_Kml,'</Document>\n');
fprintf(Fid_Kml,'</kml>\n');
%%
fclose(Fid_Kml);
fclose(Fid_Str);
fclose(Fid_Mesh);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?