一种数据库空间栅格对象存取方法

文档序号:6585428阅读:298来源:国知局
专利名称:一种数据库空间栅格对象存取方法
技术领域
本发明属数据库与地理信息系统交叉的信息领域,特别涉及一种在数据库管理系
统内核中实现的空间栅格对象存取方法。
背景技术
近年来,采用数据库方式存储和管理空间数据获得了快速发展。"关系型数据库+ 空间数据引擎"和"扩展对象关系型数据库"是当前工业界所采用的两种主流技术。前者 是经典GIS领域所采用的技术体系,其核心是利用高效的空间数据引擎(中间件)来组织 空间数据在关系型数据库中的存储和调用(以下简称"寄存模式");后者是IT数据库厂商 所采用的技术体系,其核心是在数据库管理系统(DBMS)内核增加空间数据类型、空间索引 及空间SQL语言(以下简称"内置模式"),从而形成空间数据库管理系统(spatial DBMS, SDBMS)。 内置模式由于将空间数据的管理与通用数据库系统融为一体,空间数据按对象存 取,可在数据库内核中实现空间操作和处理,并提供统一的SQL接口 ,已成为当前的发展方 向。但由于内置模式直接与数据库内核捆绑,实现难度较大,加之起步较晚,相比已较为成 熟的寄存模式,内置模式在不同空间数据的种类支持、海量空间数据的访问和操作性能等 诸多方面咎待提高。 空间栅格数据作为空间数据的一个重要组成部分,目前尚未以一种原生数据类型 得到数据库平台厂商的普遍支持。其中的重要原因之一是空间栅格数据采用文件还是数据 库方式管理尚存在争议。文件方式的优势在于 今栅格应用以只读访问居多,而栅格基于数据库方式的访问效率要低于文件方 式;今栅格数据与身倶来具有数据结构简单但数据量大的特点,其很多数据写入操作 (如镶嵌、金字塔创建等)往往由于更新数据量大无法在单个事务中完成,因此事务模型并 不能充分保证数据的ACID特性;今某些栅格文件格式可以内置金字塔和高效压縮算法,同样可以支持大数据量的 存储和访问。
但数据库方式管理也存在其优势,这主要体现在 今可支持更大规模数据量的栅格对象进行统一管理; 今对不同空间数据的访问、操作和分析都归结于统一的SQL接口 ; 今有利于矢量、栅格等不同空间数据类型在数据库环境下实现一体化空间检索、
分析和操作; 今数据的更高安全性。 以上,栅格数据基于数据库方式存储存在访问效率上的不足仍是问题的焦点。常 规SDBMS系统一般采用将空间栅格对象的像元值矩阵划分为多个栅格分块(block),每 个栅格分块存储为分块数据表中的一行,并采用普通字段记录栅格分块的序号和金字塔
4级别,并采用二进制大对象类型(B0LB)存储栅格分块像元值的方法来存储和管理空间栅 格对象。我们称这种将栅格分块存储于表,并按行组织和访问的方式为栅格数据的行内 (inline)存取模式。与之对应,将栅格分块存储于行外文件系统,并通过在行内存储文件系 统的定位标识的方式称为行外(outline)存取模式。由于基于行内模式的栅格分块存取涉 及分块数据表查询计划的执行、数据库页面调度和并发事务管理等,其访问效率降低成为 必然。 如何针对栅格数据的自身特点,扩展SDBMS所常规采用的行内分块存取模式,实 现数据库环境下基于表和基于文件的一体化管理,融合文件方式只读访问的高效性和数据 库方式集成一体化管理、高安全等优点,是本发明提出的初衷。

发明内容
本发明要解决的技术问题是针对空间栅格数据采用数据库方式存储访问效率不
佳的事实,提出了一种支持行内和行外两种存储模式的数据库空间栅格对象存取方法,通
过在数据库环境下引入一种内置的栅格文件系统,实现栅格数据只读访问效率的优化,并
通过构建行内基于表和行外基于文件的对等存取框架,实现上层SQL函数的透明化访问。 本发明解决其技术问题所采用的技术方案 —种向数据库存入空间栅格对象的方法,包含如下步骤 (1)创建栅格空间表方案,包含具有栅格列的用户主表和支持行内与行外两种存 储模式的栅格分块附属结构,其中行内模式采用数据库表的方式存储栅格分块,行外模式 则采用数据库文件系统的方式存储栅格分块,且两者具有对等结构,即均可存储来自用户 主表中的0 n个空间栅格对象的不同栅格分块; 以上所创建的栅格空间表方案中,用户主表的栅格列以数据库原生的栅格类型字 段进行定义,其每一行记录一个空间栅格对象,保存空间栅格对象的元数据信息,而栅格分 块附属结构保存空间栅格对象的像元信息,两者通过定位标识关联。 以数据库表的方式存储栅格分块,可采用分块记录表方案分块记录表包含指定 的表名,表中的每一行记录一个栅格分块,其中所属栅格对象的ID、栅格分块序号、栅格分 块的金字塔级别联合作为行记录的索引项存储,栅格分块所含像元的序列化值采用数据库 的二进制大对象类型存储。 以数据库文件系统方式存储栅格分块,可采用数据库内置的分块文件树结构分 块文件树包含指定的根目录,该根目录的路径名等效于分块记录表的表名;分块文件树的 根目录下可包含0 n棵分块文件子树,对应存储来自0 n个空间栅格对象的不同栅格 分块。其中,分块文件子树可采用扩展的四叉树金字塔模型进行构建分块文件子树的根目 录采用空间栅格对象的ID进行命名,向下按四叉树方式进行递归划分,每个子目录包含该 级金字塔当前区域上的系列分块文件,以及下一级金字塔的4个子目录,其中分块文件在 分块文件子树中的目录深度可换算栅格分块的金字塔级别,分块文件名记录栅格分块的序 号,分块文件的内容记录栅格分块所含像元的序列化值。 (2)创建新的空间栅格对象,以创建选项指定该空间栅格对象采用行内或行外存 储模式,以创建参数指定栅格分块附属结构的定位标识——即存储栅格分块的数据库表名 或数据库文件系统的路径名,并将以上创建选项和创建参数作为该空间栅格对象元数据的一部分保存至用户主表的栅格列中; (3)输入像元值到新插入的空间栅格对象中,由栅格分块写入驱动程序根据该对 象已指定的存储模式,分发执行像元值的行内分块写入或行外分块写入,保存至对应的栅 格分块附属结构中; 其中,行内分块写入包含如下步骤 ①根据分块附属结构的定位标识,打开分块记录表; ②对当前栅格分块所含像元值执行序列化操作,得到像元的序列化值; ③构建当前栅格分块的行记录,其中空间栅格对象的ID、栅格分块序号、栅格分块
的金字塔级别联合作为当前行记录的索引项存储,栅格分块所含像元的序列化值作为二进
制大对象类型存储; ④插入当前栅格分块的行记录到分块记录表。 与行内模式对等,行外分块写入包含如下步骤 ①根据分块附属结构的定位标识,定位到分块文件树的根目录; ②对当前栅格分块所含像元值执行序列化操作,得到像元的序列化值; ③构建当前栅格分块的分块文件,其中分块文件的内容为栅格分块所含像元的序
列化值,分块文件的路径根据栅格分块的属性推算; ④写入当前栅格分块的分块文件到分块文件树。 以上分块文件路径的推算可采用进制转换与按位分解的方法记当前栅格分块所 属空间栅格对象的最高金字塔级别为MaxPydLevel,所属空间栅格对象的ID为RID,当前栅 格分块所处金字塔级别为PydLevel,波段、行、列维序号分别为bbnd、 brow、 bcol ,则根据以 上属性,当前分块文件的路径推算包含如下步骤
①计算该分块文件在分块文件子树中的四叉树深度 QimrdD印th = MgixPydLevel-PydLevel+l,其中QimrdD印th > 1, PydLevel > 0 ;
②将十进制的brow和bcol转换为具有QuardD印th位的二进制值brown和
bcoln ; ③计算四进制的Morton码MortonIV = 2*brown+bcoln ; 将MortonIV按位分解为分块文件子树路径,例如,Mortor^为032,则为0\3\2 ;;
⑤以bbnd_brow_bcol方式构建分块文件名; ⑥构造最终路径分块文件树根目录\RID\分块文件子树路径\分块文件名。
(4)以输入的像元值为塔底数据,创建栅格金字塔。 以金字塔底数据为基础,按指定的抽样算法,以一定的倍率生成各级金字塔,并采 用同样的存储模式写入分块记录表或分块文件树,写入原理同上。 与以上写入方法相对应,一种从数据库读取空间栅格对象的方法,包含如下步 骤 (a)接受SQL函数的访问请求,执行仅用户主表读取或"用户主表+分块附属结构" 的联合读取; 仅用户主表读取。对于获取空间栅格对象元数据的SQL函数,由于不涉及像元数 据的访问,只要读取用户主表中的栅格类型字段即可。"用户主表+分块附属结构"的联合读取。对于获取空间栅格对象像元数据的SQL函数,首先访问用户主表获取空间栅格对象的元数据,进一步根据存储模式,对等访问行外或行内的栅格分块。
(b)对于"用户主表+分块附属结构"的联合读取,首先访问用户主表的栅格列,读
取出当前栅格对象的元数据,包括存储模式及栅格分块附属结构的定位标识; (c)进一步根据已确定的存储模式,由分块读取驱动程序分发执行行内分块读取
或行外分块读取,得到栅格分块所含的像元值。 将当前SQL函数对像元信息的访问请求,通过像元至分块的映射关系,分解为对栅格分块的读取操作,即向分块读取驱动程序发出请求,并由分块读取驱动程序根据当前空间栅格对象的存储模式,分发执行行内分块读取或行外分块读取。其中,行内分块读取包含如下步骤 ①根据分块附属结构的定位标识,打开分块记录表;
②根据当前栅格分块的索引项查询到栅格分块的行记录; ③读取当前栅格分块的行记录,从二进制大对象类型中获取出当前栅格分块所含
像元的序列化值,并执行反序列化操作还原出像元值。 与行内模式对等,行外分块读取包含如下步骤 ①根据分块附属结构的定位标识,定位分块文件树的根目录; ②根据当前栅格分块的属性,采用前述的进制转换与按位分解的方法,快速推算出对应分块文件的路径; ③读取当前栅格分块的分块文件,从文件内容中获取出当前栅格分块所含像元的序列化值,并执行反序列化操作还原出像元值。 本发明与现有技术相比所具有的优点是本发明针对空间栅格数据结构简单、数据量大、以只读访问应用为主的特点,对常规空间数据库管理系统单纯基于数据库表的方式存取栅格分块进行了扩展,引入了高效的行外分块存储结构——分块文件树,从而形成栅格像元数据基于行内与行外的两种并行存取框架。其中,分块文件树可采用数据库内置的扩展四叉树金字塔模型进行构建,分块文件通过进制转换和按位分解的逻辑运算快速定位,实验表明可提高数据存取效率达2倍以上,其次,所提出的行内分块记录表和行外分块文件树设计具有对等结构,可存储0 n个空间栅格对象的不同栅格分块,从而保证了数据库逻辑视图对栅格分块数据的对等存取,有利于上层SQL函数对底层像元数据的透明化访问。综上,本发明方法综合了文件方式的存取高效性和数据库方式有利于矢栅一体化管理、高安全等两者优点,解决了空间栅格数据采用数据库方式存储访问效率不佳的难题。


图1为本发明的数据库存入空间栅格对象的流程 图2为本发明的数据库读取空间栅格对象的流程 图3为本发明中的栅格空间表组织方案(schema)示意 图4为本发明中的分块文件树组织结构示意 图5为本发明中的空间栅格对象Subset查询示意图。
具体实施例方式
结合本发明方法,给出以下实施例向用户主表Tu的栅格列存入三行记录,对应保存空间栅格对象&、 R2和R3,数据源来自三张GeoTiff影像GTiffp GTiff2、 GTiff3,并以典型的数据子集截取操作Subset进行读取,以说明整个数据存取流程。 本发明提出的向数据库存入空间栅格对象的方法,其流程如图1所示,包含如下步骤 (1)创建栅格空间表方案Schemar ; 创建包含栅格列的用户主表Tu及其分块附属结构,形成栅格空间表方案Schemar={Tu, Tbr, Tbf},如图3所示。其中 ①Tu = {Q, C2, . . . , Cn, RASTER} (n > 0),为包含栅格列的用户主表表结构,由用户创建,其中&表示非栅格列,RASTER表示栅格列。假设本实施例Tu表的创建语句为CREATETABLE Tu(oid INT, srcfile VARCHAR(30) , rast RASTER)。其中,oid字段保存空间栅格对象的序号,srcfile记录栅格源文件名,而rast字段的每一行,存储一个空间栅格对象。 ②Tto = {Ci, Cp, Cbb, Cto, Cte, Cv},为存储Tu表rast列行内分块信息的分块记录表方案,其每一元组存储对应空间栅格对象的一个栅格分块。其中&为栅格分块所属空间栅格对象的唯一标识,记RID ;Cp为栅格分块的金字塔级别;Cbb、 Cto、 Cb。为栅格分块所在波段维、行维和列维的序号;CV为栅格分块所含像元的序列化值,可取BLOB类型,并联合Cp、 Cbb、 Cto、 Cb。建立基于B树的分块索引Ib。 Tto可以在Tu创建时同时创建,假设记该表名为Tbr_ri3me0 ③Tbf表示存储Tu表rast列行外栅格分块信息的分块文件树,其结构范例如图4所示。Root为分块文件树的根结点,对应存储分块文件树的根目录;Root结点下可包含多个分块文件子树,对应存储多个空间栅格对象的栅格分块文件,且每一分块文件子树可组织为扩展的四叉树金字塔模型,其根目录为RID结点,以唯一区分下属栅格分块的空间栅格对象归属,并向下按四叉树方式进行递归划分,使每个子目录存储该级金字塔当前区域上的分块文件,以及下一级金字塔的4个子目录。其中,分块文件在分块文件子树中的目录深度QuardD印th( > 1)与金字塔级别PydLevel ( > 0)的换算关系为:
PydLevel = MaxPydLevel-QimrdD印th+l 例如,图4中包含三个金字塔级别数据,最高金字塔级别为2(假设0级为原始图像),则中间层分块文件的金字塔级别为2-2+1 = 1。同时,假设记栅格分块在波段维、行维和列维的序号为bbnd, brow和bcol,则分块文件名可通过"bbncLbrowJ3col"方式构造,从
而与分块记录表中的Cbb、Cbr和Cb。形成等效结构。Tbf可以在主表Tu创建时同时创建,但由
于分块文件子树与具体空间栅格对象相关,Tbf的创建实际为Tbf的根目录创建,假设记该路径为Tbf_root。 (2)创建新的空间栅格对象&、&和R3,指定各自存储模式及栅格分块附属结构的定位标识,并将以上定义作为空间栅格对象元数据的一部分插入到已创建的用户主表中;
结合实施例,分别执行以下SQL语句创建并插入&、 R2和R3 :
INSERT INTO Tu VALUES(1, ' GTiffl' , ST_Create(' Tbr-name' , ' inline=true interleave = BSQ ;…'));
INSERT INTO Tu VALUES(2, ' GTiff2' , ST_Create(' Tbr-name' , ' inline=true interleave = BSQ ;…')); INSERT INTO Tu VALUES(3, ' GTiff3' , ST_Create(' Tbf_root' , ' inline=false ;interleave = BSQ ;…')); 其中,S乙Create函数实例用于创建空间栅格对象,其第一个参数指定栅格分块附
属结构的定位标识,第二个参数指定各创建选项,包括存储模式,具体实现步骤为 ①假设用户主表Tu的RASTER列采用二进制格式进行存储,则根据预定义的存储
格式创建&、 R2和R3的二进制实例,首先生成RID值写入二进制实例; ②根据创建选项中的inline = true,将&、 R2指定为行内模式存储,其定位标识
指向分块记录表lto-name ;根据inline = false,将R3指定为行外模式存储,其定位标识指
向分块文件树Tbf-root ;将以上存储模式及定位标识信息写入二进制实例; ③解析其他创建选项,如像元交叉类型interleave = BSQ等,并进一步读取
GeoTiff数据源,通过调用其它SQL函数设置空间栅格对象的其它元数据项,对应写入二进
制实例,完成&、 R2和R3的元数据定义。 (3)分别导入GTiffp GTiff2、 GTiff3的像元值到新插入的&、 R2和R3中,由栅格分块写入驱动程序根据对象已指定的存储模式,分发执行像元值的行内分块写入或行外分块写入,保存至对应的栅格分块附属结构中;
结合实施例,分别执行以下SQL语句导入数据
UPDATE Tu SET rast = ST_Import (rast, GTiff》WHERE oid = 1
UPDATE Tu SET rast = ST_Import (rast, GTiff2) WHERE oid = 2
UPDATE Tu SET rast = ST_Import (rast, GTiff3) WHERE oid = 3
其中,S乙Import函数实例用于导入外部栅格数据源的像元值,其第一个参数指定栅格列名,第二个参数指定数据源路经。导入包含逻辑分块的生成和物理分块的写入两部分
首先,读取GTiffp GTiff2、 GTiff3的像元值,根据&、 R2和R3的元数据定义,各自遍历生成统一格式的逻辑分块序列。其中,逻辑分块结构与分块的存储模式及其格式无关,如采用RastBlock结构类型,伪定义为Struct RastBlock{int rid, int pyd_level,BlockSN bsn, booliscompr, ComprPara cmpr—para, MBR mbr, size_t bytes, char化el1—values}。其中,rid为所属空间栅格对象的ID ;pyd_leVel为栅格分块的金字塔级别;bsn为栅格分块的序号;iscompr表示是否压縮;cmpr_para为压縮参数;mbr为栅格分块的外包矩形;bytes为像元值的总字节数;cell—values为像元值。 然后,将生成的每一个逻辑分块(即RastBlock实例),交由分块写入驱动程序负
责分发写入。结合实施例,&和R2的行内分块写入包含如下步骤 ①根据&和R2分块附属结构的定位标识,打开分块记录表Tto-name ; ②对&和R2的每一个逻辑分块执行像元值的序列化操作,即根据RastBlock的
iscompr以及cmpr—para,对块的像元值进行压縮处理,并根据像元深度是否小于单字节,
进行字节打包处理,最终形成分块所含像元的序列化值。例如,采用BlockSerl结构类型,
伪定义为Struct BlockSerl {size_t size, unsigned char*rlob},其中,size为rlob序
列化字节流总长;rlob为字节流首地址,而字节流的具体格式和实现相关,并需要符合指
定字节序;
9
③构建当前栅格分块的行记录,将RastBlock的rid对应Q、 pyd_level对应Cp、
bsn对应Cbb、 Cbr、 Cbc,并将rlob绑定到Cv ; ④插入当前栅格分块的行记录到分块记录表。 与行内模式对等,R3的行外分块写入包含如下步骤 ①根据R3分块附属结构的定位标识,搜索到分块文件树的根目录Tbf-r00t ;
②对R3执行同样的像元值的序列化操作,得到BlockSerl的实例;
③如图3所示,已知R3的RID = 3,假设R3的最高金字塔级别MaxPydLevel = 2,已知当前待写入栅格分块的PydLevel = 0(原始层级)、bbnd = 0、brow = 3、bcol = 2,则当前分块文件的路径推算步骤为 今计算该分块在分块文件子树中的四叉树深度QuardD印th =MaxPydLevel-PydLevel+l = 2_0+l = 3 ; 今将十进制的brow和bcol转换为位数为3的二进制值brown和bcoln,即011和
010 ;今计算四进制的Morton码MortonIV = 2氺broWn+bcoln,艮卩022+010 = 032 ;
今将M0rtonIV按位分解为分块文件子树路径,即0\3\2 ;
令根据bbnd_brow_bcol构建土央文件名为0_3_2 ; 今最终路径为Tbf-r00t\RID\分块文件子树路径\分块文件名,艮P :Tbf-root\3\0\3\2\0_3_2 。 而分块文件的内容为像元的序列化值,即BlockSerl的rlob。
④写入当前栅格分块的分块文件到分块文件树。
(4)以导入的像元值为塔底数据,创建栅格金字塔。 以金字塔底数据为基础,按指定的抽样算法,以一定的倍率生成各级金字塔,并采用同样的存储模式写入分块记录表或分块文件树,写入原理同上。 结合以上实施例,进一步说明本发明提出的向空间数据库读取空间栅格对象的方法,其流程如图2所示。假设执行以下SQL语句查询Tu表SELECT Width(rast),Height(rast), Subset(rast, Win(50 120,120 170), pyd(l))FR0M Tu WHERE oid < 4,以获取Ri、R2和R3的高度、宽度,并读取第l级金字塔数据与窗口Win(50 120,120 170)相交的像元子集,包含如下步骤 (a)根据SQL函数Width、Height和Subset的访问请求,区分两类读取操作仅用户主表读取和"用户主表+分块附属结构"的联合读取; 以上查询实例涉及两类SQL函数,其中Width、Height为获取空间栅格对象元数据的SQL函数,由于不涉及像元值的访问,故只需读取用户主表Tu中的栅格列即可;Subset由于需要获取像元值,故同时需要访问用户主表Tu以及分块附属结构。
(b)读取用户主表Tu的空间栅格列; 由于查询SQL函数是对主表Tu进行访问,故SQL执行器首先定位符合WHERE字句请求的每一个空间栅格对象,即本例中的R2和R3,然后读取空间栅格列的物理存储字节序列,并根据不同函数请求,读取不同的元数据信息 对于Width函数解析二进制实例,读取出空间栅格对象的宽度值,并返回结果;
对于Height函数解析二进制实例,读取出空间栅格对象的高度值,并返回结果;
10
对于Subset函数解析二进制实例,读取出Subset运算所需的元数据信息,包括 存储模式及其定位标识,进入下一步。 (c)进一步根据已确定的存储模式,由分块读取驱动程序分发执行行内分块读取 或行外分块读取,并返回查询结果。 参考图5所示,假设Subset的查询窗口与&和&相交,并通过坐标运算,相交部
分像元值正好落于&的B2分块和R3的B3分块,则分块读取驱动程序将根据&和R3的存储
模式,分发执行行内分块读取和行外分块读取。其中,针对Ri的读取步骤为 ①根据分块附属结构的定位标识,打开分块记录表Tto-name ;②假设B2分块的rid = l、pyd_level = 1、bbnd = 0、brow = l、bcol = l,则由
此构建行记录的索引项(Ci, Cp, Cbb, Cto, Cb。) = (1, l,O, 1, 1),并通过检索表Tto上的B树索
引Ib,查询到B2对应的行记录; ③读取当前栅格分块的行记录,获取出其中的BLOB字段值,实例化生成 BlockSerl结构,并执行像元值的反序列化操作,生成B2对应的逻辑分块结构RastBlock, 并返回与查询窗口相交的像元值。
针对1 3的读取步骤为 ①根据分块附属结构的定位标识,找到分块文件树的根目录Tbf-root ; ②假设B3分块的rid = 3、 pyd_level = 1、bbnd = 0、brow = l、bcol = O,则与
写入时的路径推算方法同,可快速求得该分块文件的路径为Tbf-rOOt\3\0\2\0_l_0 ; ③读取当前栅格分块的分块文件,并与行内模式同,执行像元值的反序列化操作,
生成B3对应的逻辑分块结构RastBlock,并返回与查询窗口相交的像元值。 分析以上实施例,本发明方法首先分解空间栅格对象为元数据和像元数据两部
分,其中元数据采用二进制方式存储,提高了数据存取效率,而像元数据则根据应用所需,
可在对象一级指定采用行内或行外存储,其中行内模式由于涉及分块记录表的搜索和并发
读写,数据一致性好但存取效率稍差,而行外模式虽适合于只读访问与独占更新,但由于采
用了数据库内置的扩展四叉树金字塔模型,分块文件通过进制转换和按位分解的逻辑运算 快速定位,实验表明可提高数据存取效率达2倍以上。其次,通过设计数据库环境下具有对 等结构的分块记录表和分块文件树,实现了像元数据基于行内和行外的对等存取框架,从 而保证了数据处理流程的逻辑一致性,其中分块存取驱动程序的引入,也进一步使上层SQL 函数对存储模式保持了透明。 本发明未详细阐述部分属于本领域公知常识。 以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人 员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应 视为本发明的保护范围。
权利要求
一种向数据库存入空间栅格对象的方法,其特征在于该方法包含如下步骤(1)创建栅格空间表方案,所述栅格空间表方案包含具有栅格列的用户主表和支持行内与行外两种存储模式的栅格分块附属结构,其中行内模式采用数据库表的方式存储栅格分块,行外模式则采用数据库文件系统的方式存储栅格分块,且两者具有对等结构,即均可存储来自用户主表中的0~n个空间栅格对象的不同栅格分块,n为正整数;(2)创建新的空间栅格对象,以创建选项指定该空间栅格对象采用行内或行外存储模式,以创建参数指定栅格分块附属结构的定位标识——即存储栅格分块的数据库表名或数据库文件系统的路径名,并将以上创建选项和创建参数作为该空间栅格对象元数据的一部分保存至用户主表的栅格列中;(3)输入像元值到新插入的空间栅格对象中,由栅格分块写入驱动程序根据该对象已指定的存储模式,分发执行像元值的行内分块写入或行外分块写入,保存至对应的栅格分块附属结构中;(4)以输入的像元值为塔底数据,创建栅格金字塔。
2. 如权利要求1所述的一种向数据库存入空间栅格对象的方法,其特征在于所述步 骤(1)中以数据库表的方式存储栅格分块,可采用分块记录表方案,分块记录表包含指定 的表名,表中的每一行记录一个栅格分块,其中所属栅格对象的ID、栅格分块序号、栅格分 块的金字塔级别联合作为行记录的索引项存储,栅格分块所含像元的序列化值采用数据库 的二进制大对象类型存储。
3. 如权利要求1所述的一种向数据库存入空间栅格对象的方法,其特征在于所述步 骤(1)中以数据库文件系统方式存储栅格分块,可采用数据库内置的分块文件树结构,分 块文件树包含指定的根目录,该根目录的路径名等效于分块记录表的表名;分块文件树的 根目录下可包含0 n棵分块文件子树,对应存储来自0 n个空间栅格对象的不同栅格 分块。
4. 如权利要求3所述的一种向数据库存入空间栅格对象的方法,其特征在于所述数 据库内置的分块文件树结构中,所述的分块文件子树可采用扩展的四叉树金字塔模型进行 构建分块文件子树的根目录采用空间栅格对象的ID进行命名,向下按四叉树方式进行递 归划分,每个子目录包含该级金字塔当前区域上的系列分块文件,以及下一级金字塔的4 个子目录,其中分块文件在分块文件子树中的目录深度可换算栅格分块的金字塔级别,分 块文件名记录栅格分块的序号,分块文件的内容记录栅格分块所含像元的序列化值。
5. 如权利要求1所述的一种向数据库存入空间栅格对象的方法,其特征在于所述步骤(3)中的行内分块写入实现如下(5. 1)根据分块附属结构的定位标识,打开分块记录表;(5. 2)对当前栅格分块所含像元值执行序列化操作,得到像元的序列化值;(5. 3)构建当前栅格分块的行记录,其中空间栅格对象的ID、栅格分块序号、栅格分块的金字塔级别联合作为当前行记录的索引项存储,栅格分块所含像元的序列化值作为二进制大对象类型存储;(5. 4)插入当前栅格分块的行记录到分块记录表。
6. 如权利要求1所述的一种向数据库存入空间栅格对象的方法,其特征在于所述步骤(3)中的行外分块写入包含如下步骤(6. 1)根据分块附属结构的定位标识,定位到分块文件树的根目录; (6. 2)对当前栅格分块所含像元值执行序列化操作,得到像元的序列化值; (6. 3)构建当前栅格分块的分块文件,其中分块文件的内容为栅格分块所含像元的序 列化值,分块文件的路径根据栅格分块的属性推算;(6. 4)写入当前栅格分块的分块文件到分块文件树。
7. 如权利要求6所述一种向数据库存入空间栅格对象的方法,其特征在于所述步骤 (6. 3)中分块文件的路径根据栅格分块的属性推算,可采用进制转换与按位分解的方法,即 记当前栅格分块所属空间栅格对象的最高金字塔级别为MaxPydLevel,所属空间栅格对象 的ID为RID,当前栅格分块所处金字塔级别为PydLevel,波段、行、列维序号分别为bbnd、 brow、bcol,则根据以上属性,当前分块文件的路径推算包含如下步骤(7. 1)计算该分块文件在分块文件子树中的四叉树深度QimrdD印th = MaxPydLevel-PydLevel+l,其中QimrdD印th > 1, PydLevel > 0 ;(7. 2)将十进制的brow和bcol转换为具有QuardD印th位的二进制值broWn和bcoln ;(7. 3)计算四进制的Morton码MortonIV = 2氺broWn+bcoln ;(7. 4)将M0rtonIV按位分解为分块文件子树路径;(7. 5)以bbnd_brow_bcol方式构建分块文件名;(7. 6)构造最终路径分块文件树根目录\RID\分块文件子树路径\分块文件名。
8. —种从数据库读取空间栅格对象的方法,其特征在于步骤如下(a) 接受SQL函数的访问请求,执行仅用户主表读取或"用户主表+分块附属结构"的 联合读取;(b) 对于"用户主表+分块附属结构"的联合读取,首先访问用户主表的栅格列,读取出 当前栅格对象的元数据,包括存储模式及栅格分块附属结构的定位标识;(c) 进一步根据已确定的存储模式,由分块读取驱动程序分发执行行内分块读取或行 外分块读取,得到栅格分块所含的像元值。
9. 如权利要求8所述的一种向数据库读取空间栅格对象的方法,其特征在于所述步 骤(c)中的行内分块读取步骤如下(9. 1)根据分块附属结构的定位标识,打开分块记录表;(9. 2)根据当前栅格分块的索引项查询到栅格分块的行记录;(9. 3)读取当前栅格分块的行记录,从二进制大对象类型中获取出当前栅格分块所含 像元的序列化值,并执行反序列化操作还原出像元值。
10. 如权利要求8所述的一种向数据库读取空间栅格对象的方法,其特征在于所述步骤(C)中的行外分块读取步骤如下(10. 1)根据分块附属结构的定位标识,定位分块文件树的根目录;(10. 2)根据当前栅格分块的属性,采用所述的进制转换与按位分解的方法,快速推算 出对应分块文件的路径;(10. 3)读取当前栅格分块的分块文件,从文件内容中获取出当前栅格分块所含像元的 序列化值,并执行反序列化操作还原出像元值。
全文摘要
一种向数据库存入空间栅格对象的方法,包含创建具有栅格列的用户主表和支持行内与行外两种存储模式的栅格分块附属结构;创建新的空间栅格对象,指定存储模式,并插入到用户主表的栅格列中;导入像元数据,由分块写入驱动程序根据存储模式分发执行行内分块写入或行外分块写入;创建栅格金字塔;相应的读取方法为访问用户主表的栅格列,读取出空间栅格对象,包括存储模式;由分块读取驱动程序根据存储模式分发执行行内分块读取或行外分块读取。本发明方法通过设计数据库环境下具有对等结构的分块记录表和分块文件树,实现了像元数据基于行内和行外的对等存取框架,解决了空间栅格数据采用数据库方式存储访问效率不佳的难题。
文档编号G06F17/30GK101763416SQ20091024411
公开日2010年6月30日 申请日期2009年12月29日 优先权日2009年12月29日
发明者冯登国, 周成虎, 张敏, 张明波, 徐震, 景宁, 朱自军, 李飞, 林永恒, 熊伟, 王超, 程昌秀, 谢炯, 费春霞, 陈振, 陈荣国, 陈驰 申请人:中国科学院地理科学与资源研究所;中国人民解放军国防科学技术大学;中国科学院软件研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1