更新时间:2022-08-26 11:18
采用集成 R 树、哈希表和 B* 树的混合索引方法HBSTR-tree,图1是 HBSTR-tree的原理和框架示意图。3种子索引结构的作用分别为:(1)R树是主体索引结构,用于实现时空范围查询;(2)哈希表是辅助结构,维护移动对象的最新轨迹节点,用于成组插入采样点;(3)B*树是次要索引结构,轨迹节点的一维索引,用于实现目标对象的轨迹查询。
采样点包含对象标识符、时间戳和空间位置等数据项,由于传感器遮挡或者不稳定等因素,采样点空间位置数据可能出现粗差,一般采用某些数据清洗方法过滤粗差数据。单个移动对象的采样点数目数以万计,分散管理采样点不利于查找轨迹,对存储利用率和创建效率均会产生负面影响。
哈希表用于管理所有对象的最新轨迹节点,便于通过对象标识符查找对象的最新轨迹节点,当一个轨迹节点满时,插入R树,创建新的轨迹节点接收新采样点。这样,以节点形式成组插入时空R树的方式,可大幅度提升索引创建效率。
HBSTR-tree中,R树是 N+1维(N 是空间维数,1指时间维)的时空R 树,R树节点最小包围盒 MBR是其孩子集 合 的 时 空 坐 标 轴 最小范 围,时间参考采用1970年以来的绝对秒数作为基准。上文轨迹节点作为R 树的叶节点,采用一种新的节点插入算法将其索引项插入叶节点层的上一层中,利用节点选择和节点分裂子算法优化时空R树结构。时空R树支持多种查询类型,如搜索某时空范围内的对象集合、对象轨迹,或者某时刻某空间范围内的对象集合、对象位置,或者某时刻某空间点的最近邻对象等。时空R树搜索目标对象在某时间段内的轨迹并不高效。为解决该问题,采用轨迹节点的对象标识符 OID和起始时间tTimeStart组成一维关键码(OID+tTimeStart)构建轨迹节点的 B* 树索引,借助B*树的一维查询能力,高效定位某对象在某时刻的轨迹节点,利用B*树兄弟节点间的双向指针进行轨迹追溯。轨迹节点通常包含近百个连续采样点,相对于直接采样点的一维索引结构,该方法节省存储空间90%以上。
以在dept表的dname列上创建B树索引为例,因dept表只有4行记录,dname列上的索引只需要一个叶节点,即一个数据块即可存储全部索引数据,这个叶节点数据块的内容是排序后的dname列值及相应列值所在记录的rowid,这里的rowid只包括文件号、数据块号以及记录在数据块中的地址,并不包含dept表的伪列rowid中的object_id部分。
索引在叶节点数据块中的存储格式与表的行数据存储方式相似,每个由索引列值及row-id构成的组合可以看作一行记录,这些行从数据块的尾部开始填充,每行记录在数据块中的地址存储在块头部的槽中。若在dept表的dname列上创建索引,则其只由一个叶节点构成,图2给出B树索引叶节点的结构。从图2中可看出,B树索引叶节点中的rowid部分由48个bit构成,前10个bit表示文件号,中间22个bit表示块号,最后16个bit表示块中的行号,即槽号。
在多播组内创建一个叶节点相对简单,在ATM网络中,作为一个“叶节点”,必须随时随地监听来自一个“根节点”的、要自己加入一个组的邀请。值得注意的是,在任何指定时刻,Windows 98和Windows 2000仅能支持一个ATM叶节点。换言之对任何ATM“点到多点”会话来说,在整个系统的范围之内,只能有一个进程成为它的叶成员。
在ATM网络中,创建一个叶节点的步骤为:
(1)使用WSASocket函数,创建地址家族AF_ATM的一个套接字,同时设置WSA_FLAG_MULTIPOINT_C_LEAF和WSA_FLAG_MULTIPOINT_D_LEAF这两个标志。
(2)使用bind函数,将套接字同本地ATM地址及端口绑定到一起。
(3)调用listen(监听)命令。
(4)用accept或WSAAccept等候邀请。至于具体用哪个命令,要取决于使用的是哪种I/O(输入/输出)模型。建好连接后,叶节点便可开始接收来自根的数据,对ATM多播而言,数据流必须是单向的,由根节点至叶节点,不可逆反。
叶节点加入IP多播组的过程较简单、因为每个节点都是一个“叶节点”,所以在加入一个组的时候采取的操作步骤都是一样的。由于IP多播在Winsock1和Winsock2中都可以实现、所以可通过两种API调用方法,来做成同样的事情。值得注意的是,假如一个应用程序只是打算发送数据,便不必加入一个IP多播组。向多播组发送数据时,网络中传输的数据包与普通UDP包大致相同,只是目的地址换成了一个特殊的多播地址而已。但假如想接收多播数据,便必须加入一个组。但无论如何,除了对组成员资格的要求之外,IP多播通信与普通的UDP协议通信并无区别,因为两者都是“无连接”的、“不可靠”的。
在Winsock 1中,创建实现IP多播通信所需的叶节点的基本步骤:
(1)使用socket函数创建一个套接字,注意要设为AF_INET地址家族以及SOCK_DGRAM套接字类型。要想初始化一个多播套接字,不必设置任何特殊标志,因为socket函数本身便没有提供标志参数。
(2)如果想从组内接收数据,需要将套接字同一个本地端口绑定到一起。
(3)调用setsockopt函数,同时设置 IP ADD MEMBERSHIP选项,指定想加入的那个组的地址结构。
如果使用的是Winsock 2,那么步骤(1)和(2)是相同的,而步骤(3)要换成调用WSAJoinLeaf函数,将叶节点加入那个组。
Geode类(即Geometry Node)相当于OSG中的叶节点。它没有子节点,但是包含了osg::Drawable对象,而osg::Drawable对象中存放了将要被渲染的几何体,一般的可绘制几何体都是通过Geode节点来传向root节点进行渲染。Geode节点是OSG几何绘制的最高管理节点。