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