刁明光, 趙元元, 趙丹寧, 劉 芳, 王彥佐
(1.中國地質大學(北京)信息工程學院,北京 100083;2.中國自然資源航空物探遙感中心,北京 100083)
遙感地質調查技術涉及區域地質遙感調查、基礎地質環境遙感調查、地質災害遙感調查、礦產資源遙感調查、礦山開發狀況遙感監測和礦山環境遙感動態監測等諸多領域[1]。長期以來,國土資源部門在礦山地質環境監測過程中,廣泛采用遙感技術[2],獲得了大量礦山遙感監測數據,并依據相關技術標準,對這些數據進行整理編制,將最終提交的成果數據按照規范進行入庫。
由于報表是對相關數據統計匯總的重要手段,因此管理部門多以報表的形式使用礦山遙感監測成果數據。在提交入庫成果數據時,相關技術人員通常采用人工方式編制報表,在整理分析報表的基礎上,對報告中指標數據變化、數據間關系等諸多方面進行逐一核查。在編制報表過程中,技術人員常用ArcMap等GIS(geographic information system)工具對礦山遙感監測成果數據進行數據解譯等處理工作,然后把從矢量圖層中獲取的屬性數據錄入到Excel中,進行手動計算和格式調整,進而對礦山遙感監測成果數據進行分析、整理及存檔。在上述報表編制過程中,主要存在以下問題。
(1)圖層屬性數據關聯性強,導致報表數據計算量大,規則復雜。礦山遙感監測成果數據種類多,涉及的計算過程煩瑣,工作重復性強,數據整理成本高。數據處理過程中,矢量圖層間的交叉導致不同報表間的屬性數據產生相應的關聯關系,手動填充報表的工作方式效率低,且極易出錯。
(2)入庫成果數據需求變化頻繁,導致報表類型多樣,重復率高。依據礦山遙感監測工作流程,參照成果數據入庫技術要求[3],制定模板,完成報表制作。由于成果數據入庫技術要求變更頻繁,從而導致了報表模板需求不斷變化,引起報表類型的根本性變化,工作重復率高。
(3)統計計算依賴于第三方軟件導致報表維護困難,獨立性差。技術人員采用手動編制報表的方式,將要提交入庫的成果數據手動填充至報表模板中,這種工作模式要求技術人員在本地預先安裝Excel軟件,報表統計所依賴的第三方軟件的升級、更新都會對報表數據的準確性和可維護性造成影響。
為此,分析礦山遙感監測成果數據報表源數據特點,規范報表生成工作流程,研究并驗證具有自動化、可視化、高效便捷特點的礦山遙感監測成果數據報表生成方法具有重要意義。
礦產資源遙感監測成果數據報表源數據,是基于礦山遙感監測成果數據中矢量圖層中與空間數據相對應的屬性數據。在生成報表過程中,相關部門參照《地質信息元數據標準》(DD 2006—05)[4],根據數據質量信息、元數據信息、空間參照信息等約束,對成果數據入庫技術要求進行規范,然后根據入庫技術要求將涉及的矢量圖層中對應的屬性數據[5]進行統計并填充到對應的報表中,報表源數據完整性對報表的精確性和可靠性有著重要的影響。
實施數據完整性約束,可以避免形成不符合入庫技術要求的數據,防止出現因錯誤的輸入或輸出而導致的無效操作和錯誤信息。礦山遙感監測報表源數據來源于通過矢量圖層獲取的屬性數據,是描述空間對象特征的數據,這些屬性數據類型眾多、組織結構復雜、存在著屬性完整性約束;同時,這些屬性數據來自于不同的矢量圖層,存在著參照完整性約束。這兩類完整性約束是提高報表統計的精確性和可靠性并保證報表質量的重要手段。
1.1.1 屬性完整性約束
報表源數據類型的多樣性決定了其規范描述的復雜性。屬性完整性是指表中屬性字段的完整性。例如,數據類型、格式、值域范圍、是否允許空值等,屬性完整性約束保證在數據表中相應列輸入數據的有效性。
在編制入庫成果數據時,報表數據間存在著關聯性、唯一性、非空性、格式固定性等特殊的技術要求,從而使其數據規范描述變得復雜[6]。針對數據字段的精度、約束與條件、值域三方面,該規范明確定義了報表源數據屬性字段的約束集合。其中,數據精度規范主要包括度量單位、數據精度、數據格式等;字段約束與條件規范主要包括必選、可選、條件必選3種方式;字段值域規范主要包括屬性字段的取值范圍。
如表1所示,入庫技術要求針對報表源數據No1~No5的精度、約束與條件、值域等三方面進行了明確規范。這些描述方法的要求不盡相同,相互制約,使各字段符合屬性完整性約束。結合XSD(XML schema definition)典型機制,圖1以No 1為例,詳細描述基于的屬性約束描述方法[7]。該約束保證了報表生成過程的完整性,提高了報表統計的精確性。

表1 屬性完整性約束示例

圖1 No 1精度屬性完整性描述方法
1.1.2 參照完整性約束
在報表生成過程中,涉及的矢量圖層種類多、數據量大,且各矢量圖層間具有一定的屬性關聯。參照完整性約束的目的是保證多張報表間屬性數據的一致性,確保圖層間的關聯邏輯符合規范。
按照最新成果數據入庫技術要求,礦山遙感監測成果數據類型分為矢量類型、影像類型、野外驗證、元數據文件、統計報表文件、文檔類型6種。其中,矢量類型數據為生成統計報表文件的報表源數據提供了重要基礎。如圖2所示,報表源數據是基于矢量類型數據中的屬性數據。其中,報表中大部分數據通過直接讀取矢量圖層對應的屬性數據獲得,少部分數據是獲取源數據后經基本運算所得。
由圖2可知,生成報表需要的屬性數據分別從對應的矢量圖層中獲取,每張報表統計的數據量由一個或多個矢量圖層的屬性數據組成,統計數據時工作量大,數據間的關聯關系較為復雜。

圖2 參照完整性約束示意圖
以恢復治理報表為例,該報表統計的屬性數據需要從開發占地圖層、恢復治理圖層和塌陷區圖層中獲取。通過參照完整性約束,保證了表間數據關系的一致性,提高了報表統計的可靠性。
按照入庫技術要求,礦山遙感監測成果數據報表的生成包括獲取矢量圖層、讀取相關圖層屬性數據、計算屬性數據、生成報表四部分,具體工作流程如圖3所示。矢量圖層獲取是結合自動導入和手動添加工程項目的方式進行的,通過對矢量圖層的屬性表中的屬性數據的讀取,進而對相關源數據進行參數運算,然后將計算結果及其他不需參數計算的報表源數據按照指定的報表模板依次填寫到對應的報表中,完成多張報表的自動生成工作。

圖3 報表生成工作流程
在報表編制過程中,建立報表映射模型可以有效地解決重復性操作問題,報表映射模型中報表模板的確立依賴于入庫技術要求。因此,在建立報表映射模型時,需從入庫技術要求中提取相關信息,制定模板,搭建映射關系。
報表映射模型采用面向對象的設計思想,實現從報表模板到映射類的直接轉換,如圖4所示,該模型主要由模板類型、映射規則和映射類定義三部分構成,其中不同Excel報表模板通過一定映射規則直接轉換成對應的Report_KFZD_LYZK(礦山占地-利用狀況報表模板)、Report_HFZL(恢復治理報表模板)等映射類。礦山遙感監測成果數據報表模板類型的多樣性決定了映射類的復雜性,針對每張工作表,映射類的屬性和方法需要單獨設計。通過結構類型轉化和數據類型規范等映射規則,使模板類型與映射類保持緊密的關聯性和高度的一致性,從而完成整個工作簿的自動生成。

圖4 報表映射模型
依據工作要求,報表多以第三方軟件Excel格式呈現,第三方軟件的升級會降低報表生成的效率和兼容性。因此,在系統設計時應盡量降低與第三方軟件的耦合度。
目前,NET平臺下對Excel文件進行操作的常用方案包括OLEDB(object linking and embedding database)數據源、COM(component object model)組件和NPOI(net poor obfuscation implementation)組件庫[8-11]。其中,OLEDB數據源方式在讀取數據的過程中缺乏靈活性,對內存的消耗比較高;COM組件方式要求用戶本地安裝Office組件,系統環境依賴性較強;NPOI組件庫采用文件流方式對Excel文件進行讀寫操作,方式靈活,讀寫速度快,節省服務器資源,對第三方軟件的依賴性低。
結合礦山遙感監測成果數據報表源數據特點、數據呈現方式和報表生成工作流程,參照成果數據入庫技術要求,采用NPOI組件技術實現對數據的讀寫操作有如下優勢。
(1)數據讀寫速度快、穩定性好。采用面向接口的設計架構,根據該框架提供的接口,編寫讀取模板路徑、打開操作文件、數據填充計算等相關操作的功能函數,減小手動計算過程中的誤差,提高報表生成過程中數據的準確性。
(2)報表模板格式多、適應性好。組件庫中包含了大部分Excel的格式特性,可以對數據格式、公式等進行操作。提交數據類型的不斷變化,導致入庫技術要求的頻繁變更,進而影響報表模板的穩定性,采用該框架可以適應模板樣式的不斷迭代,降低工作重復率。
(3)第三方軟件耦合度低、獨立性好。為減少用戶在礦山遙感監測成果數據報表生成工作過程中對第三方軟件的依賴,自動生成的報表應滿足版本兼容性和獨立性。NPOI框架支持多種文件格式,如xls、xlxs、docx等。因此,NPOI既可以實現對Excel不同版本的兼容和相關獨立性,又增強了報表生成方法的可擴展性,減小了無第三方軟件或第三方軟件升級、更新帶來的影響。
結合礦山遙感監測成果數據入庫技術要求,以及報表源數據的完整性約束,采用基于NPOI組件庫設計礦山遙感監測成果數據報表自動生成方法,保證數據的準確性、增強模板的可擴展性、提高報表制作過程中系統的獨立性。
礦山遙感監測成果數據報表自動生成方法采用三層體系結構[12],基于AE(ArcGIS engine)的插件技術[13],結合NPOI組件技術進行設計,并根據數據特點建立報表映射模型,通過映射模型完成數據間的交流傳遞,實現按照入庫技術要求、依據既定模板、自動生成報表的功能。該方法避免傳統方式操作報表的問題,又提高數據導出操作的靈活性和通用性。
報表自動生成方法采用基于AE的插件技術,調用特定接口讀取矢量圖層,并獲取圖層中的屬性數據。將數據按省、市、縣分別存到其對應的散列表(HashTable)中進行數據存儲,通過對NPOI組件調用,實現對Excel文件的讀寫操作,按照報表映射模型,將存儲在HashTable中的屬性數據寫入報表模板中從而實現生成報表,如圖5所示。

圖5 報表自動生成的整體架構
報表自動生成方法的整體框架由AE接口、NPOI組件接口、可視化組件及報表模型組件四部分構成。AE插件接口用來獲取來自矢量圖層的報表源數據;可視化組件利用樹控件的節點展示報表生成信息,隨時顯示報表生成進度,并將錯誤信息及時反饋;NPOI接口用來靈活實現與報表間的數據交流;報表模型組件作為數據存儲的中間件,其中模型與不同的報表模板對應,根據不同的報表模型定義不同的屬性,方便地實現數據之間的傳遞。
在報表模板結構的基礎上,在項目中添加NPOI應用,根據其提供的接口,編寫相關操作的功能函數。按照層次,報表模板包括的核心元素由上至下有:工作簿、工作表、行、單元格。與此相對應,NPOI通過Excel文件對象(HSSFWorkbook)、Excel表格對象(ISheet)、Excel行對象(IRow)、Excel單元格對象(ICell)這4個類分別來定義上述報表的核心要素,從而完成Excel文件的創建過程。通過對文件流(FileStream)等類的操作,將從矢量圖層獲取的屬性數據以HashTable的形式存入內存,通過對HashTable進行操作,將數據寫入報表中。具體的操作數據流程如圖6 所示。
基于事件驅動的異步機制。如果在報表生成操作完成前操作用戶界面,會在單線程上執行耗時操作,導致用戶界面停止響應。通過調用基于事件驅動的后臺線程組件(BackgroundWork),可以實現程序的異步操作。當主線程調用異步運行線程方法(RunWorkerAsny)時,則會觸發運行線程方法(DoWork),新建一個后臺線程,把耗時的操作放到后臺線程中執行,從而實現多線程操作。同時,為了顯示后臺操作的執行進度,通過調用控制報表進度條方法(ReportProgress)傳遞操作進度值,以實現與報表生成界面之間的交互操作。操作完成后,觸發后臺線程完成事件(RunWorkerCompleted),將后臺操作的完成結果反饋給用戶。基于事件驅動的異步機制的操作原理如圖7所示。

圖6 基于NPOI的數據讀取流程

圖7 基于事件驅動的異步機制
采用基于事件驅動的異步機制,避免因報表生成時間過長而導致的資源浪費,實時查看報表生成進度,報表生成過程中的基本信息得以實時反饋。
報表自動生成方法主要實現三大功能:報表生成、查看報表、導出日志。報表生成是主要功能,負責多張報表的自動生成;查看報表是報表生成成功后,按照指定目錄打開已經生成的Excel文件進行查看;導出日志將程序執行的日志信息以文本形式輸出,便于追蹤記錄在報表生成過程中存在的問題。
4.3.1 報表生成
報表生成功能的使用過程如圖8所示。在礦山遙感監測成果編制系統[14]中,打開50萬的工程文件,手動導入本底5萬的矢量圖層,結合當前50萬項目中的矢量圖層,獲取生成報表中的屬性數據,按照報表模板自動填充計算,生成多張報表。軟件根據用戶實際導入的矢量圖層,在工作目錄下準備相應屬性數據,依據報表自動生成方法自動生成相應報表。報表生成過程中,在生成界面提示用戶生成成功的報表以及失敗的報表。生成成功的報表,如圖8中的礦山占地-礦種、廢棄礦山、恢復治理、復綠工程、地質災害數量、年恢復治理占地、采空沉陷、滑坡、崩塌、泥石流、污染、尾礦等12張報表,可直接進行查看;生成失敗的報表,如圖8中的礦山占地-利用狀況報表,可點擊折疊符號,瀏覽詳細的錯誤信息。

圖8 報表生成
4.3.2 查看報表
查看報表功能實現了報表批量生成成功后,在生成界面提示生成成功,同時指出明確的生成路徑。用戶可以到指定路徑的文件夾下查看,在該文件夾中會出現按照省份進行劃分的Excel文件,每個文件中包含13張規定命名的工作表。由報表生成功能自動生成的恢復治理報表如圖9所示。

圖9 查看報表
4.3.3 導出日志
導出日志功能是將軟件運行時的事件以文本形式記錄導出,同時顯示程序運行狀態,并以此為依據對程序執行過程中存在的問題進行追蹤。導出結果如圖10所示。

圖10 導出日志
在對礦山遙感監測報表源數據特點和報表生成工作流程詳細分析的基礎上,設計并實現了礦山遙感監測成果數據報表自動生成方法。
(1)將ArcGIS和Office兩大通用技術進行有機結合,實現了數據的有效交換。采用基于AE的插件式開發技術,對報表源數據進行了完整性約束,減少了重復性操作,保證了數據準確性和報表間的關聯性,解決了報表計算數據量大的問題。
(2)采用對象關系(object/relationship,O/R)映射技術,實現了矢量數據的面向對象操作。建立了報表映射模型,適應多類型、多變化的報表需求,降低了因報表模板變更而增加的工作成本,解決了報表需求類型多樣的問題。
(3)采用獨立于第三方的NPOI組件庫技術,實現了報表自動生成功能,大大地提高了軟件的獨立性。運用NPOI組件式技術降低了各模塊間的耦合度,減低了對第三方軟件的依賴性,解決了報表統計依賴性強的問題。
實踐證明,利用NPOI技術實現的報表自動生成方法具有簡易、高效、易于升級維護等特點。該方法解決了在報表生成工作中遇到的實際問題,提高了報表編制的工作效率,為解決生產實踐中數據批量生成問題提供了新的設計思路和技術支持。