章 碧,邢 朦,王任中
(中国船舶重工集团公司第七二四研究所,南京 211153)
谷歌地球(Google Earth,GE)是一款谷歌公司开发的虚拟地球软件。它把卫星照片、航空照相和GIS布置在一个地球的三维模型上[1]。与普通电子地图不同的是,谷歌地球并非矢量地图,而是由大量图片文件组成。基于谷歌地球文件进行电子地图的二次开发的先决条件为谷歌地球文件的跨平台移植,而在移植谷歌地球文件时,不论是直接进行文件拷贝还是先进行文件压缩再进行文件解压均需耗费大量时间。因此,考虑将谷歌地图文件转化为oracle数据文件,并对数据文件中对应的数据表进行优化,一方面提高了谷歌地球文件的平台移植效率,另一方面能快速读取任一谷歌地球文件。
谷歌地球文件由大量的可移植网络图形格式文件(即PNG文件)和联合图像专家组格式文件(即JPG文件)按照图层类型、图层编号和文件夹序号分别存放后组合而成,其文件结构如下:第1层为根目录,第2层为图层类型,第3层为图层编号,第4层为文件夹序号,第5层则为各个编号的图片文件。图层类型分为“行政”、“街道”和“卫星”3种。图层编号从0(包含0)开始累加,编号越小包含的图片对应的地图比例尺越大,图片数量越少;反之,编号越大包含的图片对应的地图比例尺越小,图片数量越大。文件夹序号作为图层编号的下一级文件夹名,结合图层编号和图片文件名,对应某一经纬度区域的图片。“行政”、“街道”和“卫星”3种类型的文件如图1、图2和图3所示。
根据谷歌地球文件的文件结构特点可以看出,随着图层编号的增加,其对应的文件越来越多,编号每加1其对应文件总量是上一编号文件总量的数倍。在进行完整的谷歌地球文件移植时,如果直接进行文件拷贝,拷贝大编号图层对应的文件夹时需要耗费大量时间。当然,可以将全部文件进行压缩成为一个单独的压缩文件,从而极大地减少文件拷贝时间。但是,进行文件解压同样需要耗费大量的时间。
为了更加方便、快捷地移植谷歌地球文件,需要将其进行转化,以提高移植效率。这里采用的转化手段为将所有的图片文件存储在oracle数据库中,形成独立的数据文件,通过传输表空间的方式在不同平台下的oracle数据库之间实现快速移植。谷歌地球文件转化的具体步骤如下:
(1) 根据谷歌地球文件层级结构的特点,在oracle数据库中按照层级建立不同的数据库用户并赋予相应权限,创建不同的表空间以及不同的数据文件,使得用户、表空间和数据文件之间形成一一对应的逻辑关系和实体关系[2]。例如,为图层编号为6的谷歌地球文件设计数据库用户、表空间和数据文件的文本如下:
—创建用户
Create user MAP_USER_6 identified by MAP_PW_6;
—赋予权限
Grant dba to MAP_USER_6;
—创建表空间以及对应的数据文件
Create bigfile tablespace TBS_GEMAPS_6 datafile ‘e:app AdministratororadataSEDBSYS_MAP_6.DBF’ size 1g auto extend on maxsize unlimited;
—建立用户、表空间和数据文件的一一对应
Alter user MAP_USER_6 default tablespace TBS_GEMAPS_6;
(2) 为每一层级对应的数据库用户建立相同的数据库表格,用来存储该层级的谷歌地球文件。例如,为图层编号为6的谷歌地球文件设计数据库表格文本如下:
Create table MAP_USER_6.T_GOOGLE_EARTH_MAPS(
MAP_TYPE int,—图层类型
LAYER_NO int,—图层编号
FILE_NO int,—文件夹序号
FILE_NAME varchar2(20),—文件名
MAP_DATA blob —文件数据
);
(3) 按照图层编号分别将其中3种图层类型的图片文件插入相应的数据库表格中。这样,不同图层编号的谷歌地球文件被转化为oracle数据库中不同用户所对应表空间指定的数据文件中,即每一图层编号的谷歌地球文件都被转化为一个对应的oracle数据文件。
在谷歌地球文件转化为oracle数据文件之后,谷歌地球文件的移植就可以以传输表空间的方式在oracle数据库之间进行。以图层编号为6所对应的oracle数据文件进行传输表空间为例,其具体步骤如下:
第1步,确定oracle数据文件所在源平台的Endian格式 (即字节存储次序),作为跨平台移植时是否需要进行数据文件转换的参考值;
—获取Endian格式
select d.platform_name, endian_format from v$database d, v$transportable_platform tp where tp.platform_name = d. platform_name;
第2步,确保存储谷歌地球文件的表空间为自包含并且为只读状态;
—检查自包含
exec sys.dbms_tts.transport_set_check(‘MAP_USER_6’,TRUE);
select * from sys.transport_set_violations;
—设置只读模式
Alter tablespace TBS_GEMAPS_6 read only;
第3步,用数据泵导出工具exp导出元数据;
—导出元数据
exp‘sys/oracle as sysdba’ transport_tablespace = y tablespaces =TBS_GEMAPS_6 file=E: METADATA META_6.DMP
第4步,判断目标平台的Endian格式,如果和源平台一致则跳过,否则对数据文件进行转换以匹配Endian格式;
第5步,拷贝oracle数据文件到目标系统的相应存储目录中;
第6步,使用数据泵导入工具imp导入元数据,完成oracle表空间的移植。
—导入元数据
imp‘sys/oracle as sysdba’ transport_tablespace = y tablespaces =TBS_GEMAPS_6 file=E: METADATA META6.DMP datafiles =e:appAdministratororadataSE4DBSYS_MAP_6.DBF
经过对移植目标数据库进行数据查询可以检验数据移植的完整性[3]。谷歌地图文件转化成oracle数据文件的过程,就是通过遍历谷歌地图文件夹中的每一个文件,将其作为一条表数据插入数据库表格中,直至完成全部文件的入库。数据库表格字段的设计对应着谷歌地图文件在整个文件夹中的层级目录[4]。因此,这种转化方法有效地保留了谷歌地图文件的物理结构和逻辑结构。下面对这种转化方法的优点与不足进行分析:
谷歌地球文件转化方法存在以下4大优点:
(1) 将大量分散存储的文件集成为少量集中存储的文件,降低了谷歌地球文件结构的复杂度;
(2) 极大地提高了文件移植的效率;
(3) 按照图层编号分别进行数据转化便于按照图层编号进行选择性的文件移植;
(4) 提高了文件的安全性。
同时,谷歌地球文件转化方法还存在以下4大不足:
(1) 文件转化过程耗费大量时间;
(2) 转化后的oracle数据文件大小比原文件更大;
(3) 转化后的数据文件移植方法复杂度高,并且需要依赖oracle数据库软件平台;
(4) 读取单一图片文件信息时需经过网络从数据文件中查询,降低了文件读取效率。
在进行数据文件转化时,为了节省数据转化的时间,采用并行入库的方法,即将整个谷歌地图文件夹拆分为多个不同的文件夹,分别运行不同的文件入库程序进行文件入库。其具体方法如下:根据图层编号统计文件夹中文件总量,按照图层编号从小到大的顺序进行文件入库,在入库过程中依据入库文件数量以及入库耗费时间来判断是否将谷歌地图文件夹拆分为多个不同的文件夹进行并行入库。例如,先统计遍历图层编号为6的文件夹中的文件总量(假设为x),然后使用单独的文件入库程序进行入库并统计入库所耗费的总时间(假设为t),接着统计图层编号为7的文件夹中的文件总量(假设为y),按照y与x的比值估算使用单独的文件入库程序进行入库所耗费的总时间(假设为T),如果T值比较大,则将图层编号为7的文件夹进行文件拆分,在同一台计算机上运行多个文件入库程序或者在多台计算机上运行单个文件入库程序,甚至在多台计算机上分别运行多个文件入库程序,实现并行入库。
在创建谷歌地图文件所对应的oracle数据文件时,图层编号小的文件夹中文件数量小,将其对应数据文件的初始大小设为最小值,并且以最小的空间值自动扩展,从而最大程度上避免存储空间的浪费。图层编号大的文件夹中文件数量大,以最小的空间值自动扩展即可。
在进行数据文件移植时,可以将全部移植步骤集成为单独的批处理文件,通过直接运行批处理文件的方式简化操作。因为数据文件转化是按照图层编号分别进行的,所以可以将全部图层编号对应的元数据和数据文件进行裁剪,然后集成为单独的批处理文件实现一键移植的功能。一键移植工具软件设计如图4所示。
从谷歌地图文件中读取单一图片文件时,只需要获取该图片文件的完整路径后直接从存储介质中将文件读取到内存中,而从转化后的数据文件中读取单一图片文件,是通过网络从数据库表格中查找对应的表格记录后,读取相应数据文件中的数据后再通过网络回传。因此,从数据文件中读取单一图片文件的效率比从谷歌地图文件中读取的效率低得多。
从谷歌地图文件中可以清晰地获取文件层级结构中层级之间的对应关系,比如获取图层编号下存在的全部文件夹号,而从数据文件中获取层级之间的对应关系则需要通过统计数据表中全部相关字段之后才能获取。
为了提高谷歌地图数据文件的应用性能,一方面要提高读取单一图片文件的效率,另一方面要为文件层级结构建立相应的数据映射。
在进行单一图片文件的读取时,为了避免以遍历整个数据表的方式进行查询,可以在数据表上建立位图索引,从而大大地提高文件读取效率。例如,为图层编号为6的谷歌地球文件数据表建立位图索引如下:
—创建位图索引
Create bitmap index MAP_USER_6.idx_bmp6 on MAP_USER_6. T_GOOGLE_EARTH_MAPS(MAP_TYPE,LAYER_NO,LAYER_NO,FILE_NO,FILE_NAME);
在oracle数据库中,还可以根据图层类型为谷歌地图文件对应的数据表格建立3个不同视图,以进一步提升单一图片文件的读取效率。同样以图层编号为6的谷歌地球文件数据表为例,建立视图如下:
—创建行政视图
Create or replace view MAP_USER_6.v_google_earth_xz as select LAYER_NO, LAYER_NO, FILE_NO, FILE_NAME from MAP_USER_6.t_google_earth_maps where map_type =1;
—创建街道视图
Create or replace view MAP_USER_6.v_google_earth_jd as select LAYER_NO, LAYER_NO, FILE_NO, FILE_NAME from MAP_USER_6.t_google_earth_maps where map_type =2;
—创建卫星视图
Create or replace view MAP_USER_6.v_google_earth_wx as select LAYER_NO, LAYER_NO, FILE_NO, FILE_NAME from MAP_USER_6.t_google_earth_maps where map_type =3;
类似地,可以在oracle数据库中创建视图用来描述文件层级结构中层级之间的对应关系,例如:
—创建根目录与图层类型之间的对应关系
Create view MAP_USER_6.v_root_lt as select distinct map_type from MAP_USER_6. t_google_earth_maps;
—创建图层类型与图层编号之间的对应关系
Create view MAP_USER_6.v_lt_ln as select map_type,layer_no from MAP_USER_6. t_google_earth_maps group by map_type, layer_no order by layer_no;
—创建图层编号与文件夹序号之间的对应关系
Create view MAP_USER_6.v_ln_fn as select layer_no,file_no from MAP_USER_6. t_google_earth_maps group by layer_no, file_no order by file_no;
综上所述,通过创建位图索引和相关视图的方式可以使谷歌地图文件在转化成oracle数据文件后能提供的应用性能得到最大程度上的优化。转化后的oracle数据文件根植于数据库软件平台中,根据应用需求的不同能更加方便地利用数据库软件提供的工具采用不同的性能优化方案。
本文所介绍的将谷歌地图文件转化为oracle数据文件并为转化后的数据文件提供移植以及应用性能优化的方法,成功地实现了谷歌地球文件的oracle数据文件化应用,即在尽量减小数据转化造成的文件读取效率降低影响的同时,有效地提高了文件的移植和应用的效率。通过实际应用,该方法的有效性得到了充分的验证。