章 碧,邢 朦,王任中
(中國船舶重工集團公司第七二四研究所,南京 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數據文件化應用,即在盡量減小數據轉化造成的文件讀取效率降低影響的同時,有效地提高了文件的移植和應用的效率。通過實際應用,該方法的有效性得到了充分的驗證。