- 积分
- 3638
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2014-10-21
- 最后登录
- 1970-1-1
|
楼主 |
发表于 2019-1-28 14:14:55
|
显示全部楼层
附件压缩包有一个KMZ和一个KML,分别是处理前和处理后的,
程序的作用是把一个KMZ处理为加了高度0的KML文件,
添加高度的循环语句是有点练逻辑性的,
可能别人有更好的方案,但我觉得这种程度的复杂度只能算是基本功
------------------------
;该函数用于将不可在GM上显示的IDL.contour.kmz转换为能显示的kml文件
;前提:IDL生成的等值线图kmz文件解压后是一个kml文件
;原始kmz和最后的kml文件同名
pro kmz_gm
;待处理的kmz文件:
kmzfile='C:\Users\Administrator\Desktop\kmz_GM\idl_icontour.kmz'
;zip文件名:
cut=strsplit(kmzfile,'.',/extract)
zipfile=strjoin(cut[0:-2],'\')+'.zip'
;获取文件路径,结尾不带\,备用
cut=strsplit(kmzfile,'\',/extract)
path=strjoin(cut[0:-2],'\')
;kmz文件后缀改为zip
file_move,kmzfile,zipfile
;解压
file_unzip,zipfile,path
;删除zip文件
file_delete,zipfile
;至此,文件已经转化完成,接下来是补充高度数据
kmlfile='C:\Users\Administrator\Desktop\kmz_GM\idl_icontour.kml'
n=file_lines(kmlfile)
openr,lun,kmlfile,/get_lun
x=strarr(1,n)
readf,lun,x
;读出文本后把内容换成空的:
openw,lun,kmlfile,/get_lun
printf,lun,''
close,/all
help,x
up=where(x eq '<coordinates>',count1)
down=where(x eq '</coordinates>',count2)
;如果不成对出现,或者<coordinates>不是占一行,就报错
if(count1 ne count2)then begin
warning=dialog_message('wrong!')
stop
endif
;数一下有多少对多边形:
m=n_elements(up)
;新建kml:
openw,lun,kmlfile,/get_lun
printf,lun,x[0:up[0]-1]
for j=0,m-1 do begin
;第一个特殊处理,因为它没有“上一个”,所以略过
if(j gt 0)then begin
printf,lun,x[down[j-1]+1:up[j]-1]
endif
printf,lun,'<coordinates>'
a=x[up[j]+1:down[j]-1]
a=strjoin(a,';')
a=a.replace(' ',';')
a=strsplit(a,';',/extract)
n=n_elements(a)
for i=0,n-1 do begin
a=a+',5000'
printf,lun,a
endfor
printf,lun,'</coordinates>'
if(j lt m-1)then begin
printf,lun,x[down[j]+1:up[j+1]-1]
endif
;最后一个特殊处理,因为它没有“下一个”
if(j eq m-1)then begin
printf,lun,x[down[-1]+1:-1]
close,/all
endif
endfor
end
|
|