一、引言
目前与地理信息相关的信息绝大多数也是通过投影变换以平面的方式管理和使用,这已不能满足大范围甚至全球多分辨率海量数据管理的要求。
2005年,美国谷歌公司推出了一款免费的虚拟地球浏览软件GoogleEarth(谷歌地球),给了人们一种全新的感受,数据动态装载、地形渐进描绘、多重细节层次(LOD: Levels of Detail)和虚拟现实表现等已成为虚拟地球的典型技术特征。
因而构建一个虚拟地球,需要解决以下几个问题:全球角度空间数据模型的构造,海量地理空间数据(包括地形、影像)的组织、管理和调度,空间数据的三维可视化。
二、全球角度的空间数据模型
投影理论解决了球面或椭球面不可展的难题(尽管不完美),从而建立了二维平面与实际球面三维空间的对应关系,球面网格理论则构建了全球空间数据高效访问的应用分析模型。
(一)、球面网格
球面网格的基本原理是将球面(参考椭球面)递归剖分为面积、形状近似相等且具有多分辨率层次结构的网格单元,采用单元对应的地址编码代替地理坐标在球面上进行操作。
全球网格主要分为经纬线网格和多面体网格。
经纬度网格符合人们的思维习惯,计算简单直观且与现有各类数据转换比较方便,容易进行纹理坐标的计算和坐标转换(地理坐标到三维直角坐标),在添加地理数据时,所做的工作也最少。缺点是网格单元形状不均匀,接近极点的时候,网格扭曲,数据浪费严重。(图2-1)
图2-1 经纬度网格
多面体网格仅限于学术研究,鲜有工程化的实现。其最大优点就是每个网格单元扭曲很小,没有太大的数据浪费。这个特性非常有利于三维球面绘制。但缺点是在球面绘制时纹理映射比较复杂,另外在与地理坐标的转换上也是比较麻烦(图2-4)。
图2-2 多面体网格
(二)、基于经纬度的球面网格
基于经纬度的球面本身就隐含了一个矩形网格系统,为了改进在高纬度地区单元变形严重的缺陷,GeoFusion(2005)将全球划分为6个区域,其中4个处于南北纬45度之间,采用矩形网格,两个处于高纬度地区,采用三角形网格,避免了高纬度地区使用矩形网格带来的变形,但数学模型较复杂。
目前主流的虚拟地球浏览器均采用基于经纬度的球面网格系统,其中GoogleEarth、NASA WorldWind采用统一的矩形网格(图2-3),ArcGlobe则采用GeoFusion的全球网格技术(图2-4)。
图2-3 World Wind网格系统系统
图2-4 GeoFusion网格系统
(三)、全球地形网格
全球地形是虚拟地球的可视化基础。地形网格可以分为规则网格(Regular Surface Grid,RSG)和不规则三角网格(Triangulated Irregular Network,TIN)两类(图2-5)。
1.规则网格
RSG是最简单、最直接的数据模型,只需将覆盖区域划分为规则排列的矩形单元,数据实际上就是规则间隔的网格点或经纬网点阵列,每个网格点与其他相邻网格点之间的拓扑关系都隐含在该阵列的行列号中。根据该区域的原点坐标、网格间距和行列号,经过简单运算即可求得任意网格点的地理坐标。
由于RSG存储量小、结构简单、操作方便、因而非常适合大规模使用和管理。但是,RSG对复杂地形特征难以确定合适的网格大小,在地形简单地区容易产生大量冗余数据,而在地形比较复杂的地区,又不能准确表示地形的各种微小起伏。
2.不规则三角网格
若将地形特征根据一定规则连接成覆盖整个区域且互不重叠的三角形则构成一个不规则三角网格。TIN较好地顾及了地貌特征,能逼真地表示复杂地形的起伏,同时还能克服地形起伏变化不大的地区产生的数据冗余问题。但由于数据量大、数据结构复杂且构网困难,TIN一般只适合表示小范围大比例尺高精度的地形。TIN不仅要存储每个网格点的高程,还要存储点之间的拓扑关系,因而数据量较大。
图2-5 RSG和TIN
三、空间数据组织与管理
三维空间数据是虚拟地球的基础。虚拟地球的数据主要包括地形数据、二维矢量数据和模型数据。
(一)、地形信息的管理
地形数据又分为高程数据和影像数据,他们多采用分级组织、分块存储。
1.多分辨率金字塔
所谓多分辨率金字塔就是用一系列网格表示统一地区的地形,相邻上下层次之间的网格的采样精度一般为1:4,因此在大范围地形显示时,采用较低精度的数据能大幅度缩短数据访问时间(图2-5a)。
如果在每层网格上采用“分块策略”,则数据访问时间可进一步缩短,其基本思想就是将各层网格都细分为大小相等的矩形“瓦片”(Tile),这种数据结构也称为“瓦片金字塔”。其优点是一次读/写操作就能访问一个瓦片,并且经过甄别可以只访问所需的瓦片;缺点是数据冗余更多(图2-5b)。
图3-1 多分辨率金字塔
2.瓦片四叉树
多分辨率的TIN不具备简单的跨越式空间结构,在执行诸如视景体裁减、碰撞检测等操作时显得更为复杂,并且对TIN的压缩算法也比较复杂,不利于数据的快速访问。
采用“分层分块”策略的瓦片金字塔不但大大缩短了数据访问时间而且能够表示多分辨率数据,是海量地形数据组织的理想结构,通过与树结构的结合,具备了快速数据索引的功能,从而形成了大范围空间数据组织方式——瓦片四叉树。采用四叉树描述的瓦拓扑关系简单,其索引只涉及加、减、加倍和减半操作,可以通过效率较高的位运算实现(图3-2)。
图3-2 瓦片四叉树
基于经纬的球面网格的瓦片的数据采用经纬度加高程描述,符合人们的习惯,也比较直观,而在显示时,则要转换为空间直角坐标系。
目前流行的虚拟地球软件的数据组织方式,均采用瓦片四叉树结构。
(二)、模型数据的管理
在实现模型数据的管理时一般有两种方式,一是集成式存储,这种方式多用于存储自动建模或精细建模所生成的模型文件;另一种是以三维空间数据模型实现的模型数据(二维矢量数据是三维模型数据的一个子集),多以数据库的方式管理,其中三维空间数据模型由包含点、线、面、体这四类空间对象的空间实体构成,其索引可以采用三维R树来实现 。
四、三维可视化
在与地形、影像等栅格数据相关的各类应用中,大范围三维地形实时浏览对数据组织和呈现方式的要求较高,主要体现在两方面:海量数据处理和球面模型建立。
(一)、可视化关键技术
在计算机交互式图形处理中,实时动画往往要求每秒25~30帧的图形刷新频率(至少每秒15~20帧),也就是说所有的建模、光照和绘制等处理任务必须在大约17微妙的时间内完成,对数据调度机制和图形绘制策略都提出了高的要求。
为了在保证地形外观平滑的前提下尽量减少需要渲染的数据,有多种图形生成加速方法被提出,数据裁减、多细节层次技术(Level of Detail ,LOD)、异步数据加载、数据缓存、请求预测已经被广泛用于各种大规模地形场景的快速绘制算法中。
1.数据裁减
数据裁减主要是视景体裁减(View Frustum Culling),视景体裁减的核心是计算视场的锥体裁减范围,即由视场角定义的上下左右四个面(类似照相机的视角)和由投影矩阵定义的远近剪切平面(类似照相机的景深),而后看三维实体(对于球面瓦片,可用其包容圆柱体)是否与视景体的相交或被视景体所包含(图4-1)。
图4-1 视景体(View Frustum)
2.多细节层次技术
LOD 技术是在不影响画面视觉效果的前提条件下,通过逐次简化景物的表面细节来减少场景的几何复杂性,从而提高绘制算法的效率,其所遵循的原则就是能够模拟“越远越模糊,越近越清楚”这一视觉现象,通常利用视角高度(Eyealt)与瓦片尺寸的比来判定是否当前显示的瓦片是否需要分解为更高分辨率的子瓦片(图4-2)。
图4-2 瓦片层次
3.异步数据加载
异步数据加载就是通过不同的线程加载瓦片数据,线程之间相互独立而又彼此关联,其工作原理是:主线程通过LOD算法与数据裁减计算出所需瓦片,如果瓦片不在数据缓存中,则将其添加到请求队列,当数据加载完毕,通知主线程瓦片可以使用,刷新视图。为了在数据加载时不影响显示的流畅性,主线程会先采用其上一级直至顶级的数据来绘制。异步数据加载还需剔除请求队列中因场景变换已不再需要加载的瓦片,避免资源的浪费。
4.数据缓存
数据缓存有磁盘缓存和内存缓存,磁盘缓存用于将远程数据下载到本地硬盘,以提高数据加载速度,一般情况下磁盘缓存的大小是被限定的。
内存缓存也叫高速缓存,是已经加载了的数据,可直接用于场景显示。高速缓存的大小设有上下限,用以控制缓存的瓦片数量不致太少也不要太多,缓存数据的置换算法可以用最近最少使用算法(Least Recent Use, LRU),LRU的主要出发点就是,如果某个瓦片被访问了,则它可能马上还会被访问。
5.请求预测
数据缓存机制可以提高系统的性能,当地形场景连续运动时,如果应用程序能够提前预测系统即将需要的数据,并能提前把这些数据读到缓存区,那么当应用程序真正需要这些数据的时候,便可以直接从缓存区读取,从而省去了从数据源读取这些数据的时间。在海量地形漫游时,数据调度和场景绘制需要同时进行,因此,可以设立一个独立的线程来进行数据的预测调度。
(二)、地形的三维可视化
1.地形网格的构造
地形数据多采用地理坐标(如经纬度)加高程信息的地形数据,这需要转换为对计算机而言表达简单,处理效率较高的空间直角坐标(图4-3)。
图4-3 地形数据球面映射
大地坐标系是统一的,能准确、唯一地描述地球上任一点的位置,并能动态适应历史的、现代的越来越精密的各种参考椭球体,是虚拟地球最为适当的坐标系(图4-4)。
图4-4 地形数据投影模型
三维地形模型的几何构造要素多为三角形(图4-5),即每个瓦片根据地形点阵数据,再构成三角形网格,这一过程是动态实时进行的,构造好的地形网格被存入地形高速缓存以备调用(图4-6)。
图4-5 地形网格
图4-6 ArcGlobe的GeoFusion地形网格
2.纹理映射
纹理映射能够有效增强图像的真实感,在地形可视化中,卫星影像是最能提高地形真实性纹理。目前,几乎所有支持纹理映射的图形处理硬件都在其硬件系统中设置了纹理内存来缓存纹理数据以提高纹理映射的效率。纹理内存的容量有限,图形处理硬件可能无法缓存全部纹理数据,每次纹理映射时都需从主存中传输部分纹理数据,因此也需要设置纹理高速缓存中以备调用。
(三)、模型的三维可视化
模型数据也可以用瓦片为单位建立高速缓存,来提高系统性能。
在三维模型的展示上,点状对象(如树、路灯、管线点等)常采用三维模型符号来表示;线状对象(如管线)也是先建立三维线状符号(如圆柱体),获取线状对象的走向、长度、半径、高度方面的信息后,经过缩放、旋转、平移操作实现线状对象的绘制;面状对象绘制需建立模型并配以纹理贴图。
(四)、三维注记
注记是虚拟地球中一个不可缺少的要素,有了注记,才能保证对地理信息的正确认识和方便地进行查询分析。汉字的显示与单字节文字的显示不一样,在OpenGL中是以轮廓文本的方式输出的。
五、测试程序设计与实现
(一)、三维平台简介
1.三维引擎
三维引擎主要是OpenGL(OpenGraphicsLib)和Driect3D。
OpenGL是Silicon Graphics公司(SGI)开发的一个工业标准,它灵活方便地实现了二维和三维的高级图形技术,具有建模,变换,光线处理,色彩处理,动画等。OpenGL独立于硬件设备,窗口系统和操作系统。
Direct 3D是基于微软的通用对象模式COM(Common Object Mode)的3D图形API,主要为游戏开发而设计,是DirectX的一个组成部分。以COM接口形式提供的API,较为复杂,稳定性差,另外,目前只在Windows平台上可用。
在游戏领域,DirectX的影响力已渐渐超越OpenGL并被大多数PC游戏开发商所采用,但在专业高端绘图中,OpenGL因为功能更丰富且图象质量更高,仍然主宰这一领域。
2.现有的虚拟地球产品
基于OpenGL的虚拟地球产品主要有:NASA WorldWind Java版、OssimPlanet(以开源的Open Scene Graph为基础),ArcGlobe;基于Driect3D的虚拟地球产品主要有:NASA WorldWind C#版、Skyline。GoogleEarth则支持OpenGL、Driect3D两种三维引擎渲染方式。
上述平台都支持二次开发,国内的一些虚拟地球产品大多以开源的平台为基础进行二次研发。
3.测试程序开发平台的选择
作为一个测试程序,在三维平台上主要参考开源的NASA WorldWind Java版和基于OSG(Open Scene Graph)的OssimPlanet。
NASA WorldWind Java版基于JOGL(Java OpenGL,Java对OpenGL API绑定)开发,是一款架构优秀的虚拟地球开源软件(图5-1),其数据模型针对椭球球面网格而建,而在城市三维模型展示以及矢量数据处理上目前支持不足,且在渲染时需要由Java到C语言的一次内存拷贝,性能上会打折扣。
图5-1 NASA WorldWind Java架构图
OssimPlanet继承了OSG的场景数据管理结构且实现了与NASA WorldWind类似的全球网格模型(图5-2),OSG基于C++语言,大量运用了C++模版技术,因而开发难度较大,在数据结构中主要运用树结构组织数据,用C++智能指针来实现数据的共享,用仿函数类(重载()操作符的C++类)实现事件映射。
图5-2 ossimPlanet架构图
(二)、测试数据组织
在全球高程和影像数据瓦片金字塔构建上,各虚拟地球产品基本一致,不同的是最上层(0层)的瓦片大小(Level Zero Tile Size),第0层可以是一个瓦片,经度跨360度,纬度跨180度,也可以是多个瓦片,NASA World Wind的第0层影像瓦片有10×5个,经纬度跨36度(图5-3),其高程数据第0层瓦片为18×9个,经纬度跨20度。
图5-3 NASA World Wind第0层瓦片
1.瓦片金字塔模型构建
在构建地形金字塔时,首先把原始地形数据作为金字塔的底层(图5-4),如图第2 层,并对其进行分块,形成第2 层瓦片矩阵。在第2 层的基础上,按每2×2个像素合成为一个像素的方法生成第1 层,并对其进行分块,形成第1 层瓦片矩阵。如此下去,构成整个瓦片金字塔。
图5-4 瓦片金字塔的构建
对于全球的高程和瓦片数据,分多少级是合适的呢?三维引擎的透视原理是模拟相机在标准视角下拍摄物体的情形,相机的标准视角约为25度,此时的视角高度与瓦片尺寸的比值为2,根据这一原理,如果原始图像是1米精度,视角高度为500米的卫星影像,则赤道上每一瓦片的宽度应为250米,对于周长为40000公里的地球,如果第0层是1个瓦片的话,要建0至17总计为18层的瓦片金字塔。
2.瓦片四叉树
四叉树是一种每个非叶子节点最多只有四个分支的树型结构,也是一种层次数据结构,其特性是能够实现空间递归分解。图5-5 是瓦片金字塔模型的四叉树结构示意图,其中矩形符号代表叶子节点,圆形符号代表非叶子节点。
图5-5 瓦片四叉树
四叉树的层与瓦片的层对应,四叉树的节点编号是瓦片所在层的层号加上瓦片的网格坐标(见图3-2)。因此,瓦片的拓扑关系(图5-6)包括同一层内邻接关系和上下层之间的父与子关系两个方面。邻接关系有边邻接和角邻接,上下层间有向上继承和向下分解。
图5-6 瓦片的拓扑关系
3.瓦片金字塔的编程实现
在瓦片金字塔的编程实现上,可以有两种方式,一种是建立一个四叉树数据结构,保存瓦片上下层之间的拓扑关系,在一个节点中保存父节点和四个子节点的指针,另一种是用散列映射(hash_map)数据结构,其中瓦片的索引作为键,瓦片的智能指针作为值。
四叉树数据结构在调入一个瓦片时必须先生成其父瓦片指针,在删除一个瓦片时必须先删除其所有子瓦片指针,不利于LRU算法的有效实施,而散列映射数据结构则要灵活得多。
(三)、数据的调度与可视化
地形网格的调度过程和纹理影像的调度过程是一样的,一先一后,假设地形数据与影像数据是一起加载,则数据调度与可视化流程表示为图5-7所示。系统运行效果如图5-8所示。
图5-7 数据调度与可视化流程图
图5-8 测试程序运行效果图(广州大学城)
六、结束语
本文从原理、工程实现以及具体编程几个方面分析和探讨了全球角度空间数据模型的构造,海量地理空间数据的组织、管理和调度,空间数据的三维可视化这三个在虚拟地球实现中所面临的难题,并在测试程序中实现了主要的功能,但在二维地理数据以及模型的可视化上,测试程序还没有实现。随着三维技术的发展,基于三维平台的地理信息应用会越来越多,这将是本文中测试程序扩展的方向。
参考文献
[1] 张永生,贲进,童晓冲.地球空间信息球面离散网格——理论、算法及应用.科学出版社,2007:第一章,第二章
[2] 李成名,王继周,马照亭.数字城市三维地理空间框架原理与方法.科学出版社,2008:第五章