GIS图层管理

转自:http://blog.csdn.net/hzgjf/article/details/3014558

 

最近,已有几位朋友在问关于图形绘制中的图层管理的问题,语言表达能力有限,电话里解释半天,对方可能让我搅得更糊涂了。整理一下思路,写出来可能会更清楚一些。

在Gis软件和一些图像处理软件中经常会有图层这个概念,如PhotoShop。使用图层的好处是可以将绘制的图像图形分层,对某层的操作不会影响其他层,并能增加删除隐藏图层,给人的感觉好像是在一层一层的玻璃上绘图,然后将这些玻璃叠起来形成一副完整的图像。

但在各类编程语言中并没有图层这个概念,图层只是程序员脑中虚拟的东西。最简单的,将每类图形的绘制过程单独写成一个过程,增删等图层管理就是对这些绘图过程进行控制,如画一副天气图写成伪代码就是这样子:

  1. 绘图
  2. {
  3.     清屏();
  4. if(显示地图)   画地图();
  5. if(显示填图)   填图();
  6. if(显示等高线) 画等高线();
  7. if(显示等温线) 画等温线();
  8. }

主程序里就可以控制绘制条件来画需要的图层了.是不是很简单,呵呵

但是,有问题出来了,如果我改变了绘图条件,如将"显示填图"由"True"变为了"False",也就是隐藏了填图图层,怎么才能擦除填图层呢?擦掉已画出来的图是不可能的了,就像我们手工画天气图一样,本想用橡皮擦掉等温线,但一擦连下面的等高线也擦掉了,计算机绘图更不允许出现这样的情况.解决的办法很简单,重绘!你可能会说,"我只想去掉一层,你却将所有图层都重画一遍,多麻烦呀!",其实计算机最擅长做的就是这种麻烦而且重复的工作,重绘一次仅花费不到1秒的时间.就像老板说你的等温线画的难看,与其擦掉等温线,还不如重拿一张空图再画一遍.

再就是图层管理问题了,上面的办法只能解决有限个图层的情况,图层不能增删,只能隐藏,如果我需要不断在上面添加新图层,像再加一层云图.这就要用到面向对象了.我们可以将绘图过程封装成一个个类,如"地图图层类"/"填图图层类"/"等值线图层类",主程序里用一个列表或动态数组,要添加那种图层就向这个列表里加上这个类的对象,在绘图过程中遍历列表中的图层对象,调用它们的绘图方法,增删图层只是对图层列表中的对象进行增删.写成伪代码:

  1. 绘图
  2. {
  3. for(int i=0;i<图层列表.count;i++)
  4.     {
  5.         图层列表[i].绘图;
  6.     }
  7. }

这个是不是更简单?没学过面向对象的朋友可能还是不太理解,我还是用手工画天气图作为例子:老板给我们一张白纸说:“把今天的地面图画好给我!”,我则先来找来地球仪,描出东亚地图,再找到地面资料,一站一站填好要素,再画等压线,三小时变压,天气区、槽线、锋面...画好后拿给老板一看,老板说:“谁让你分析槽线和锋面了(水平不够),拿去重画!”晕倒!现实中这样肯定是不科学的,于是,我们定了一个预报流程,将工作分给了多个人,首先,印刷厂工人给我们印好天气图底图,然后我们用填图机填好要素,预报员分析好等高线,槽线和锋面可让首席给我们定,于是一张天气图很快就画好了。程序中,印刷厂/填图机/预报员/首席就是一个个图层对象,预报流程就是列表,我们可以在列表中增删对象以满足不通需要。面向对象博大精深,还需要在实际中多实践...

FreeMicaps使用面向对象技术,不仅将读数据和绘图封装成类,还将他们用插件方式实现,这样增加一种数据类型只需要实现给定的接口并挂入主程序即可,道理和上面类似。

posted @ 2012-09-28 10:40  sharpfeng  阅读(5785)  评论(0编辑  收藏  举报