传统的地形可视化系统对地形数据的管理基本上都是基于文件系统,这在数据量较小时可以提供较快的数据存取。然而,随着数字地球(DE:Digital Earth)和全球信息网格(GIG:Global Information Grid)概念的相继提出,具有多分辨率、海量数据的大规模虚拟地形场景使得文件系统在数据的存取和管理上存在很大的局限性。由于无法预先将整个场景的数据全部装载至内存中,文件系统只能将大型场景分割成若干小场景,导致索引速度大幅降低,相互之间也难以实现查询等空间操作[1]。另外,文件系统也无法解决数据安全、并发操作、网络共享等问题。而空间数据库恰好能弥补这些不足,目前,空间数据库在一些大型三维GIS系统中已经开始应用,通过利用空间数据库的对象建模、数据共享、分布计算以及空间查询等优点,可以实现三维场景数据的动态加载、远程存取、高逼真度实时空间漫游等特性,足以替代文件系统在传统地形可视化系统中的地位。因此,全球虚拟地形场景要求通过空间数据库完成海量地形数据的存储管理,实现地形数据的动态调度和实时渲染。
2 全球多分辨率地形数据库的设计
在文献[2]中提出了一种基于海量数据库的DEM动态可视化方法,通过Oracle 8i数据库完成海量DEM数据的存储、管理和实时调度。基本思路是先利用等间隔划分方法对海量DEM数据进行空间划分,形成一个金字塔结构,然后将金字塔结构中一层DEM数据以一个数据表存储到Oracle数据库中,并以二进制大对象(BLOB: Binary Large Object)作为DEM数据存储的数据类型。BLOB是一种非结构性的数据,它可以进行任意的裁减与添加等操作,在存储空间方面,可以在一条记录中处理高达4GB的数据。当原始DEM数据在数据库中存储时,它首先被分解为块,组织成二进制的数据流,然后根据数据库原点和块的大小创建其索引。DEM数据表包括层数据管理表与层数据表两种,层数据管理表包含对数据库中DEM数据的总体描述信息,而层数据表存储DEM实体数据。实时调度时,采用多线程技术实现前后台两个数据页缓冲区之间的交换,其中Oracle数据库负责为后台缓冲区提供实时数据。该方法充分利用了Oracle数据库的优势和普通个人计算机的硬件渲染能力,实现了海量DEM数据的存储、管理、动态装载和渐进描绘。这种方法实际上代表了目前基于海量数据的地形可视化与空间数据库的典型结合模式,也是今后海量数据存储管理的主要发展方向。
2.1 需求分析
地形数据的存储单元,主要包括两类:文件型和数据库型。文件系统存储方式,一般适用于小型应用系统。与文件型存储单元相比,数据库在检索速度、管理、并发控制能力方面有着明显的优势,特别是现代数据库采用了缓存、聚类等技术,使索引速度提高了几十倍,在多用户并发访问环境下,数据库的优势会更加明显。全球多分辨率地形数据库需要实现的功能包括:全球多分辨率地形数据的存储与管理、全球多分辨率地形可视化数据的快速调度以及基于网络环境的客户端/服务器模式的数据库访问。
2.2 语义描述
地形数据的调度是按照一定的顺序规则进行查询,因而地形数据信息的存储是有规则的。本文中,先将地形数据按照金字塔模型存储在文件中,然后由文件导入数据库。金字塔是一种多分辨率层次(mufti-resolution hierarchy)模型,即采用倍率方法构建,形成多个分辨率层次。
数据库的结构与金字塔模型是相对应的,每一层对应于数据库的一个表,每一条记录对应于每一个数据块,数据块存储的位置与所在层的位置相对应。这种结构使文件和数据库保持一致,包括层的编排、块的编排、块的索引等,使存储与管理更加灵活。
2.3 逻辑结构设计(E-R关系图)
根据E-R图,将概念模型转换为逻辑关系数据模型。本文在金字塔模型上建立的数据库,每个LOD级别为一层一个表,每一层由相应的数据块构建,不足的行或列由原行或原列块数计算。表的命名即可以LOD层命名,如“LOD0”,也可以附加上行和列的块数,如“LOD_X_Y”。每个地形数据块为表中的一条记录,包括行号、列号和数据三个字段组成。
字段名
数据类型
行号
列号
数据
Integer
integer
BLOB
例如:
0
0
二进制数据
采用数据库存储数据,本文通过大二进制存储类型(Oracle9i中是BLOB类型,Sql server中是image类型)存储地形数据,包括DEM数据和纹理数据。Oracle9i中以BLOB字段类型存储二进制大对象,包括三种形式:声像数据、二进制数据和大文本数据。最常见的应用是存储图形、声音等对象,此外大型的二进制对象、OLE对象也可以通过BLOB类型存入数据库,如果文本对象过大,超出了文本类型的规定长度,则必须用BLOB字段进行存储(本文的地形块数据就属于此类)。在Sql server中,它提供了两种特殊数据类型 text和image用于定义BLOB数据。SQL Server的基本存储单元是页,每页2KB。一条记录必须存放在一页内,不能跨页存储,因此SQL Server中的每条记录的最大尺寸为1962个字节。对于一般数据类型的字段,其值直接存储在分配的数据页中,而对于text和image类型数据,值是存放在另分配的数据页中的,内容通过数据链串在一起。数据库记录的text和image类型数据字段内放的是数据链地址指针,这种存储机制使text和image类型数据可达2GB。因此,在经常使用的编程环境中如不能直接支持BLOB字段,需要调用相应的函数完成BLOB的使用。
3 全球多分辨率地形数据入库模式的设计
基于数据库的多分辨率地形数据的调度,首先是要在数据库中存储数据。本文按照金字塔模型生成的数据文件,包括DEM数据文件和纹理数据文件,通过数据库接口将数据文件中的每个数据块依次导入到数据库中相对应的字段,并生成相应的记录。
以SQL Server为例,采用ADO接口访问并操作数据库。ADO(ActiveX Date Object)是Microsoft数据库应用程序开发接口,是建立在OLE DB之上的高层数据库访问技术。ADO技术基于COM(Component Object Modal),具有COM组建的诸多优点,可以用来构造可服用应用框架,被多种语言支持,能够访问关系数据库、非关系数据库及所有的文件系统。另外,ADO还支持各种客户/服务器模块与基于Web的应用程序,具有远程数据服务RDS(Remote Data Service)的特性,是远程数据存取的发展方向。
ADO的结构如下:
使用ADO访问数据库的主要步骤包括[3]:
1) 初始化COM,创建ADO连接
AfxOleInit();
m_pConnection.CreateInstance(__uuidof(Connection));
2) 利用Connection的对象的Open函数连接数据库
m_pConnection->Open(m_ServerName, m_DBname, m_User, m_PassWord, long lOptions);
3) 使用Recordset对象打开记录集
m_pRecordset->Open(LPCTSR strSQL, long lOption, CursorTypeEnum CursorType,
LockTypeEnum LockType);
4) 用Field对象的AppendChunk存储二进制大对象,用GetChunk访问二进制大对象
m_pRecordset->AppendChunk(FieldPtr pField, LPVOID lpData, UINT nBytes);
m_pRecordset->GetChunk(FieldPtr pField, LPVOID lpData);
入库模式设计流程图如下:
数据文件
准备
文件形式
登录
连接、访问 创建
多分辨率
服务器 数据库
4基于数据库的全球多分辨率地形数据的调度
由于全球地形实时漫游方式体现了虚拟现实的特征,可以给用户提供直观的视觉效果以及更加灵活的操作能力,同时全球三维地形可视化要求空间信息表达详细准确,并且对用户交互操作能够达到实时响应,因而地形数据的实时快速调度是实现全球多分辨率地形仿真技术的重要内容。
4.1基于四叉树索引数据引擎的设计
数据引擎主要解决金字塔模型中各层各块的索引问题,即解决如何快速查询数据,如何快速从海量的空间数据中提取用户需要的目标数据,以确保地形数据的实时显示等需要。
四叉树是树型结构的一种,指的是一种每个非叶子节点最多只有四个分支(或称孩子)的树型结构。如图所示,圆形代表非叶子节点,矩形代表叶子节点。四叉树显然是一种层次数据结构,其公共特性是空间递归分解[4]。
4.2基于四叉树索引地形数据的快速调度
本文中引用的金字塔模型与四叉树都属于分层分块性质,且层之间都使用2倍率关系,因而可以采用四叉树技术来建立数据引擎,实现地形数据块的快速索引。根据四叉树的特点,其中N邻域、S邻域、W邻域和E邻域四个邻域对应金字塔模型中同级的N邻块、S邻块、W邻块和E邻块,也就是上邻块,下邻块,左邻块和右邻块[5]。
对于金字塔模型中的一个地形块,用这个地形块的LOD级别l,列号x,行号y,(l,x,y)来表示一个块的全球唯一编号,由此可得:
块的编号
块的位置
LOD级别l,列号x,行号y
已知块
(l,x,y)
左邻块
(l,x-1,y) x≠0
(l,2l+1-1,y) x=0
右邻块
(l,x+1,y) x≠2l+1-1
(l,0,y) x=2l+1-1
下邻块
(l,x,y-1) y≠0
(l,x,0) y=0
上邻块
(l,x,y+1) y≠2l-1
(l,x, 2l-1) y=2l-1
高级块
(l+1,[x/2],[y/2]) ([]表示取整)
低级块
(l≥1)
(l-1,2x,2y)
(l-1, 2x+1,2y)
(l-1,2x,2y+1)
(l-1,2x+1,2y+1)
通过上述公式计算出来的编号,是一种全球唯一编号,记录了数据块的位置,在数据库表中可定义为主键,以此来建立索引。采用了基于四叉树的索引结构,可以避免在可视化处理过程中将全部的空间数据索引信息读入到内存中,而只是将场景金字塔信息常驻内存,根据当前视点参数确定与视景体投影区域发生相交关系的一个或多个单元地形块,此时再将相关的地形块四叉树索引信息读入到内存中,并且当视点移动,某个子场景变为不可见时,则可以释放该索引占用的内存空间,这样能够有效地提高机器内存的利用效率,为三维场景空间数据提供更多的计算资源,从而提高系统的运行效率。从上述公式可以看出,计算邻块编号时只涉及一些简单的加减法运算,占用CPU时钟周期较少,因而采用四叉树结构索引是一种快捷有效的数据引擎方式。
5 客户端/服务器模式(C/S)下的地形数据库的访问
通常情况下,存储有海量数据的全球多分辨率地形数据库,仅仅依靠单一的数据库组织方式是不够的,需要建立分布式空间数据库,完成海量数据的存储、管理和索引,实现多用户远程并发访问。
分布式数据库系统是计算机网络技术与数据库技术互相渗透和有机结合的产物,是由分布于计算机网络上的多个逻辑相关的数据库组成的集合,网络中的每个结点具有独立处理的能力,可执行局部应用,同时,每个结点通过网络通讯系统也能执行全局应用。分布式数据库相比集中式数据库具有均衡负载、可靠性高、可扩充性好等的优势,解决组织机构分散而数据需要相互联系的问题。
登录 | 立即注册