📄 mif2kml.m
字号:
function mif2kml(UserPath)
%convert the mif data to kml, in order to display it in Google Earth.
%%
Depth=load('高程基准面.txt','-ascii');
%打开文件
[MifFileName,MifFilePath]=uigetfile(strcat(UserPath,'*.mif'),'请选择需转换的mif文件:');
if strcmp(MifFilePath(length(MifFilePath)),'\')~=1
MifFilePath(length(MifFilePath)+1)='\';
end
MifFilePathName=strcat(MifFilePath,MifFileName); %Mif 文件绝对路径引用
LineName=MifFileName(1:length(MifFileName)-4);
KmlFileName=strcat(LineName,'.kml');
KmlFilePathName=strcat(MifFilePath,KmlFileName); %Kml 文件绝对路径引用,生成的同名Kml文件存于与Mif文件相同目录中。
Fid_Mif=fopen(MifFilePathName,'r');
if Fid_Mif==-1
error(strcat(MifFilePathName,'无法打开!'));
end
%%
Fid_Kml=fopen(KmlFilePathName,'w');
if Fid_Kml==-1
error(strcat(KmlFilePathName,'无法打开!'));
end
%%
Fid_Str=fopen('kmlstr.txt','r');
if Fid_Str==-1
error('kmlstr.txt无法打开!');
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
fclose(Fid_Str);
%%
LineCounter=0; %线数目
while feof(Fid_Mif)~=1
TempStr=fgetl(Fid_Mif);
if length(TempStr)>5
if (length(TempStr)>10)&&(strcmpi(TempStr(1:4),'LINE')==1) % 直线
TempData=str2num(TempStr(5:length(TempStr)));
LineCounter=LineCounter+1;
LineName=strcat('线',num2str(LineCounter));
GenerateLineCor(Fid_Kml,LineName,[TempData(1) TempData(3)],[TempData(2) TempData(4)],[Depth,Depth]);
elseif (length(TempStr)>6)&&(strcmpi(TempStr(1:5),'PLINE')==1) %两种情况,单折线,合并的折线
if (length(TempStr)>15)&&(strcmpi(TempStr(1:14),'Pline Multiple')==1)
LineCounter=LineCounter+1;
LineName=strcat('线',num2str(LineCounter));
Num_Pline=str2num(TempStr(15:length(TempStr)));
X=[];
Y=[];
Z=[];
for c1=1:Num_Pline
TempStr=fgetl(Fid_Mif);
TempNum=str2num(TempStr);
CnnectionTag=1;
for c2=1:TempNum
TempStr=fgetl(Fid_Mif);
TempData=str2num(TempStr);
X(c1)=TempData(1);
Y(c1)=TempData(2);
Z(c1)=Depth;
end
end
GenerateLineCor(Fid_Kml,LineName,X,Y,Z);
else
LineCounter=LineCounter+1;
LineName=strcat('线',num2str(LineCounter));
X=[];
Y=[];
Z=[];
TempNum=str2num(TempStr(6:length(TempStr)));
for c1=1:TempNum
TempStr=fgetl(Fid_Mif);
TempData=str2num(TempStr);
X(c1)=TempData(1);
Y(c1)=TempData(2);
Z(c1)=Depth;
end
GenerateLineCor(Fid_Kml,LineName,X,Y,Z);
end
end
end
end
fprintf(Fid_Kml,'</Document>\n');
fprintf(Fid_Kml,'</kml>\n');
%%
fclose(Fid_Mif);
fclose(Fid_Kml);
%%
function GenerateLineCor(Fid_Kml,LineName,X,Y,Z)
fprintf(Fid_Kml,' <Placemark>');
fprintf(Fid_Kml,' <name>');
bytes_LineName = unicode2native(LineName, '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,' <extrude>1</extrude>\n');
fprintf(Fid_Kml,' <tessellate>1</tessellate>\n');
fprintf(Fid_Kml,' <altitudeMode>absolute</altitudeMode>\n');
fprintf(Fid_Kml,' <coordinates>\n');
N=length(X);
for c1=1:N
fprintf(Fid_Kml,'%.10f,%.10f,%.0f ',X(c1),Y(c1),Z(c1));
end
%%
fprintf(Fid_Kml,'</coordinates>\n </LineString>\n');
fprintf(Fid_Kml,' </Placemark>\n');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -