爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 4209|回复: 7

[混合编程] IDL.KMZ在谷歌地图GM中不能正常显示的原因

[复制链接]

新浪微博达人勋

发表于 2019-1-28 09:48:19 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 15195775117 于 2019-1-28 17:19 编辑

使用IDL存的等值线contourKMZ文件这种问题:
在谷歌地球上显示正常,在谷歌地图上就乱了
GE.png

                               
登录/注册后可看大图

机缘巧合,上周我把GE中的等值线图另存一下,再在GM中打开,居然可以正常显示了!
经过不断简化KML脚本,我将二者进行了对比,发现:
不能在GM中显示的脚本,坐标没有高度信息,即---
GM中可显示的坐标表示为118,30,0
GM中不可显示的坐标表示为118,30
把高度加上之后,就能正常显示了!


(实践证明,此时的判断是错的,把脚本中的文件夹标签才是故障原因)
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2019-1-28 10:01:54 | 显示全部楼层
以下,我将编写程序,将脚本中缺少的高度信息(,0)加上,预想步骤:
1、将KMZ文件改为zip;
2、将zip文件解压为kml;
3、将kml中<coordinates></coordinates>之间的坐标数据识别出来
4、坐标数据替换
待续.......

评分

参与人数 1金钱 +30 贡献 +15 收起 理由
mofangbao + 30 + 15 长期坚持的鼓励

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 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

kmz_GM.rar

35.09 KB, 下载次数: 0, 下载积分: 金钱 -5

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2019-1-28 14:49:19 | 显示全部楼层
本帖最后由 15195775117 于 2019-1-28 15:32 编辑

经过几次比较,我发现添加高度0并不是解决之道!!!通过再次仔细地对照代码,我发现去除文件夹<Folder></Folder>可以使等值线图在谷歌地图上显示出来
------------
------------
;该函数用于将不可在GM上显示的IDL.contour.kmz转换为能显示的kml文件
;从“某目录\等值线图.kmz”到“某目录\等值线图\idl_icontour.kml”,支持中文名KMZ文件
;由于程序针对的是IDL输出的contour,其<Folder>和</Folder>单独占一行,
;所以删除等于<Folder>或</Folder>的元素即可,
;如果<Folder>和</Folder>与其他内容并行,则不能正常处理!!!
;该情况到需要的时候再打补丁
pro GMKML
;选择待处理的kmz文件:
kmzfile=dialog_pickfile()
;zip文件名:
cut=strsplit(kmzfile,'.',/extract)
zipfile=strjoin(cut[0:-2],'\')+'.zip'
;获取文件路径,path结尾不带\,备用
;获取文件名
cut=strsplit(kmzfile,'\',/extract)
cut2=strsplit(cut[-1],'.',/extract)
name=cut2[0]
path=strjoin(cut[0:-2],'\')
;kmz文件后缀改为zip
file_move,kmzfile,zipfile
;解压到kmz所在文件夹下级的kmz_unzip文件夹下
;避免kmz所在文件夹内存在其他kml文件造成混淆
file_unzip,zipfile,path+'\'+name
;删除zip文件
file_delete,zipfile
;kml文件路径
kmlfile=file_search(path+'\'+name+'\','*.kml')
print,kmlfile
;如果解压出来的不是一个文件就报错:
if(n_elements(kmlfile) ne 1)then begin
  warning=dialog_message('wrong!')
  endif
;数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
p=where(x eq '<Folder>' or x eq '</Folder>',count)
x[p]=''
openw,lun,kmlfile,/get_lun
printf,lun,x
close,/all
end
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2019-1-28 15:41:18 | 显示全部楼层
[转化为可执行文件失败了]在控制台输入以下两句,将GMKML.pro转化为exe:

save,filename='D:\GMKML.sav',/routines
make_rt,'GMKML','D:\',savefile='D:\GMKML.sav',/overwrite

该exe在安装了IDL的电脑运行正常,在没有装IDL的电脑上报错了:
Feige图片20190128153235.bmp



之前GUI时就有界面闪现的bug,没有界面,exe就无法推广给别人使用,
看来,生成exe的过程还需要仔细看下《IDL程序设计》
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2019-1-28 16:00:52 | 显示全部楼层
之所以必须把等值线图在谷歌地图上展示,
因为谷歌地球上的标注太少了,
工厂、店家、路名、企业...都要对照其他地图,十分不便,
实现了等值线图在地图上的显示,背景地图还可以换,行政交通图、卫星图、地形图皆可,分析起来很方便


飞鸽截图20190128155412.png 飞鸽截图20190128155748.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2019-2-20 10:48:21 | 显示全部楼层
实践证明,如果KMZ文件是引用等值线图贴在GM上,删除<Folder>也是不能显示的,案例见附件

流场.kmz

404.42 KB, 下载次数: 0, 下载积分: 金钱 -5

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2019-2-27 11:30:25 | 显示全部楼层
试验证明,流场、风场图只能以贴图形式放入GE,不能在GM呈现!

密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表