RIA在GIS动态数据管理与展示中的技术解析zz
原文地址:http://www.supermap.com.cn/sup/xwtxpage.asp?orderID=405
从2010年开始,“云计算”成为公众对于网络的新兴认知。随着“云计算”逐步揭开神秘面纱登上互联网的舞台,它为政府、企业和普通用户提供了更具伸缩性和强大计算与存储能力的服务,而处在用户交互感知最前端的客户端技术,也朝着更具表现力和互动性的方向发展。
带有地理位置的动态数据(包括历史版本数据),具有完整的时空特性,大数据量的动态数据则在历史推演、实时监控、科学研究、辅助决策等方面都具有重要意义。
目前这种大数据量的动态数据管理与运算,纷纷转移到了“云GIS”端,从而使得网络客户端必须提供良好的技术手段,才能在确保良好用户体验的前提下,实现数据的有效管理与最佳展示。本文将以SuperMap iClient 6R for Flex(以下简称iClient Flex)为基础,通过研究“云GIS”时代网络客户端管理和展示(渲染/呈现)动态数据的技术手段与解决方案,包括动态数据的存储、更新、显示、浏览(互操作)、特效等,提出基于RIA(Rich Internet Application)在动态数据管理与展示中的技术思路与解决方案。
SuperMap iClient 6R for Flex数据类型
SuperMap iClient 6R for Flex是超图软件推出的富客户端产品之一。它是一套完备的富客户端GIS二次开发平台,不仅继承了Adobe Flex技术所具有的开发效率高、可拓展性强、性能优越等优点,同时它还可完全脱离IDE,在Flash Player的支持下,直接访问GIS基本功能以及GIS服务功能。
作为一套成熟的GIS客户端产品,它在数据的展现形式上是多样的。按照数据模式,iClient Flex核心库将数据分为三大部分:要素数据、元素数据、栅格数据。
1. 要素数据是指基本的地理元素:点、线、面。
2. 元素数据主要用于使用音频、视频等多媒体数据,以及组件等表达某一地理对象或现象。
3. 栅格数据在iClient Flex中用于构建地理底图。
上述数据类型在iClient Flex客户端由对应的实体类来表示或承载,它们之间的关系如表1所示:
表1 iClient Flex数据类型与类库API之间的关系
(*上表中的ImageLoader为内部使用类,未开放)
下面以要素数据、元素数据为例(如无特殊说明,下文所提到的数据均指这两种),介绍iClient Flex平台是如何高效的管理、显示、浏览数据,以及如何完美的融合特效技术展示数据。
动态数据管理
数据是GIS得以发展的基础,如何管理数据是一个GIS产品需要解决的首要问题。在数据管理方面,iClient Flex针对不同的处理采用不同的管理机制。
1. 数据存储
数据存储是进行后续数据处理(主要包括添加、删除、更新、获取)的前提。iClient Flex采用两种数据存储机制:一种是数组,另一种是哈希表。当用户添加数据时,系统内部会同时在数组、哈希表中存储数据。
a 数组存储
采用数组存储数据是最常见的数据存储方法之一,主要用于批量,或通过索引等获取、删除、添加数据;在FeaturesLayer和ElementsLayer中,用于存储数据的数组类型接口分别为:FeaturesLayer:features、ElementsLayer:elements,当用户使用其它接口(如 addFeature())添加\删除\修改数据时,此接口均会更新。
b 哈希表存储
哈希表是一种根据关键码值直接访问记录的数据结构,具有查找方便、访问速度快等优点。iClient Flex哈希表存储机制主要用于通过ID获取数据项,数据结构如表2所示:
表2 iClient Flex哈希表数据结构
当数据添加至图层时,数据将以(key,value)的形式存储于哈希表中,如:HashTable.add(featureID,Feature)。相比于以往循环遍历数组获取数据项的方法,使用该机制存储数据,能够通过键值ID在哈希表中直接“拿”数据,有效缩短了通过ID获取数据项的处理时间。
2. 数据更新
通过侦听“数据改变”事件,iClient Flex支持全部/单个数据项的实时更新,包括地理位置、外观风格、属性信息等。
3. 数据获取/添加/删除。
a 数据获取,
支持通过数组、哈希表两种方式获取数据,对应的接口如表3:
表3 iClient Flex数据获取API
b 数据添加/删除
当用户添加数据时,系统内部同时在数组、哈希表存储两份;同理,当用户删除数据项时,数组和哈希表中对应的数据也会被删除。iClient Flex提供的有关添加/删除数据的接口如表4:
表4 iClient Flex数据删除/添加API
分级加载显示
基于“云”端大数据量的显示性能,一直是GIS富客户端关注的问题,iClient Flex采用分级加载显示方式逐级显示数据,用户在毫秒级便可浏览到数据,大幅缩短以往浏览大量数据的等待时间,甚至是无需等待,为用户带来新的体验效果。
1. 分级加载显示原理
首先将用户传入的数据(features/elements)分为n组(n的大小可由用户自定义),然后以组为单位进行遍历,将每组数据批量加载至承载容器中,先加载的数据不会延迟等待下一批数据的加载,而是实时绘制显示。因此,分级加载显示数据是一个过程,用户会在很短时间内浏览到第一组数据,较之以往的一次性全部加载的等待时间缩短很多。分级加载显示原理图如图1:
图1 分级加载显示原理
分级加载使用前后对比模型如图2:
图2 分级加载使用前后对比模型
2. 分级加载显示适用范围
分级显示功能适用于大数据量、批量加载数据时,批量加载数据对应的API接口如表5所示:
表5 iClient Flex数据批量加载API
3. 实例代码
以要素数据Feature为例,在Flash Builder 4中使用分级加载显示功能的代码片段如表6:
表6 分级加载显示代码片段
数据浏览
解决大数据量的显示性能问题后,必然引起人们对其浏览性能的思考。GIS数据浏览主要包括平移和缩放,针对要素、元素数据的特点,iClient Flex综合采用剪裁和快照两大技术,大幅度提升了数据浏览速度。
1. 剪裁
剪裁是指仅绘制、显示当前图层可视范围内数据,将不在可视范围内的数据“裁掉”,不做处理。剪裁原理模型如图3所示(以平移为例):
图3 剪裁原理模型
根据上图,当平移地图过程中,图层可视范围发生改变,图层中的数据需要实时更新。使用剪裁前,实时更新的是整幅图层中的所有数据;但使用剪裁后,仅更新图层可视范围内的数据项,这样可大幅度节省重绘时间。
2. 快照
Adobe Flex SDK 4.0中ImageSnapshot:capture-BitmapData接口是实现快照技术的基础,在地图平移/缩放开始时,首先利用该接口截取当前屏幕范围内的快照图片;然后以图片填充整幅图层;当平移/缩放完成后,再对图层中的数据进行重绘制,即用户在平移/缩放过程中所浏览到的地图是快照图片。
使用快照技术前,地图在平移/缩放过程中数据一直在实时刷新;使用快照技术后,平移/缩放过程中使用快照图片,不对数据刷新,Adobe Flex对图片缩放、移动功能的支持已相当成熟,因而在此过程中无需花费时间;最后,平移缩放结束后再对图层中的数据统一刷新,在时间上会取得显而易见的效果。
3. 剪裁与快照的搭配使用
由1可知,使用剪裁技术时,地图可视范围发生变化的过程中,虽然地图仅更新可视范围内的数据,但在这整个过程中,地图是不断地刷新;由2可知,使用快照技术时,地图可视范围发生变化的过程中,地图不会刷新,但当可视范围变化结束后,会对整幅图层上的所有数据进行刷新。由此可见,剪裁与快照是两个优势互补的技术。
iClient Flex考虑到要素数据和元素数据在平移、缩放中的不同特点,分别采用了不同的技术,具体如表7所示:
表7 数据与剪裁快照技术对应表
动态数据展示特效
特效是Adobe Flex富客户端技术的特色之一,iClient Flex秉承这一优势,将其完美地融合入GIS数据展示中,主要表现在动态聚散显示。
1. 聚散显示原理
聚散显示是指将一定范围内的要素聚合显示至一个点,被聚合的要素可以是地理上具有相关性的要素,或者属性上具有统一性,甚或是没有任何关联性。聚散显示的主要特色在于:一方面它可以从全局的角度表达被聚合要素的共性(如图4-(3));另一方面它可以简化要素布局,这种情况适用于大量要素的分布(如图4-(2))。
(1) 原始图
(2) 聚合后简化要素布局
(3) 表达聚合点共性
图4 聚散显示特色(以点要素为例)
需要注意的是,虽然被聚合要素在关联性上没有限制,但它们在类型上必须统一,即同为点/线/面要素。同时,iClient Flex产品内部是以要素的某一几何特征点为基础进行聚合的,即当被聚合要素为线/面时,用户可通过Clusterer: featureToGeoPointFunction接口设置线/面要素的几何特征点获取方法,如线中点、面中点或线端点、面的某一角点等等;点要素的几何特征点为其本身。
iClient Flex产品推出的聚散显示功能包括三种模式,它们之间可以动态实时切换,下面内容所指的“离散点”为被聚合要素的几何特征点,在无特殊说明情况下,统一代表被聚合要素:
a 中心聚散(CenterClusterer)
首先将离散点所在的图层按照一定像素大小划分为若干个栅格,然后将每一栅格内的所有离散点聚合至栅格的中心点。原始图如图4-(1),聚散结果如图5。其中,栅格大小可通过CenterClusterer :size进行设置。
图5 中心聚散
b 区域聚散(RegionClusterer)
首先根据一定的权重计算函数,计算每个离散点的权重值;然后,根据用户指定区域(多边形)内每个相邻离散点的权重比例确定聚合中心点,如此返复循环直到区域内所有离散点被聚合。原始图如图4-(1),聚散结果如图6。其中,离散点权重计算方法通过接口RegionClusterer: featureWeightFunction定义,聚散区域由接口RegionClusterer:regionFeatures定义,可设置多个区域。
图6 区域聚散
c 权重聚散(WeightedClusterer)
首先,根据权重计算公式计算每个离散点的权重值,并将离散点所在的图层按照一定大小划分为若干个栅格。然后,依次遍历每个栅格,在同一栅格内根据相邻离散点的权重比例确定聚合中心点,如此返复循环直到栅格内所有离散点均被聚合。原始图如图4-(1),聚散结果如图7。其中,离散点权重计算方法通过接口RegionClusterer: featureWeightFunction定义。
图7 权重聚散
2. 动态聚散显示样式
iClient Flex设计了三种聚散样式,它们之间可以自由的动态切换,适用于任何聚散模式。样式与类库API对应关系如表8所示:
表8 iClient Flex聚散样式API及对应图例
下面以中心聚散、发散风格为例,聚散样式设置代码如下表9:
表9 聚散样式示例代码
结束语
本文基于“云GIS技术”环境,以SuperMap iClient 6R for Flex为基础,研究RIA在动态数据中的处理技术。主要列举了iClient Flex在动态数据应用方面的四个技术特色:动态数据管理、分级加载显示、剪裁与快照、动态数据展示特效。以上几点涉及到数据应用的各个方面,充分显示了iClient Flex在数据处理方面的强大功能。