全国高分辨率土地利用数据服务 土地利用数据服务 土地覆盖数据服务 坡度数据服务 土壤侵蚀数据服务 全国各省市DEM数据服务 耕地资源空间分布数据服务 草地资源空间分布数据服务 林地资源空间分布数据服务 水域资源空间分布数据服务 建设用地空间分布数据服务 地形、地貌、土壤数据服务 分坡度耕地数据服务 全国大宗农作物种植范围空间分布数据服务
多种卫星遥感数据反演植被覆盖度数据服务 地表反照率数据服务 比辐射率数据服务 地表温度数据服务 地表蒸腾与蒸散数据服务 归一化植被指数数据服务 叶面积指数数据服务 净初级生产力数据服务 净生态系统生产力数据服务 生态系统总初级生产力数据服务 生态系统类型分布数据服务 土壤类型质地养分数据服务 生态系统空间分布数据服务 增强型植被指数数据服务
多年平均气温空间分布数据服务 多年平均降水量空间分布数据服务 湿润指数数据服务 大于0℃积温空间分布数据服务 光合有效辐射分量数据服务 显热/潜热信息数据服务 波文比信息数据服务 地表净辐射通量数据服务 光合有效辐射数据服务 温度带分区数据服务 山区小气候因子精细数据服务
全国夜间灯光指数数据服务 全国GDP公里格网数据服务 全国建筑物总面积公里格网数据服务 全国人口密度数据服务 全国县级医院分布数据服务 人口调查空间分布数据服务 收入统计空间分布数据服务 矿山面积统计及分布数据服务 载畜量及空间分布数据服务 农作物种植面积统计数据服务 农田分类面积统计数据服务 农作物长势遥感监测数据服务 医疗资源统计数据服务 教育资源统计数据服务 行政辖区信息数据服务
Landsat 8 高分二号 高分一号 SPOT-6卫星影像 法国Pleiades高分卫星 资源三号卫星 风云3号 中巴资源卫星 NOAA/AVHRR MODIS Landsat TM 环境小卫星 Landsat MSS 天绘一号卫星影像
本文针对MapObjects Java Edition开发包提供的渲染器,结合电力GIS上的应用,讨论了实现图形对象上多值条件渲染的方法。
一、引言
地图上不同的符号特征表现是GIS应用的重要功能。ESRI的MapObjects Java Edition的开发包为此提供了相当丰富的渲染器。这些渲染器在描绘地图符号中起到了很重要的作用,利用它们能够在地图上显示各种各样的符号,符号的种类可以以图片的形式也可以用TrueType字体的形式来表现。比如,通过SimpleRenderer的实现类,我们可以对同一图层上的所有feature进行渲染,用一个符号进行显示;通过ValueMapRenderer的实现类,我们能够对同一图层上的feature根据某一字段的不同的值或不同的值范围,采用不同的符号进行渲染。
大多数情况下,这些渲染器已经能够满足应用的需求。但是当我们需要根据多个属性字段的组合值对一个feature进行渲染时(多值条件渲染),这些渲染器就不能够很简单的实现。
多值条件渲染常常出现在哪些应用场合呢,我们举一个例子。在电力GIS应用中,我们将电网上的所有设备作为一个设备图层,这个图层中包含了多种不同类别、不同电压等级的设备。根据应用的要求,需要按照以下的规则对设备进行显示:
1. 不同的设备采用不同的符号进行显示。
2. 无电设备的符号为红色。
3. 在带电状态下,电压等级为6千伏的设备符号为黄色,电压等级为10千伏的设备符号为橙色。
4. 每个可操作设备(如开关),根据不同的开合状态显示不同的符号。 按照以上要求,对于电网上的一个设备,我们需要根据不同属性的组合值,才能最终决定其显示的符号。
通过属性的组合值条件来显示设备符号的方式称作多值条件渲染。
二、多值条件渲染问题的分析
针对引言中提到的应用需求,MO Java提供的渲染器并没有提供实现直接的实现方法。那么,我们该如何能够方便快捷的实现feature的多值条件渲染呢?
在分析多值条件渲染问题的过程中,我们注意到MO Java提供的ValueMapRenderer接口,具备一定的条件渲染能力。但它仅仅能按feature上的某单一字段的值进行条件渲染,在面对多个字段的组合条件时就无能为力了。如果要想利用ValueMapRenderer解决引言中提到的应用问题,则只能采用增加额外字段,来保存由多个字段进行组合形成的唯一关键字的方式实现。
上述解决方式,利用了MO Java提供的实现方法,把所有的多值的问题都统一到单值的解决方式。但是,该方法的缺点在于:我们必须对需要进行多值条件渲染的设备进行统一的规划,进行统一的编码,如果编码的前期对需求了解不够充分,编码结束后扩充起来相当困难。
除了上述利用ValueMapRenderer进行单一编码解决问题以外,MO Java提供的GroupRenderer也能在一定程度上解决多值条件渲染问题。GroupRenderer是一个Renderer的集合,如果一个图层采用了GroupRenderer进行渲染,那么对于这个图层上的每一个feature都可以拥有多个renderer。GroupRenderer的特点是:renderer的渲染是有序的,渲染顺序在后的renderer将会把符号绘制在前一个renderer的符号之上。基于GroupRenderer以上的特点,我们可以采用GroupRenderer,利用多个renderer的结合来实现多值的渲染。
实现的方法如下:
将设备图层上的设备进行属性的组合,每一个组合会产生一类仅用一种符号进行描绘的设备,如:无电的设备、带电的10千伏设备及6千伏设备等三类。与此对应的GroupRenderer中也包含3个renderer,分别负责绘制无电的设备、带电的10千伏设备及6千伏设备。
GroupRenderer的实现方法优点在于,可以实现多值条件渲染而无需对每一类条件的设备生成唯一的关键字。
缺点在于一个设备将进行多次的渲染。如果renderer过多,效率不高,另一方面,必须将所有的设备根据组合进行分类,来定义GroupRenderer中包含的renderer,实现起来比较复杂。
三、多值条件渲染问题的高效解决方法
在对MO Java提供的方法进行分析以后,我们发现如果单纯依靠开发包提供的方法是不能够简单高效地解决实际应用问题的,因此我们将注意力最后放在了对渲染器的改造方面。由于Java语言本身强大的面向对象功能,使得继承MO Java渲染器接口,重新实现多值条件渲染成为可能。
在设计这个渲染器时,我们的设计原则是既能够实现多值条件渲染,又能够具有较好的扩充能力。同时,还要能够在调用时相对简单。根据分析,MO Java中ValueMapRenderer比较符合我们的设想。因此,选择对它进行实现类的重载,形成MultiValueMapRenderer。MultiValueMapRenderer对ValueMapRenderer中对象绘制条件部分进行了扩充,使之从支持单一的字段基础上能够支持多个字段的组合条件渲染。同时,对renderer的symbol加载方式进行了扩充,使之既能够通过原有的方式逐一添加,又能够通过批量方式快速添加,减少了代码编写的复杂性。在解决了基础渲染器问题后,就可以十分方便和高效地解决多值条件渲染的应用问题了。具体实现步骤如下:
1. 建立设备符号映射表。
2. 创建缓存,读入设备符号映射表。设备符号映射表缓存提供了直接的设备到符号上的映射,可作为symbol批量添加的数据源,解决了效率上的问题。
3. 读取设备图层上的设备及属性。
4. 调用MultiValueMapRenderer,根据设备属性的组合值和缓存进行匹配,取得要显示的符号。
5. 根据取得的符号绘制相应的设备。 在采用MultiValueMapRenderer后,实际应用效果图如下:
这种实现方法有如下的优点:
1. 实现简单。充分利用了Mo Java提供的实现类,只是对其进行简单的重载,保证了代码的延续性,减少了编码的复杂度。
2. 灵活高效。在图层上显示设备的过程可控,保证了显示设备的灵活性。对每一个设备,渲染只进行了一次,提高了显示的效率;加入了设备符号映射缓存,采用了高效率的匹配算法,使符号渲染的速度得到了大幅提升。
3. 嵌入了渲染条件接口,为今后复杂性问题的解决提供了较强的扩充能力。
四、结论
通过Mo Java提供的渲染类重载的方法,提供了解决多值条件渲染的一种思路。多值条件渲染的实现解决了GIS应用中的一个常见的实际问题,为多种GIS高级应用(如电网的trace分析),提供了良好的基础。
参考资料
1. MapObjects Java Editon开发文档
2. 《电力工程制图标准》
3. 《计算机图形学》 : 机械工业出版社,张全伙、张剑达著,2003-8
4. Java 2 Developer’s Handbook :SYBEX Inc. ,Philip Heller Simon Roberts ,1999-6
5. Design Patterns Explained A New Perspective on Object-Oriented Design :Pearson Education,Alan Shalloway James R.Trott,2003-7