柯 丹, 韓紹陽, 喻 翔, 吳曲波, 李 希
(1.核工業(yè)北京地質(zhì)研究院,中核集團鈾資源勘查與評價技術(shù)重點實驗室,北京 100029;2.中國核科技信息與經(jīng)濟研究院,北京 100037;3.中國地質(zhì)大學(xué)(北京),北京 100083;)
區(qū)域物化探數(shù)據(jù)(重力、磁力、放射性和地球化學(xué)等)在斷裂構(gòu)造識別、盆地基底反演、巖體邊界圈定和巖性識別等區(qū)域地質(zhì)成礦環(huán)境分析與研究方面具有重要的作用[1]。GIS技術(shù)的快速發(fā)展,使傳統(tǒng)物化探數(shù)據(jù)處理軟件面臨著巨大挑戰(zhàn),即,要求軟件具有專業(yè)數(shù)據(jù)處理功能的同時,還要具有海量數(shù)據(jù)管理、坐標(biāo)系統(tǒng)變換以及標(biāo)準(zhǔn)的制圖輸出等功能。目前國外軟件廠商也已經(jīng)注意到這一點,在軟件開發(fā)上專為GIS應(yīng)用預(yù)留了接口或開發(fā)了專用的組件 (如Geosoft montaj oasis軟件提供的ArcGIS組件)。但國內(nèi)物化探數(shù)據(jù)軟件在這一方面目前還處于起步階段,因此所開發(fā)出的集基本GIS功能、常規(guī)物化探數(shù)據(jù)處理功能,以及非常規(guī)數(shù)據(jù)處理功能于一體的區(qū)域物化探數(shù)據(jù)處理軟件具有較強的實用性和前瞻性。
區(qū)域物化探數(shù)據(jù)軟件由基本GIS功能、常規(guī)數(shù)據(jù)處理功能和非常規(guī)數(shù)據(jù)處理功能三大功能模塊組成。各功能模塊共享同一區(qū)域物化探信息數(shù)據(jù)庫,軟件總體結(jié)構(gòu)如圖1所示。
基本GIS功能包括視圖管理、矢量數(shù)據(jù)的查詢和檢索、屬性數(shù)據(jù)管理、圖形操作、空間分析和制圖輸出等功能,能夠滿足區(qū)域物化探數(shù)據(jù)處理時對GIS功能的需求(圖2)。
常規(guī)數(shù)據(jù)處理功能包括數(shù)據(jù)預(yù)處理、重磁數(shù)據(jù)處理和放射性數(shù)據(jù)處理3個部分(圖3)。數(shù)據(jù)的預(yù)處理主要有空區(qū)補值及擴邊、滑動平均和正則化濾波等常用功能。重磁數(shù)據(jù)處理功能主要包括解析延拓、化磁極、方向?qū)?shù)和歐拉反褶積反演等常規(guī)處理功能。放射性數(shù)據(jù)處理主要包括鈾富集系數(shù)、變異系數(shù)、U2信息以及空間相關(guān)性分析等功能,為從放射性數(shù)據(jù)中提取出與鈾礦化相關(guān)的各種信息提供了技術(shù)手段。
非常規(guī)數(shù)據(jù)處理功能包括分形外插、弱信息提取、斷裂分維數(shù)測量和非線性重磁場分解等4個部分(圖4)。分形外插功能可以對重磁數(shù)據(jù)進行空間外插,從而使數(shù)據(jù)滿足頻率域中處理的要求,與傳統(tǒng)方法相比,可以很好地消除插值所引起的邊緣效應(yīng)。弱信息提取功能主要包括弱異常增強、自調(diào)節(jié)濾波和磁場二次差分等方法,可以對一些微弱重磁異常進行提取。斷裂分維數(shù)功能可以快速有效地對單區(qū)或多區(qū)容量維和信息維進行計算,從而可以定量反映斷裂構(gòu)造的復(fù)雜程度,為描述斷裂構(gòu)造的空間分布提供依據(jù)。非線性重磁分解功能主要包括分形奇異值分解、DCT域和FFT域內(nèi)和能譜-面積(SA)分形方法,它們均可以對重磁場進行區(qū)域場和局部場的有效分離。
基于Visual Studio 2005和ArcGIS Engine 9.2平臺進行軟件開發(fā)。
ArcGIS Engine是一個基于ArcObjects構(gòu)建的可編程的GIS工具包,可以提供常用的GIS功能。ArcGIS Engine主要由控件、工具和對象庫3部分組成。ArcGIS Engine提供了20多個對象庫,用戶可以根據(jù)自己的需要在程序中添加相應(yīng)的庫。利用工具和對象庫可以實現(xiàn)視圖的瀏覽和縮放、圖層的疊加顯示、圖形的編輯、文本標(biāo)注、空間分析和制圖輸出等基本GIS功能。
混合編程采用多種編程語言進行組合編程,相互調(diào)用,共享數(shù)據(jù)結(jié)構(gòu)和信息。它集各種語言的優(yōu)點于一身,從而避免了使用單獨一種語言的不足[2]??梢栽谳^短時間內(nèi)對現(xiàn)有的由不同語言編寫的程序代碼進行修改,形成新的應(yīng)用程序,縮短了開發(fā)周期、節(jié)約成本、提高效益。函數(shù)命名約定和參數(shù)傳遞方式是混合編程時需要注意的兩個方面。命名約定是為了解決不同語言對名稱標(biāo)識符(如變量名、參數(shù)名、過程名和函數(shù)名等)的不同處理,對目標(biāo)文件名的不同長度進行限制的約定。參數(shù)傳遞方式的一致性直接影響到程序調(diào)用的正確性,因此,發(fā)送參數(shù)的方式和接收參數(shù)的方式要完全一致。
混合編程的實現(xiàn)可以分為以下3個步驟:
(1)將由高級語言編寫的區(qū)域物化探數(shù)據(jù)處理方法的計算機程序改寫為動態(tài)鏈接庫,并在動態(tài)鏈接庫中設(shè)置相應(yīng)的處理函數(shù)接口,以供Visual C#語言調(diào)用。
(2)利用Visual C#完成程序界面、參數(shù)對話框和功能菜單的設(shè)計。
(3)將模塊中各個菜單項與相應(yīng)的數(shù)據(jù)處理方法相連接,通過單擊菜單項可以實現(xiàn)各種數(shù)據(jù)處理功能的調(diào)用。
在混合編程實現(xiàn)的過程中,動態(tài)鏈接庫的生成是關(guān)鍵之一。下面重點介紹VC++和Fortran動態(tài)鏈接庫的生成,以及Visual C#對Matlab的調(diào)用。
2.3.1 VC++庫文件的生成
以化磁極程序為例,說明VC++動態(tài)鏈接庫的生成,具體實現(xiàn)過程分為如下3個步驟:
(1)新建一個名稱為MagRTP的動態(tài)鏈接庫項目(MFC AppWizard(dll)), 并為項目添加一個成員函數(shù) (Add Member Function),函數(shù)類型為void,聲明為:
MagRTP (float D, float I, char FileIn [],char FileOut[])
其中變量D為磁偏角,I為磁傾角,F(xiàn)ileIn[]為輸入數(shù)據(jù)文件名,F(xiàn)ileOut[]為輸出數(shù)據(jù)文件名。
在項目的FileView一欄的Source Files中找到文件MagRTP.def,在EXPORTS的下面一行加入要輸出的函數(shù)名稱,即MagRTP。這樣就完成了動態(tài)鏈接庫項目的建立及導(dǎo)出函數(shù)的聲明。
(2) 在 MagRTP (float D, float I, char FileIn[], char FileOut[])函數(shù)中輸入實現(xiàn)化磁極的程序代碼(由于文章篇幅限制,此處程序代碼省略)。
(3)將輸出文件設(shè)置為發(fā)行版,即在Build菜單下選擇Set Active Project Configuration菜單項,將它的值設(shè)置為Win32 Release。然后對程序進行編譯、連接、執(zhí)行,在項目所在目錄的Release文件夾中可以找到編譯后的動態(tài)鏈接庫文件MagRTP.dll,庫中的導(dǎo)出函數(shù)為MagRTP。
2.3.2 Fortran庫文件的生成
以解析延拓程序為例,說明Fortran動態(tài)鏈接庫的生成,具體實現(xiàn)過程分為如下3個步驟:
(1)在Fortran PowerStation 4.0開發(fā)環(huán)境中創(chuàng)建一個類型為動態(tài)鏈接庫(Dynamic-Link Library)的項目(名稱為 Continuation), 將需要改寫的源文件Continuation.for加入該項目文件,并將源文件另存為Continuation.f 90,在項目中刪去文件Continuation.for,并導(dǎo)入文件Continuation.f 90。
(2)對文件Continuation.f 90進行改寫。改寫后的用于定義輸出參數(shù)的程序代碼如下:
程序代碼第一行中的 “DLLEXPORT::CONTINUATION”表示導(dǎo)出函數(shù)為“CONTINUATION”。在Avenue語言中,調(diào)用導(dǎo)出函數(shù) “CONTINUATION”時所用的具體名稱(大小寫),需要根據(jù)Fortran的調(diào)用約定來確定,默認(rèn)情況下導(dǎo)出函數(shù)名稱全部為大寫;當(dāng)調(diào)用約定為C或STDCALL時,導(dǎo)出函數(shù)名稱全部為小寫。為了調(diào)用方便,利用 “!MS $ ATTRIBUTES ALIAS:'Continuation'::CONTINUATION”語句,強制規(guī)定“CONTINUATION”函數(shù)被調(diào)用時的名稱為“Continuation”。 通過修飾符 VALUE和REFERENCE控制參數(shù)的傳遞類型,VALUE表示參數(shù)的傳遞方式是值傳遞;REFERENCE表示參數(shù)的傳遞方式是地址傳遞,F(xiàn)ortran PowerStation中默認(rèn)的參數(shù)傳遞方式是地址傳遞。
(3)對改寫后的程序文件進行編譯(Compile)、 連接(Link), 并生成 Continuation.dll文件,從庫中導(dǎo)出的函數(shù)為Continuation。
2.3.3 Matlab庫文件的生成
首先利用Matlab自帶的 COM組件編譯工具COM Builder將以.m文件編寫的數(shù)值計算函數(shù)編譯為COM組件(DLL文件),然后利用VS.NET友好的GUI功能和組件調(diào)用能力調(diào)用Matlab生成組件,從而達到綜合利用兩種軟件平臺優(yōu)勢的目的,并且使軟件開發(fā)達到更好的模塊化。
2.3.3.1 Matlab下COM組件的生成
(1)創(chuàng)建工程。在 COM Builder窗口中的Component name文本框中設(shè)置組件(DLL文件)的名稱。
(2)添加M文件和編譯創(chuàng)建組件。將.m文件添加到工程中,點擊 Build/COM object,生成所需的頭文件、源文件、接口描述文件、動態(tài)鏈接庫文件等,在右側(cè)的 Build status顯示框中顯示編譯的過程和信息。
(3)打包和分發(fā)組件。點擊ComponentAdd component將文件打包。打包后新建 distrib和src文件夾,包含調(diào)用所需文件、庫、資源、接口等。
2.3.3.2 VS.NET調(diào)用COM組件
(1)添加引用。在 VS.NET環(huán)境下,點擊“項目/添加引用”菜單。在該對話框中,選擇中間選項卡COM,如果COM組件在系統(tǒng)中已注冊,則可在列表中找到該組件。選擇生成組件,并添加到項目中。打開.NET對象瀏覽器窗口,可看到由Matlab生成的COM類已添加到工程項目中。
(2)實例化COM引用。完成添加后,可在.NET代碼中使用COM組件。VS.NET創(chuàng)建的名稱空間與原來的COM組件有同樣的名稱,由COM組件提供的類放在該名稱空間中,則可與使用C#固有對象相同的語言來創(chuàng)建其引用,并實例化和調(diào)用COM對象的包裝。
軟件界面按照Windows界面風(fēng)格進行設(shè)計,主界面由菜單、工具條、圖例內(nèi)容表、視圖和狀態(tài)欄5部分組成(圖5)。主要包括文件、視圖管理、查詢檢索、屬性管理、圖形操作、空間分析、數(shù)據(jù)預(yù)處理、常規(guī)處理、弱信息提取、非線性分解、斷裂分形維和放射性處理等菜單。
軟件中基本GIS功能大部分可以直接通過ArcGIS Engine提供的工具按鈕來實現(xiàn),不需要進行任何編程,但是還有一些功能,如網(wǎng)格專題的添加、空間和屬性查詢、圖例編輯等等都是需要通過編程來實現(xiàn)的。
常規(guī)與非常規(guī)數(shù)據(jù)處理功能開發(fā)的思路相同,就是先把需要處理的網(wǎng)格專題圖層(GRID Files)轉(zhuǎn)換成文本文件,然后再調(diào)用動態(tài)鏈接庫中的數(shù)據(jù)處理函數(shù)對文本文件進行處理,最后再將處理得到的結(jié)果文本文件轉(zhuǎn)換成柵格圖層,并導(dǎo)入到軟件的當(dāng)前視圖中進行其他分析。
基于組件GIS技術(shù)開發(fā)的專業(yè)應(yīng)用軟件,具有開發(fā)方式靈活、開發(fā)周期短、更專注于專業(yè)功能等優(yōu)點。開發(fā)的區(qū)域物化探數(shù)據(jù)處理軟件界面友好、操作簡單、功能實用,高效地將基本GIS功能、常規(guī)數(shù)據(jù)處理功能,以及非常規(guī)數(shù)據(jù)處理功能集成在一起。該軟件在桃山—諸廣鈾成礦帶、內(nèi)蒙古滿洲里鈾及多金屬成礦帶得到了應(yīng)用,取得了較好的應(yīng)用效果,并成功獲得了國家版權(quán)局頒發(fā)的計算機軟件著作權(quán)登記證書。
[1]柯 丹.花崗巖型鈾礦勘查中區(qū)域物化探方法技術(shù)研究[D].北京:核工業(yè)北京地質(zhì)研究院,2011.
[2]劉乃琦.IBM PC混合語言編程技術(shù)[M].北京:電子工業(yè)出版社,1990.