章 碧,邢 朦,王任中
(中國(guó)船舶重工集團(tuán)公司第七二四研究所,南京 211153)
谷歌地球(Google Earth,GE)是一款谷歌公司開(kāi)發(fā)的虛擬地球軟件。它把衛(wèi)星照片、航空照相和GIS布置在一個(gè)地球的三維模型上[1]。與普通電子地圖不同的是,谷歌地球并非矢量地圖,而是由大量圖片文件組成?;诠雀璧厍蛭募M(jìn)行電子地圖的二次開(kāi)發(fā)的先決條件為谷歌地球文件的跨平臺(tái)移植,而在移植谷歌地球文件時(shí),不論是直接進(jìn)行文件拷貝還是先進(jìn)行文件壓縮再進(jìn)行文件解壓均需耗費(fèi)大量時(shí)間。因此,考慮將谷歌地圖文件轉(zhuǎn)化為oracle數(shù)據(jù)文件,并對(duì)數(shù)據(jù)文件中對(duì)應(yīng)的數(shù)據(jù)表進(jìn)行優(yōu)化,一方面提高了谷歌地球文件的平臺(tái)移植效率,另一方面能快速讀取任一谷歌地球文件。
谷歌地球文件由大量的可移植網(wǎng)絡(luò)圖形格式文件(即PNG文件)和聯(lián)合圖像專家組格式文件(即JPG文件)按照?qǐng)D層類型、圖層編號(hào)和文件夾序號(hào)分別存放后組合而成,其文件結(jié)構(gòu)如下:第1層為根目錄,第2層為圖層類型,第3層為圖層編號(hào),第4層為文件夾序號(hào),第5層則為各個(gè)編號(hào)的圖片文件。圖層類型分為“行政”、“街道”和“衛(wèi)星”3種。圖層編號(hào)從0(包含0)開(kāi)始累加,編號(hào)越小包含的圖片對(duì)應(yīng)的地圖比例尺越大,圖片數(shù)量越少;反之,編號(hào)越大包含的圖片對(duì)應(yīng)的地圖比例尺越小,圖片數(shù)量越大。文件夾序號(hào)作為圖層編號(hào)的下一級(jí)文件夾名,結(jié)合圖層編號(hào)和圖片文件名,對(duì)應(yīng)某一經(jīng)緯度區(qū)域的圖片?!靶姓?、“街道”和“衛(wèi)星”3種類型的文件如圖1、圖2和圖3所示。
根據(jù)谷歌地球文件的文件結(jié)構(gòu)特點(diǎn)可以看出,隨著圖層編號(hào)的增加,其對(duì)應(yīng)的文件越來(lái)越多,編號(hào)每加1其對(duì)應(yīng)文件總量是上一編號(hào)文件總量的數(shù)倍。在進(jìn)行完整的谷歌地球文件移植時(shí),如果直接進(jìn)行文件拷貝,拷貝大編號(hào)圖層對(duì)應(yīng)的文件夾時(shí)需要耗費(fèi)大量時(shí)間。當(dāng)然,可以將全部文件進(jìn)行壓縮成為一個(gè)單獨(dú)的壓縮文件,從而極大地減少文件拷貝時(shí)間。但是,進(jìn)行文件解壓同樣需要耗費(fèi)大量的時(shí)間。
為了更加方便、快捷地移植谷歌地球文件,需要將其進(jìn)行轉(zhuǎn)化,以提高移植效率。這里采用的轉(zhuǎn)化手段為將所有的圖片文件存儲(chǔ)在oracle數(shù)據(jù)庫(kù)中,形成獨(dú)立的數(shù)據(jù)文件,通過(guò)傳輸表空間的方式在不同平臺(tái)下的oracle數(shù)據(jù)庫(kù)之間實(shí)現(xiàn)快速移植。谷歌地球文件轉(zhuǎn)化的具體步驟如下:
(1) 根據(jù)谷歌地球文件層級(jí)結(jié)構(gòu)的特點(diǎn),在oracle數(shù)據(jù)庫(kù)中按照層級(jí)建立不同的數(shù)據(jù)庫(kù)用戶并賦予相應(yīng)權(quán)限,創(chuàng)建不同的表空間以及不同的數(shù)據(jù)文件,使得用戶、表空間和數(shù)據(jù)文件之間形成一一對(duì)應(yīng)的邏輯關(guān)系和實(shí)體關(guān)系[2]。例如,為圖層編號(hào)為6的谷歌地球文件設(shè)計(jì)數(shù)據(jù)庫(kù)用戶、表空間和數(shù)據(jù)文件的文本如下:
—?jiǎng)?chuàng)建用戶
Create user MAP_USER_6 identified by MAP_PW_6;
—賦予權(quán)限
Grant dba to MAP_USER_6;
—?jiǎng)?chuàng)建表空間以及對(duì)應(yīng)的數(shù)據(jù)文件
Create bigfile tablespace TBS_GEMAPS_6 datafile ‘e:app AdministratororadataSEDBSYS_MAP_6.DBF’ size 1g auto extend on maxsize unlimited;
—建立用戶、表空間和數(shù)據(jù)文件的一一對(duì)應(yīng)
Alter user MAP_USER_6 default tablespace TBS_GEMAPS_6;
(2) 為每一層級(jí)對(duì)應(yīng)的數(shù)據(jù)庫(kù)用戶建立相同的數(shù)據(jù)庫(kù)表格,用來(lái)存儲(chǔ)該層級(jí)的谷歌地球文件。例如,為圖層編號(hào)為6的谷歌地球文件設(shè)計(jì)數(shù)據(jù)庫(kù)表格文本如下:
Create table MAP_USER_6.T_GOOGLE_EARTH_MAPS(
MAP_TYPE int,—圖層類型
LAYER_NO int,—圖層編號(hào)
FILE_NO int,—文件夾序號(hào)
FILE_NAME varchar2(20),—文件名
MAP_DATA blob —文件數(shù)據(jù)
);
(3) 按照?qǐng)D層編號(hào)分別將其中3種圖層類型的圖片文件插入相應(yīng)的數(shù)據(jù)庫(kù)表格中。這樣,不同圖層編號(hào)的谷歌地球文件被轉(zhuǎn)化為oracle數(shù)據(jù)庫(kù)中不同用戶所對(duì)應(yīng)表空間指定的數(shù)據(jù)文件中,即每一圖層編號(hào)的谷歌地球文件都被轉(zhuǎn)化為一個(gè)對(duì)應(yīng)的oracle數(shù)據(jù)文件。
在谷歌地球文件轉(zhuǎn)化為oracle數(shù)據(jù)文件之后,谷歌地球文件的移植就可以以傳輸表空間的方式在oracle數(shù)據(jù)庫(kù)之間進(jìn)行。以圖層編號(hào)為6所對(duì)應(yīng)的oracle數(shù)據(jù)文件進(jìn)行傳輸表空間為例,其具體步驟如下:
第1步,確定oracle數(shù)據(jù)文件所在源平臺(tái)的Endian格式 (即字節(jié)存儲(chǔ)次序),作為跨平臺(tái)移植時(shí)是否需要進(jìn)行數(shù)據(jù)文件轉(zhuǎn)換的參考值;
—獲取Endian格式
select d.platform_name, endian_format from v$database d, v$transportable_platform tp where tp.platform_name = d. platform_name;
第2步,確保存儲(chǔ)谷歌地球文件的表空間為自包含并且為只讀狀態(tài);
—檢查自包含
exec sys.dbms_tts.transport_set_check(‘MAP_USER_6’,TRUE);
select * from sys.transport_set_violations;
—設(shè)置只讀模式
Alter tablespace TBS_GEMAPS_6 read only;
第3步,用數(shù)據(jù)泵導(dǎo)出工具exp導(dǎo)出元數(shù)據(jù);
—導(dǎo)出元數(shù)據(jù)
exp‘sys/oracle as sysdba’ transport_tablespace = y tablespaces =TBS_GEMAPS_6 file=E: METADATA META_6.DMP
第4步,判斷目標(biāo)平臺(tái)的Endian格式,如果和源平臺(tái)一致則跳過(guò),否則對(duì)數(shù)據(jù)文件進(jìn)行轉(zhuǎn)換以匹配Endian格式;
第5步,拷貝oracle數(shù)據(jù)文件到目標(biāo)系統(tǒng)的相應(yīng)存儲(chǔ)目錄中;
第6步,使用數(shù)據(jù)泵導(dǎo)入工具imp導(dǎo)入元數(shù)據(jù),完成oracle表空間的移植。
—導(dǎo)入元數(shù)據(jù)
imp‘sys/oracle as sysdba’ transport_tablespace = y tablespaces =TBS_GEMAPS_6 file=E: METADATA META6.DMP datafiles =e:appAdministratororadataSE4DBSYS_MAP_6.DBF
經(jīng)過(guò)對(duì)移植目標(biāo)數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)查詢可以檢驗(yàn)數(shù)據(jù)移植的完整性[3]。谷歌地圖文件轉(zhuǎn)化成oracle數(shù)據(jù)文件的過(guò)程,就是通過(guò)遍歷谷歌地圖文件夾中的每一個(gè)文件,將其作為一條表數(shù)據(jù)插入數(shù)據(jù)庫(kù)表格中,直至完成全部文件的入庫(kù)。數(shù)據(jù)庫(kù)表格字段的設(shè)計(jì)對(duì)應(yīng)著谷歌地圖文件在整個(gè)文件夾中的層級(jí)目錄[4]。因此,這種轉(zhuǎn)化方法有效地保留了谷歌地圖文件的物理結(jié)構(gòu)和邏輯結(jié)構(gòu)。下面對(duì)這種轉(zhuǎn)化方法的優(yōu)點(diǎn)與不足進(jìn)行分析:
谷歌地球文件轉(zhuǎn)化方法存在以下4大優(yōu)點(diǎn):
(1) 將大量分散存儲(chǔ)的文件集成為少量集中存儲(chǔ)的文件,降低了谷歌地球文件結(jié)構(gòu)的復(fù)雜度;
(2) 極大地提高了文件移植的效率;
(3) 按照?qǐng)D層編號(hào)分別進(jìn)行數(shù)據(jù)轉(zhuǎn)化便于按照?qǐng)D層編號(hào)進(jìn)行選擇性的文件移植;
(4) 提高了文件的安全性。
同時(shí),谷歌地球文件轉(zhuǎn)化方法還存在以下4大不足:
(1) 文件轉(zhuǎn)化過(guò)程耗費(fèi)大量時(shí)間;
(2) 轉(zhuǎn)化后的oracle數(shù)據(jù)文件大小比原文件更大;
(3) 轉(zhuǎn)化后的數(shù)據(jù)文件移植方法復(fù)雜度高,并且需要依賴oracle數(shù)據(jù)庫(kù)軟件平臺(tái);
(4) 讀取單一圖片文件信息時(shí)需經(jīng)過(guò)網(wǎng)絡(luò)從數(shù)據(jù)文件中查詢,降低了文件讀取效率。
在進(jìn)行數(shù)據(jù)文件轉(zhuǎn)化時(shí),為了節(jié)省數(shù)據(jù)轉(zhuǎn)化的時(shí)間,采用并行入庫(kù)的方法,即將整個(gè)谷歌地圖文件夾拆分為多個(gè)不同的文件夾,分別運(yùn)行不同的文件入庫(kù)程序進(jìn)行文件入庫(kù)。其具體方法如下:根據(jù)圖層編號(hào)統(tǒng)計(jì)文件夾中文件總量,按照?qǐng)D層編號(hào)從小到大的順序進(jìn)行文件入庫(kù),在入庫(kù)過(guò)程中依據(jù)入庫(kù)文件數(shù)量以及入庫(kù)耗費(fèi)時(shí)間來(lái)判斷是否將谷歌地圖文件夾拆分為多個(gè)不同的文件夾進(jìn)行并行入庫(kù)。例如,先統(tǒng)計(jì)遍歷圖層編號(hào)為6的文件夾中的文件總量(假設(shè)為x),然后使用單獨(dú)的文件入庫(kù)程序進(jìn)行入庫(kù)并統(tǒng)計(jì)入庫(kù)所耗費(fèi)的總時(shí)間(假設(shè)為t),接著統(tǒng)計(jì)圖層編號(hào)為7的文件夾中的文件總量(假設(shè)為y),按照y與x的比值估算使用單獨(dú)的文件入庫(kù)程序進(jìn)行入庫(kù)所耗費(fèi)的總時(shí)間(假設(shè)為T(mén)),如果T值比較大,則將圖層編號(hào)為7的文件夾進(jìn)行文件拆分,在同一臺(tái)計(jì)算機(jī)上運(yùn)行多個(gè)文件入庫(kù)程序或者在多臺(tái)計(jì)算機(jī)上運(yùn)行單個(gè)文件入庫(kù)程序,甚至在多臺(tái)計(jì)算機(jī)上分別運(yùn)行多個(gè)文件入庫(kù)程序,實(shí)現(xiàn)并行入庫(kù)。
在創(chuàng)建谷歌地圖文件所對(duì)應(yīng)的oracle數(shù)據(jù)文件時(shí),圖層編號(hào)小的文件夾中文件數(shù)量小,將其對(duì)應(yīng)數(shù)據(jù)文件的初始大小設(shè)為最小值,并且以最小的空間值自動(dòng)擴(kuò)展,從而最大程度上避免存儲(chǔ)空間的浪費(fèi)。圖層編號(hào)大的文件夾中文件數(shù)量大,以最小的空間值自動(dòng)擴(kuò)展即可。
在進(jìn)行數(shù)據(jù)文件移植時(shí),可以將全部移植步驟集成為單獨(dú)的批處理文件,通過(guò)直接運(yùn)行批處理文件的方式簡(jiǎn)化操作。因?yàn)閿?shù)據(jù)文件轉(zhuǎn)化是按照?qǐng)D層編號(hào)分別進(jìn)行的,所以可以將全部圖層編號(hào)對(duì)應(yīng)的元數(shù)據(jù)和數(shù)據(jù)文件進(jìn)行裁剪,然后集成為單獨(dú)的批處理文件實(shí)現(xiàn)一鍵移植的功能。一鍵移植工具軟件設(shè)計(jì)如圖4所示。
從谷歌地圖文件中讀取單一圖片文件時(shí),只需要獲取該圖片文件的完整路徑后直接從存儲(chǔ)介質(zhì)中將文件讀取到內(nèi)存中,而從轉(zhuǎn)化后的數(shù)據(jù)文件中讀取單一圖片文件,是通過(guò)網(wǎng)絡(luò)從數(shù)據(jù)庫(kù)表格中查找對(duì)應(yīng)的表格記錄后,讀取相應(yīng)數(shù)據(jù)文件中的數(shù)據(jù)后再通過(guò)網(wǎng)絡(luò)回傳。因此,從數(shù)據(jù)文件中讀取單一圖片文件的效率比從谷歌地圖文件中讀取的效率低得多。
從谷歌地圖文件中可以清晰地獲取文件層級(jí)結(jié)構(gòu)中層級(jí)之間的對(duì)應(yīng)關(guān)系,比如獲取圖層編號(hào)下存在的全部文件夾號(hào),而從數(shù)據(jù)文件中獲取層級(jí)之間的對(duì)應(yīng)關(guān)系則需要通過(guò)統(tǒng)計(jì)數(shù)據(jù)表中全部相關(guān)字段之后才能獲取。
為了提高谷歌地圖數(shù)據(jù)文件的應(yīng)用性能,一方面要提高讀取單一圖片文件的效率,另一方面要為文件層級(jí)結(jié)構(gòu)建立相應(yīng)的數(shù)據(jù)映射。
在進(jìn)行單一圖片文件的讀取時(shí),為了避免以遍歷整個(gè)數(shù)據(jù)表的方式進(jìn)行查詢,可以在數(shù)據(jù)表上建立位圖索引,從而大大地提高文件讀取效率。例如,為圖層編號(hào)為6的谷歌地球文件數(shù)據(jù)表建立位圖索引如下:
—?jiǎng)?chuàng)建位圖索引
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數(shù)據(jù)庫(kù)中,還可以根據(jù)圖層類型為谷歌地圖文件對(duì)應(yīng)的數(shù)據(jù)表格建立3個(gè)不同視圖,以進(jìn)一步提升單一圖片文件的讀取效率。同樣以圖層編號(hào)為6的谷歌地球文件數(shù)據(jù)表為例,建立視圖如下:
—?jiǎng)?chuàng)建行政視圖
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;
—?jiǎng)?chuàng)建街道視圖
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;
—?jiǎng)?chuàng)建衛(wèi)星視圖
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數(shù)據(jù)庫(kù)中創(chuàng)建視圖用來(lái)描述文件層級(jí)結(jié)構(gòu)中層級(jí)之間的對(duì)應(yīng)關(guān)系,例如:
—?jiǎng)?chuàng)建根目錄與圖層類型之間的對(duì)應(yīng)關(guān)系
Create view MAP_USER_6.v_root_lt as select distinct map_type from MAP_USER_6. t_google_earth_maps;
—?jiǎng)?chuàng)建圖層類型與圖層編號(hào)之間的對(duì)應(yīng)關(guān)系
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;
—?jiǎng)?chuàng)建圖層編號(hào)與文件夾序號(hào)之間的對(duì)應(yīng)關(guān)系
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;
綜上所述,通過(guò)創(chuàng)建位圖索引和相關(guān)視圖的方式可以使谷歌地圖文件在轉(zhuǎn)化成oracle數(shù)據(jù)文件后能提供的應(yīng)用性能得到最大程度上的優(yōu)化。轉(zhuǎn)化后的oracle數(shù)據(jù)文件根植于數(shù)據(jù)庫(kù)軟件平臺(tái)中,根據(jù)應(yīng)用需求的不同能更加方便地利用數(shù)據(jù)庫(kù)軟件提供的工具采用不同的性能優(yōu)化方案。
本文所介紹的將谷歌地圖文件轉(zhuǎn)化為oracle數(shù)據(jù)文件并為轉(zhuǎn)化后的數(shù)據(jù)文件提供移植以及應(yīng)用性能優(yōu)化的方法,成功地實(shí)現(xiàn)了谷歌地球文件的oracle數(shù)據(jù)文件化應(yīng)用,即在盡量減小數(shù)據(jù)轉(zhuǎn)化造成的文件讀取效率降低影響的同時(shí),有效地提高了文件的移植和應(yīng)用的效率。通過(guò)實(shí)際應(yīng)用,該方法的有效性得到了充分的驗(yàn)證。