FreeMicaps开发计划

开放式气象信息综合分析处理系统计划-―― FreeMicaps
 
       是否有同行和我一样,梦想过能编写一套自己的Micaps系统?
       数年来,我一直关注这方面的东西,逐步实现Micaps的部分功能…
       计划做一套基于插件天气图分析系统,兼容目前Micaps的数据格式,实现Micaps的基本功能。
 
一、开发史
2001 ,使用VC6实现Micaps数据读写,地图绘制,风/云量绘制,并且开源。(现在看来,当年的代码实在太幼稚…汗…)   http://61.134.39.90/gjf/down/mdcl.zip
2003年,为某机场写一套程序,将填图代码用Delphi写了一遍…程序涉密,图就不贴了。后把它修改成了我省的自动站填图系统: http://61.134.39.90/gjf/down/AsDisp.zip
还是 2003年,参考大量前辈的代码后,逐渐实现了等值线分析,当时做的等值线,太丑。(等值线分析想做好,难呀)
2005年,用Delphi将地图功能做成了控件,不仅有一般的漫游缩放功能,还加上了投影(投影计算,太麻烦了)向Micaps又靠近了一步。后利用它做了全国自动站填图系统(本打算添上等值线分析等,但因…原因,放弃了),因我工作变动,服务器维持了2年多后,终于挂了。
 
2005-2007年间,和别人的合作了两个课题,终于在正式场合用上了多年研究的程序,出的程序虽然LJ,但我也总算理清了等值线分析思路,尝试了多种分析办法,从插值到分析再到平滑直到填色,都一一动手实现:
现在的领导越来越喜欢网页,等值线图当然要做到网站上去, 2007年,依靠开源代码,用Python实现了网站上的等值线分析(但完全没有深入阅读老外的源码,对技术没有任何提高)。
还是 2007年,Delphi已日落西山,可惜了多年写下的代码,重新将代码封装成对象(参考《计算机地图制图》教科书),实现了气象上常用的四种投影和反投影(感谢老婆对超长的公式推导,高数没学好呀…)下面的图虽然乱了点,但已有图层管理,支持shp格式地图,别小看它,一个完全从底层实现的小型Gis引擎哟,速度超快!
2006年,不得不承认,Delphi已没有前途,该转移阵地了…在苦苦钻研Linux C半年后,虽然也为外单位做了几个程序,但还是也放弃了,图形界面是个大问题,linux用户数量更是问题,程序做好基本上只有自己在用。
对于实时系统,我一直不看好Java、.Net等类解释型语言,但看来别无选择。Java入门还算容易,用Java实现了地图引擎的部分功能。年底的工作变动,又使我从Java完全转到.Net阵营。新的领导和同事清一色的微软开发环境。又是长时间的入门学习历程,一年多的时间基本上都是在做网站,直到听说Micaps3用C#开发,又勾起了我对天气图分析系统的兴趣,结合近年来辛苦钻研的UML和设计模式,将前面的Delphi写的Gis引擎,用C#原样改写一遍,C#的垃圾自动回收和丰富的类库,使代码编写容易了不少,GDI+的使用,也使图漂漂了不少,呵呵。
地图引擎不用多说了,漫游缩放是必须的,兰布托、极射赤面、麦卡脱投影气象上是常用的,图层管理作为Gis系统也是一定要有的,另外缩略图使用起来是很方便的。
       至此,介绍完了我多年来为实现Micaps的部分功能而做的努力。常有同行问我,你的程序中的地图是用什么控件实现的,我告诉他,我用代码画的,多数人都不相信,认为我保守,不愿给他控件,其实,程序都是人编的,像画地图,就是读出经纬度数据,然后用画线语句画出来,就这么简单的过程,只是很繁琐,多数人耐不住寂寞,静不下心来做而已。
       还有很多人都说,你做的那些功能,Micaps早实现了,你还做那些干嘛?应该去做些有创新的东西。其实,做这些程序,一个是兴趣,另一个也是学习的过程。软件开发需要积累,需要不断地学习积累,才不至于落后,才不至于和别人落越远。如今的社会,大家都很浮躁,都想一鸣惊人,想创新,开发不是在钻研学习,投机取巧,眼高手低,做不出自己的东西。可悲的是,这些人却常会受到有的领导的赏识,这种现象更有越演越烈之势。扯远了,回归正题!
 
 
二、 程序架构及思路:
       本计划之所以叫“开放式”的,主要是指尽量发挥用户力量,用户能根据需要编写插件对程序的功能进行扩充,包括对功能扩充和对数据类型进行扩充。
       Micaps1时代,对Micaps的二次开发,是对其数据的读写,严格来说,这算不上二次开发,读取Micaps格式数据自己进行分析,写成Micaps格式用它来显示,仅仅数据处理而已。Micaps2进了一步,支持用户编写Com组件对软件功能进行扩充,但可能由于组件开发难度太大,并且留给用户的接口太少,组件式二次开发并没有得到很好利用。Micaps3最近刚见到,完全的组件式开发,支持用户插件,很不错,但好像运行效率很低,运行有些吃力,正式版应该有所改进。
       插件作为流行的二次开发模式,现在应用越来越广泛,从Photoshop到Matlab,Delphi、VC、VS、Eclips等开发环境也都用插件进行功能扩充,年初参加一次Lotus展示会,竟然发现IBM把Lotus做成了Eclips插件,在Eclips框架里实现Loutus客户端,惊呆了,程序竟然能这样编。
       大多数插件使用Dll插件,按主程序给定的接口编写动态链接库,实现主程序预留的一些功能,但由于Dll没有共享内存部分,不能保存状态数据,插件的编写比较困难。Delphi对Dll进行了扩充,支持传入对象参数,这使得插件编写容易了不少,但限定只能用Delphi编写(2005年和别人合作,使用Delphi编写了一个高空审核程序,绘图功能全用插件实现,效果很好)。.Net的Dll得到了更好的扩充,可以从Dll中导出类,这给插件的编写带来极大方便,编写插件几乎和编写普通应用程序一样容易。看看下面用Delphi编写的使用插件的程序,使用7种插件绘制了7种图形
       FreeMicaps会将所有功能都放在插件里实现,甚至包括用界面。程序的主窗口仅仅是一个包含菜单条、工具条、状态条的空窗口,里面的各类控件将在插件中实现。主程序用一个插件管理对象完成各类插件的查找和加载。
       FreeMicaps的插件分为功能扩展插件和数据接口扩展插件。功能插件用来对程序功能进行扩展,前面所说的给程序添加界面等,就是功能扩展插件。数据接口扩展插件是对程序所支持的数据类型进行扩充,Micaps的19种格式数据将都用插件实现,还考虑支持数据库、网络等一些非文件型数据,用户还可编写插件实现本地特殊格式数据的显示。
       一切皆是插件,主程序是一个通用框架,可以作为任何程序的框架,它仅完成插件管理和加载功能,具体功能由每个插件完成,目前的思路是这样,并也是这样做的,但开发中发现这样做插件之间的依赖太强,使得插件的开发难度有所增加,考虑是否将程序主框架的初始化放入主程序中。    
三、逐步完成的功能:
       注: 下面的图看似简单,实际的实现却需付出巨大努力,每一步都需要花费数日甚至数周的工作。程序没有使用任何第三方库或源码,完全自己实现,涉及气象的东西更没有任何资料可供参考。
       主程序完成,后面需要逐步实现各类数据的接口插件的编写。
       地图使用Micaps第9类格式数据,这个是最基本的,早已编写完成,按数据接口插件Interface重新封装,形成Dll插件,程序即实现地图数据的读取及显示。
       地面高空填图数据比较麻烦的是风向风速、云量、天气现象符号的显示。好在2001年已用VC完成这方面工作,照搬过来;由于地图做了投影,同一风向在不同经度方向是不一样的,需要计算不同经纬度处的旋转角度。各经度上的西风:
 
 
画一圈不同风向看看:
填上字再看看(字也旋转一下,效果不错哟):
 
 各类投影都得试试:
  
 
好了,风可以用了,填个高空图试试:
填图字符也旋转一下,和纬线平行(填图速度慢了不少)
 
试试云量和天气现象符号:(天气现象符号本来是用图片实现的,还从老外网站上下载了一个天气现象字库。后来找到Micaps的天气现象矢量字符数据,用它了)
好了,1、2、9类格式数据插件都实现了
图层属性设置,通过属性可以修改绘图样式
第4类格式,该画等值线了
 
与Micaps比较一下,挺像的嘛,呵呵
 
属性改改,效果不错,还没做平滑
看看细线效果
 
温度场
 
 
还得看看,别的投影有没问题
还是高空图
地面图,有点乱
 
物理量场,加粗值也得考虑
 
老觉得等值线不对劲,颜色弄错了嘛,蓝色的舒服多了。一年多没用Micaps了
 
 
怎么搭配比较好?等高线用粗线,等温线用细线?
 
总温度
 
细线好像不太清楚?
 
其实,没有平滑的等值线更真实
 
汶川地震了,先写个17类格式插件,显示站点信息,看看汶川在哪,怕怕,其实离俺们这也不远呀,宁强到广元,几十公里而已。楼快摇到了,以为自己死定了,还在想,我要这么就被压下面,程序没拿出去也太可惜了。默哀一下
 
继续做等值线,等值线标注转转,与纬圈平行,跟填图规范一致了
样条平滑,效果其实不明显。我一直认为,等值线还是不做平滑的好。
 
做个抹角平滑,把小于45度的角都削掉,效果还是很明显的
 
对比一下做平滑前。效果虽好,但有可能会虑掉一些小波动,稍稍平滑一下就行,别贪心
 
等值线是怎么做出来的呢,先读入格点数据(绿圈圈),再找等值线点(红十字),连接等值点(红线),平滑等值线绘图(兰线)。具体怎么做呢?看书去吧…
继续优化,等值线越来越漂漂了,臭美一下
 
填个色,还没做调色板,先用个灰度的试试。效果一般。以后再做吧
 
将前后上下翻页功能做成单独的插件,和数据检索插件分开了
 
基本功能已经做好了,对C#的理解有所深入,程序结构还可以做进一步优化,插件接口和界面也打算做次大的改动。是时候对代码进行重构了。
这几天余震不断,人心惶惶,稍有风吹草动,狂奔下楼。歇几天再说。
(未完待续...)
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 23
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值