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

  • 相关阅读:
    Ehcache缓存回收策略
    [字符编码]Invalid byte 1 of 1byte UTF8
    JavaScript 单例模式
    Java程序员应该了解的10个设计原则
    医疗基本知识之医嘱篇(二)医嘱组成及规范
    VC++ (三)虚函数与重载
    VC++ (一)类的强制转换
    还是一个医学伦理问题,医疗费用高怪谁?
    电子病历开发经验共享 —— 2009年一时兴起写在某个论坛上的,转抄留恋。
    VC++ (二)类的访问级别
  • 原文地址:https://www.cnblogs.com/sharpfeng/p/2706801.html
Copyright © 2020-2023  润新知