胥值禮, 黃 威, 劉俊杰, 李 飛
(中國地質科學院 地球物理地球化學勘查研究所,廊坊 065000)
航空物探包括航空磁力(航磁)、航空電磁(航電)、航空放射性(航放)、航空重力(航重)等測量方法,具有數據多樣化、數據量巨大、處理功能繁多等特點[1]。在實際生產應用中,經常將多種測量方法集成為航空物探綜合測量系統開展多參數綜合測量,因此,在數據分析處理中,如果沒有統一的數據存儲格式、數據顯示方式和數據處理功能集成接口,勢必造成軟件系統缺乏整體性,導致數據管理混亂,不利于數據對比分析,增加了數據處理難度,同時也導致了系統擴展性較差、應用軟件開發和維護成本昂貴等問題[2-4]。
依托中國地質科學院地球物理地球化學勘查研究所(物化探所)承擔的“固定翼時間域航空電磁測量技術系統研制(編號2017YFC0601900)”國家重點研發計劃項目,開展了時間域航電數據處理軟件系統研發。首先通過分析時間域航電的數據特點,提出平臺的功能和性能需求。航電測量系統在采集原始數據時,記錄的數據道有經度、緯度、雷達高度、氣壓高度、發射波形(Tx)、三個分量的接收波形(Rx、Ry、Rz)等,數據信息種類繁多。這些數據具有以下主要特點:①采樣率不同,發射波形和接收波形采用全波形記錄,其采樣率高達100 kHz;經度、緯度、雷達高度、氣壓高度采樣率為1 Hz;②數據類型不同,經度和緯度為雙精度浮點型;發射波形、接收分量波形、雷達高度、氣壓高度為單精度浮點型;③數據量巨大,1 h原始數據量約為5.5 GB,再加上處理過程中產生的各種結果數據,數據量將成倍數增長;④按測線存儲數據,測網一般為網狀分布,測線相互平行或近似平行,測線間的數據道個數和數據類型相同,而同一數據道的數據點數卻各異。
上述時間域航電數據特點在航空磁力、航空放射性和航空重力中也同樣存在。鑒于這些數據特點,并考慮軟件系統的可擴展性、易用性和可維護性,便于航電或其它航空物探方法技術研究工作的開展,設計開發了一套適用于航空物探應用軟件系統開發、具有大數據和多參數顯示和處理能力的通用軟件支撐平臺。
介紹了軟件平臺的主要需求、設計思路和關鍵技術,并給出了平臺在時間域航電數據處理軟件系統中的應用實例。
平臺主要包括數據管理、數據顯示、數據編輯、系統工具、系統設置、功能擴展接口等基本功能組,各個功能組中包含一個或多個功能。
以測量項目為單位對數據進行存儲管理,數據的存儲采用統一的數據庫模型。可在數據庫管理器中添加、刪除數據庫,并可打開數據庫,對數據進行界面顯示和編輯;可將外部數據導入到數據庫,也可將數據庫的數據導出為外部數據;可將多個數據庫的數據合并到一個數據庫。
采用多文檔顯示方式,即可以打開多個數據庫,每個數據庫對應一個顯示主視窗,每個主視窗具有一個列表顯示視窗和多個并行的圖形顯示視窗,且各個視窗具有獨立的顯示配置,并具有顯示再現功能。
1.2.1 列表顯示
顯示選擇:可選擇測線、數據道顯示;可選擇顯示主道,所有顯示數據道均按照主道采樣率數據顯示。
顯示格式:對一維數據道,按數據類型(浮點型、整型)以數值方式顯示在單元格,浮點型數據精確到小數點后八位。對二維數據道(如航電衰減曲線、航放全譜曲線)以曲線方式顯示在單元格。
1.2.2 圖形顯示
具有多個縱向排列的圖形顯示視窗,可以線/點方式顯示數據道剖面,便于圖形的對比顯示,且窗口縱向高度可任意調節;對任何一個圖形視窗,可在水平方向上放大、縮小、移動圖形,且其它圖形視窗的圖形亦同步變化;可顯示縱坐標網格線和縱坐標零線;可顯示指示橫坐標的光標線;具有圖―數、圖―圖聯動顯示功能,可在數據顯示列表中的數據道名稱上選擇顯示/隱藏線剖面或點剖面,并將該數據道的線/點剖面顯示到指定的圖形窗口中;可在顯示列表中的數據道名稱上設置圖形顯示顏色,并將數據道對應的剖面圖形按相同顏色顯示;在圖形視窗中可移動指示橫坐標的光標線,并同步指示數據列表的數據點位置;可在數據列表中選擇數據點,并同步指示圖形視窗的橫坐標光標線位置。
在顯示列表中,可對數據進行編輯。將二維數據道分解為一維數據道;選擇單元格進行數據復制;選擇單元格對其所在行的數據進行刪除;對測線進行裁剪;創建、刪除、復制數據道;修改數據道的屬性值(名稱、起始FID、采樣率等)。
為方便數據分析處理,提供數據道數學計算、坐標投影變換、數據道統計等基本工具。
數學計算器:具有對數據道的數據進行簡單數學運算功能。支持等于、加、減、乘、除、指數、開方、常用對數、自然對數運算,便于數據轉換分析。
坐標投影變換:可將WGS84經緯度坐標轉換為Beijing54直角坐標,或將Beijing54直角坐標轉換為WGS84經緯度坐標。
數據道統計:可計算統計數據道的數據點個數、最小值、最大值、平均值等。
可設置處理數據塊的最大數據個數、顯示數據塊的FID時長、默認顯示顏色等系統參數。
具有應用軟件功能(在平臺外部開發的功能)與平臺集成的通用接口。在不修改平臺程序的情況下,以插件方式對應用軟件系統進行功能定制,以加強軟件系統的功能。
操作系統:WINDOWS 7.0及以上操作系統;內存大小:8 GB以上;硬盤容量:256 GB以上。
開發平臺:Microsoft Visual Studio 2015;開發語言:C/C++語言。
如圖1所示,平臺支撐的應用軟件系統為四層結構模型:WINDOWS操作系統、GSS軟件支撐平臺、應用擴展功能(插件)、應用軟件系統[2]。
軟件支撐平臺:提供數據庫管理、數據庫訪問、數據顯示、系統工具、系統設置、應用擴展功能集成接口等基本功能(圖2),應用功能集成具有插件式集成統一接口。

圖1 應用軟件系統架構

圖2 支撐平臺的功能結構
應用擴展功能:為軟件支撐平臺外部定制開發的軟件功能(功能插件),可通過平臺提供的插件式集成接口集成到平臺上。
應用軟件系統:由軟件支撐平臺和集成到其上的應用擴展功能插件共同組成。
在平臺實現中,采用了數據庫、數據分段處理、虛擬列表顯示、雙緩沖圖形顯示、功能集成插件技術、算術表達式求值等多項關鍵技術。
采用數據庫、數據分段處理、虛擬列表顯示、雙緩沖圖形顯示關鍵技術,主要目的是解決巨大數據量的處理效率和內存限制問題。采用功能集成插件技術的主要目的是解決系統的擴展性問題。
3.1.1 數據庫模型

圖3 數據庫模型
根據航空物探數據特點,采用SQL關系型數據庫模型顯然不能滿足航空物探大數據的存儲要求,需要采用特定的數據模型[6]。本平臺的數據存取采用自主設計的數據庫(即數據集文件),一個數據庫實際上就是一個二進制數據文件,它除了可存儲數據本身外,還可存儲數據的索引等信息。
如圖3所示,數據庫模型按三個層次組織數據:文件、測線、數據道。
數據庫文件可以包含任意數量的測線,測線又可以包含任意數量的數據道。在每個層次上,均可以包含任意數量的自定義屬性,僅在數據道包含數據體(一維或二維數組)。
該數據模型無需自行設計頭信息結構、無需重新設計程序,具有較強的靈和性和良好的擴展性。
3.1.2 數據庫訪問
采用面向對象(Object Oriented)思想實現數據存取功能,測線和數據道均作為對象來處理。
測線和數據道對象由唯一的路徑來標識,各個路徑包含對象的名稱及其所屬對象的名稱(表1)。

表1 數據庫對象標識示例
在數據量巨大而計算機內存又不能滿足全部數據讀入的情況下,采用分段技術對數據進行顯示或計算處理。
采用FID(基點號)來實現分段處理。針對要顯示或計算處理的各個數據道,根據設置的起始FID和結束FID,分別計算各數據道在數據庫中的數據點起始索引和結束索引,然后從數據庫中讀取數據道FID段的數據并植入內存進行顯示或計算處理,計算處理完成后將結果寫入數據庫中相應位置。
通常情況下,時間域航電原始數據量很大,需要分段處理,而航磁、航放、航重數據量較小,不需要分段處理。如果計算機內存足夠并將FID段設置得足夠長,則可一次性顯示或計算處理數據道的全部數據,此時不需要將數據分段。
采用了數據道定制顯示和虛擬列表顯示技術。
3.3.1 數據道定制顯示
用戶可根據自己的需要在列表中靈和地顯示或隱藏數據道,而且可以設置某一數據道為采樣主道,其它顯示的數據道將自動與主道數據行匹配對齊(抽值或插值)。顯示時將數據從數據庫讀入內存,隱藏時將釋放數據內存。
3.3.2 虛擬列表顯示
通常情況下,使用列表組件需要向單元格中插入數據,之后就不必關心數據在哪里了,這是因為組件自己開辟了內存空間來保存這些數據。對于要顯示一個數據庫有幾十萬甚至上千萬條記錄的海量數據,勢必要消耗大量的內存,很可能內存會溢出而導致軟件崩潰。另外,如果用戶要滾動數據或定位某行數據,也會耗費漫長的時間,這是不能忍受的問題。因此,這種方法顯然不能滿足大數據的顯示要求。
采用虛擬列表顯示算法來解決上述問題。虛擬列表看起來和普通列表一樣,但不是通過向表格單元格直接插入數據來顯示,它僅僅知道應該顯示多少行數據,當顯示某個數據時,它向父窗口申請。例如一個列表中包含10 000 000行數據,第500到1 000 行是可見的,當列表重新繪制時,它首先請求父窗口給它第500行的數據,父窗口在收到請求后,把數據信息傳遞給列表,列表就可以用來顯示了,顯示第500行數據后,列表將繼續請求下一行數據,直至第1 000行為止。這樣不但可以占用極少的內存空間,還可以大大提高顯示效率,尤其在數據量巨大的情況下效果更為顯著。
采用了數據道剖面圖定制顯示和雙緩沖圖形顯示技術。
3.4.1 數據道剖面圖顯示
用戶可根據自己的需要在數據列表中選擇要顯示或隱藏剖面圖的數據道,平臺將自動將選擇數據道的剖面圖顯示在某一指定圖形窗口,或在某一指定圖形窗口隱藏該數據道圖形,實現剖面圖組合顯示功能。顯示時將數據置入內存,隱藏時將釋放內存。
3.4.2 雙緩沖圖形顯示
通常情況下,圖形窗口在刷新時,總要有一個擦除原來圖像的過程,它利用背景色填充窗體繪圖區,然后再調用新的繪圖代碼進行重繪,這樣一擦一寫就造成了圖像顏色的反差,當對大量數據的圖形進行頻繁重繪時,這種反差就越發明顯,將導致閃爍現象,圖形窗口因圖像殘留還會變成一團糟,且繪制效率十分低下[7]。
采用雙緩沖圖形顯示算法來解決上述問題。先在內存中繪制圖形,然后將繪制好的圖像復制到顯示界面,同時禁止背景刷新。這樣不但解決了圖像閃爍問題,而且提高了顯示效率。
插件技術的本質是在不修改平臺程序(主體程序)的情況下對軟件功能進行加強,任何人都可以通過公開的插件接口來制作自己需要的軟件功能以滿足不同的需求[8-9]。
本平臺的應用軟件功能集成接口采用動態鏈接庫(DLL)插件方式。平臺程序啟動時,可根據已加載菜單配置文件中的菜單名稱動態地創建菜單,并根據菜單名稱所對應的DLL庫文件名稱,使用WINDOWS操作系統提供的LoadLibrary函數自動加載DLL庫,并使用WINDOWS操作系統提供的GetProcAddress獲取相應功能函數的內存地址,平臺根據內存地址來調用插件接口完成所需功能。
功能插件DLL庫可使用C/C++、Fortran語言或其他語言(如MATLAB、LabVIEW等)開發,它們均具有統一的調用接口。
插件和平臺之間的通信采用數據庫對象句柄。平臺提供了一個數據庫訪問中間件,平臺向插件傳遞數據庫對象句柄,插件通過中間件利用該數據庫句柄對數據庫進行訪問。
利用軟件語言編譯器原理,設計常規數學計算器,用于對數據庫中數據道的數據進行數學計算,例如,將以電壓為量綱的雷達高度值轉換為以米為量綱的高度值、通過兩個數據道的數據相減來分析數據變化情況等。這不但可以減少功能程序模塊數量,還可以為數據處理分析提供簡便靈和的計算工具,而不是需要什么計算功能就開發集成什么功能。
利用數據結構中的棧來計算數學表達式的值[6]。其方法大致為:依次掃描中綴表達式(人們常用的算術表達式,如a=b*c+b*d),根據操作符的優先級來決定其入棧的順序,最后得到表達式的一個后綴表達式。利用后綴表達式(如abc*bd*+=)來求值(圖4)。
后綴表達式不包含括號,運算符放在兩個運算對象的后面,所有的計算按運算符出現的順序,嚴格從左向右進行求值(不再考慮運算符的優先規則)。運用后綴表達式進行計算的具體方法為:
建立一個棧S。從左到右讀表達式,如果讀到操作數就將它壓入棧S中,如果讀到n元運算符(即需要參數個數為n的運算符)則取出由棧頂向下的n項按操作數運算,再將運算的結果代替原棧頂的n項,壓入棧S中。如果后綴表達式未讀完,則重復上面過程,最后輸出棧頂的數值則為表達式的最終計算結果。

圖4 后綴表達式形成過程示意圖
利用本平臺研發集成了時間域航電數據處理軟件系統(圖5)。圖中菜單Preprocess為航電數據預處理軟件功能的插件菜單;圖左側為數據項目管理器,顯示了項目所包含的數據庫名稱;圖右上為從管理器打開的其中一個數據庫的數據列表顯示,顯示為數值的數據道為一維數據道,顯示為曲線的數據道為二維數據道;圖右下為列表顯示中的某些數據道的剖面圖形顯示(共有三個圖形顯示視窗,數據道剖面圖形顯示的視窗可指定);圖上部工具欄中的紅色上/下箭頭可切換顯示數據段。數據顯示列表中數據道名稱為斜體的數據道表示采樣主道,其它數據道根據主道的采樣率顯示數據;列表顯示的數據道可定制;數據道的剖面圖形顯示可定制;列表中藍色單元格和剖面圖形視窗中的垂直紅色線為聯動標志。
利用一個數據庫大小為34 GB(單個數據道最大數據量為2.1 GB)的時間域航電試驗數據,對平臺進行了功能和性能測試,測試結果表明該平臺達到了設計目標。
以國家重點研發計劃項目為依托,在分析時間域航電數據特點基礎上,并結合其他航空物探方法的數據特點,綜合考慮平臺的功能和性能需求,設計研發了擁有自主知識產權的航空物探軟件系統支撐平臺。
利用該平臺研發集成了時間域航電數據處理軟件系統,并進行了功能和性能測試。測試結果表明,平臺具有顯示和處理大數據和多樣數據的能力,其運行效率高、擴展性強、易用性好,達到了設計目標。
該平臺的建設為航空物探方法技術研究提供了一種高效快捷的有力工具,不但保證了軟件長久的生命周期,而且減少了軟件的開發成本,可作為開發航空物探或其他具有相似數據特點的應用軟件系統的通用支撐平臺。

圖5 時間域航電數據處理軟件系統