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