王保華
陸建林,左宗鑫 (中石化石油勘探開發(fā)研究院無(wú)錫石油地質(zhì)研究所,江蘇 無(wú)錫 214126)
?
地質(zhì)地層數(shù)據(jù)處理的GRID類設(shè)計(jì)及DLL實(shí)現(xiàn)
陸建林,左宗鑫(中石化石油勘探開發(fā)研究院無(wú)錫石油地質(zhì)研究所,江蘇 無(wú)錫 214126)
[摘要]地質(zhì)工作需要處理大量的三維空間數(shù)據(jù),這類三維數(shù)據(jù)體可以統(tǒng)一到一種通用的三維數(shù)據(jù)結(jié)構(gòu)——Sufer的GRID格式數(shù)據(jù)結(jié)構(gòu)。在GRID格式數(shù)據(jù)基礎(chǔ)上,建立其多種操作方法的GRID類并實(shí)現(xiàn)其動(dòng)態(tài)鏈接庫(kù),進(jìn)而可以方便的實(shí)現(xiàn)不同語(yǔ)言平臺(tái)的動(dòng)態(tài)調(diào)用。闡述了Sufer明碼格網(wǎng)文件結(jié)構(gòu),介紹了重要屬性、I/O操作、運(yùn)算符重載、查詢方法等屬性方法的設(shè)計(jì),分析了單點(diǎn)查詢流程,并采用C++Builder開發(fā)工具中的DLLWizard實(shí)現(xiàn)了DLL的建立。在四川盆地川西坳陷海相烴源巖生烴史模擬數(shù)據(jù)處理及模擬結(jié)果分析工作中的應(yīng)用驗(yàn)證了其快速、方便、準(zhǔn)確的特點(diǎn)。
[關(guān)鍵詞]Sufer明碼格網(wǎng)文件;GRID類;動(dòng)態(tài)鏈接庫(kù)(DLL)
在地質(zhì)領(lǐng)域中,大量使用三維體來(lái)表示三維空間信息,如平面構(gòu)造、地層厚度分布、地層剝蝕量、溫度平面分布、RO平面分布、烴源巖厚度分布、有機(jī)碳平面分布、生烴強(qiáng)度分布、資源量分布、油氣化探異常分布等。而表現(xiàn)這些信息的數(shù)據(jù)結(jié)構(gòu)卻不盡相同,要實(shí)現(xiàn)這些數(shù)據(jù)的運(yùn)算操作必須要將其統(tǒng)一到相同的數(shù)據(jù)結(jié)構(gòu)中才能實(shí)現(xiàn)。Surfer明碼格網(wǎng)文件格式使用單精度值,存儲(chǔ)信息量大、精度高,能在 Surfer工作表或一個(gè)文本編輯器中編輯,同時(shí)也能實(shí)現(xiàn)程序的讀寫。Surfer軟件本身提供的強(qiáng)大的插值功能和繪制圖件能力,使其成為用來(lái)處理三維體首選的軟件 。它能迅速地將離散點(diǎn)的測(cè)量數(shù)據(jù)通過插值轉(zhuǎn)換為連續(xù)的數(shù)據(jù)曲面 ,形成Surfer明碼格網(wǎng)文件。尤其是Surfer8.0,提供了12種內(nèi)插方法:反距離加權(quán)插值法、克里格插值法、最小曲率法、改進(jìn)謝別德法、自然鄰點(diǎn)插值法、最近鄰點(diǎn)插值法、多元回歸法、徑向基函數(shù)法、線性插值三角網(wǎng)法、移動(dòng)平均法、局部多項(xiàng)式法和數(shù)據(jù)度量法[1]。
面向?qū)ο蠓椒ㄓ脤?duì)象作為實(shí)際系統(tǒng)的抽象,作為系統(tǒng)的基本單位,將信息和相關(guān)的方法封裝后,使得軟件易于修改、擴(kuò)充和維護(hù),通過類的繼承關(guān)系,簡(jiǎn)化系統(tǒng)的構(gòu)造過程和文檔,并且支持重用,擴(kuò)大了重用范圍[2]。DLL(動(dòng)態(tài)鏈接庫(kù))可以單獨(dú)對(duì)庫(kù)進(jìn)行升級(jí),而應(yīng)用程序也不需要重新編譯就可以使用版本更新的庫(kù)。采用動(dòng)態(tài)庫(kù)的程序通常占有更少的硬盤空間和更少的系統(tǒng)資源,當(dāng)多個(gè)使用同一個(gè)DLL進(jìn)程執(zhí)行的時(shí)候,此DLL僅載入一次,不同語(yǔ)言編寫的可執(zhí)行程序可以調(diào)用同一個(gè)DLL[3~5]。而針對(duì)Surfer明碼格網(wǎng)(GRID)數(shù)據(jù)格式的操作,經(jīng)常應(yīng)用于地質(zhì)數(shù)據(jù)處理如(盆地模擬數(shù)據(jù)準(zhǔn)備、資源量計(jì)算、油氣化探數(shù)據(jù)處理等)的實(shí)際工作中。因此,有必要編寫一個(gè)通用的基于Surfer明碼格網(wǎng)(GRID)數(shù)據(jù)操作的類(GRID類)。
1Surfer明碼格網(wǎng)文件 和GRID類的設(shè)計(jì)
1.1Surfer明碼格網(wǎng)文件結(jié)構(gòu)
GRID數(shù)據(jù)接口是一個(gè)開放式的軟件數(shù)據(jù)接口,用戶用其他軟件獲取的數(shù)據(jù)只要按照明碼格式寫成.grd后綴文件,就可以由Surfer系統(tǒng)讀取。其明碼數(shù)據(jù)格式是 ASCII碼的文件,包括了平面上的點(diǎn)數(shù)、XYZ方向的最大最小值以及規(guī)格格網(wǎng)點(diǎn)上的元素屬性值。其線文件結(jié)構(gòu)如下:
DSAA //文件標(biāo)識(shí)
row list //格網(wǎng)行、列數(shù);
xmin xmax //X方向最小最大值;
ymin ymax//Y方向最小最大值;
zmin zmax//Z方向最小最大值;
z11 z21 z31 …。//格網(wǎng)元素屬性值。
該格式數(shù)據(jù)在有效數(shù)據(jù)范圍外格網(wǎng)以無(wú)窮大數(shù)代替(通常為一個(gè)很大的數(shù),如1.7e+38)。GRID數(shù)據(jù)結(jié)構(gòu)徹底改變了XYZ格式的數(shù)據(jù)結(jié)構(gòu),節(jié)省了存儲(chǔ)平面XY坐標(biāo)的空間,同時(shí)使得對(duì)整個(gè)數(shù)據(jù)體快速實(shí)現(xiàn)平面的縮放和位移。
1.2GRID類的設(shè)計(jì)
GRID類的設(shè)計(jì)必須考慮其數(shù)據(jù)結(jié)構(gòu)的特性以及其在實(shí)際應(yīng)用中的操作需求。根據(jù)GRID數(shù)據(jù)結(jié)構(gòu)本身的特點(diǎn),首先需要實(shí)現(xiàn)GRID數(shù)據(jù)的I/O操作、實(shí)現(xiàn)對(duì)運(yùn)算符號(hào)的重載和實(shí)現(xiàn)關(guān)于數(shù)據(jù)體的一般查詢,其次需要考慮對(duì)格網(wǎng)的更新和其在資源量計(jì)算等實(shí)際工作的計(jì)算方法。
1.2.1重要屬性設(shè)計(jì)
GRID類的重要屬性(見表1)保存GRID數(shù)據(jù)結(jié)構(gòu)的重要信息,其大部分變量是加載數(shù)據(jù)時(shí)直接賦予的,用戶需要獲取這些信息時(shí)只能通過類提供的方法來(lái)實(shí)現(xiàn),這些屬性的讀取,用戶不能修改這些固有屬性的值。元素屬性和異常代號(hào)由于其動(dòng)態(tài)性而必須設(shè)置為用戶可讀寫變量。
表1 GRID類的重要屬性表
1.2.2I/O操作設(shè)計(jì)
I/O操作主要包括對(duì)GRID格式數(shù)據(jù)的讀取和保存,是提供給用戶的基本接口,操作方法為:
Bool LoadFromFile(AnsiString FileName);
//加載數(shù)據(jù)文件,函數(shù)參數(shù)為數(shù)據(jù)文件全路徑文件名,加載成功返回真反之為假
Bool CGrid::SaveToFile(AnsiString FileName);
//保存數(shù)據(jù)文件,函數(shù)參數(shù)為數(shù)據(jù)文件全路徑文件名,保存成功返回真反之為假
1.2.3運(yùn)算符重載設(shè)計(jì)
對(duì)GRID格式數(shù)據(jù)的運(yùn)算符重載是本類的重要方法,方法如下:對(duì)+、-、*、/的重載可以實(shí)現(xiàn)2個(gè)同類型格網(wǎng)(即格網(wǎng)行、列數(shù)相同)、格網(wǎng)與數(shù)值、數(shù)值與格網(wǎng)的算術(shù)運(yùn)算,當(dāng)2個(gè)同類型格網(wǎng)進(jìn)行算術(shù)運(yùn)算時(shí),如果有效格網(wǎng)區(qū)域相同則可直接運(yùn)算,當(dāng)格網(wǎng)有效格網(wǎng)區(qū)域不同時(shí),為了敘述方便,作網(wǎng)格示意圖(見圖1),格網(wǎng)1和格網(wǎng)2其重疊后被分為A、B1(B2)、C這3塊,其中格網(wǎng)1=A+B1,格網(wǎng)2=B2+C,B1(B2)為2個(gè)格網(wǎng)重疊區(qū)域。并作出如下約定:當(dāng)格網(wǎng)1與格網(wǎng)2進(jìn)行+、-運(yùn)算時(shí)把格網(wǎng)1有效區(qū)拓展到C,把格網(wǎng)2有效區(qū)拓展到A,并設(shè)定拓展區(qū)域元素屬性值為0,再進(jìn)行運(yùn)算;當(dāng)進(jìn)行*、/運(yùn)算時(shí),把格網(wǎng)1和格網(wǎng)2有效區(qū)縮小到B,A、C區(qū)域?yàn)闊o(wú)效格網(wǎng)區(qū)域,再進(jìn)行運(yùn)算。&,|分別實(shí)現(xiàn)類似于*、/運(yùn)算區(qū)域的加法和減法。對(duì)=號(hào)的重載實(shí)現(xiàn)了格網(wǎng)的賦值功能。
1.2.4查詢方法設(shè)計(jì)
圖1 格網(wǎng)示意圖
查詢方法也是GRID提供的最基本的方法,主要包括單點(diǎn)查詢、線段查詢、條件區(qū)域查詢。
1)單點(diǎn)查詢提供對(duì)區(qū)域內(nèi)的任意點(diǎn)格網(wǎng)元素屬性值實(shí)現(xiàn)查詢功能,方法名為GetPoint();
2)線段查詢提供對(duì)區(qū)域內(nèi)的任意直線段上的元素屬性值查詢,方法名為GetLine(),通過該方法對(duì)多個(gè)疊加格網(wǎng)進(jìn)行查詢時(shí)可獲得相應(yīng)的元素屬性值的一條剖面;
3)條件區(qū)域查詢提供對(duì)某條件下區(qū)域內(nèi)符合該條件的點(diǎn)集合進(jìn)行查詢,方法名為GetArea(),通過該方法的多種重載可實(shí)現(xiàn)不同條件下的區(qū)域查詢,以下列出一些重載方法:
GRID GetArea(int 上界限,int下界限);
//實(shí)現(xiàn)對(duì)給定常數(shù)的上下界限進(jìn)行查詢,返回符合條件的格網(wǎng);
GRID GetArea(GRID上界限,GRID下界限);
//實(shí)現(xiàn)對(duì)給定格網(wǎng)的上下界限進(jìn)行查詢,返回符合條件的格網(wǎng);
GRID GetArea(int 上界限,GRID下界限)和GRID GetArea(GRID 上界限,int下界限)
//實(shí)現(xiàn)對(duì)給定常數(shù)(格網(wǎng))的上界限及格網(wǎng)(常數(shù))的下界限進(jìn)行查詢,返回符合條件的格網(wǎng);
GRID GetArea(GRID 參照格網(wǎng),GRID 目標(biāo)格網(wǎng),bool 標(biāo)志);
//實(shí)現(xiàn)對(duì)目標(biāo)格網(wǎng)的有效區(qū)域的重新定義,該有效區(qū)域?qū)⑹菂⒄崭窬W(wǎng)與目標(biāo)格網(wǎng)相交的區(qū)域,返回操作后的格網(wǎng),該方法實(shí)現(xiàn)類似Surfer中的白化功能;
圖2 單點(diǎn)查詢流程圖
由于查詢條件的不同因此查詢方法也多樣化,但通過對(duì)不同查詢條件方法的重載可以實(shí)現(xiàn)各種條件的查詢功能。
2查詢操作流程
任意單點(diǎn)查詢提供對(duì)區(qū)域內(nèi)的任意點(diǎn)格網(wǎng)元素屬性值實(shí)現(xiàn)查詢功能,其實(shí)現(xiàn)流程如圖2所示。
單點(diǎn)查詢中,當(dāng)查詢點(diǎn)不在格網(wǎng)頂點(diǎn)上時(shí),可以采用插值的方式獲得查詢點(diǎn)的屬性值,插值算法可以采用多樣化,以形成不風(fēng)格的單點(diǎn)查詢方式,常用的方法為網(wǎng)格區(qū)域的4點(diǎn)距離平方反比法。
單點(diǎn)查詢是線段查詢和條件查詢的基礎(chǔ),通過對(duì)平面線段的若干個(gè)等間距點(diǎn)的單點(diǎn)查詢,可以實(shí)現(xiàn)線段屬性的提?。辉谌舾蓚€(gè)同坐標(biāo)體系平面數(shù)據(jù)上進(jìn)行線段查詢,可以或關(guān)于屬性的一條剖面;同樣通過對(duì)平面上各格網(wǎng)點(diǎn)的條件判斷可以實(shí)現(xiàn)條件查詢。
3DLL實(shí)現(xiàn)及調(diào)用
通過DLL實(shí)現(xiàn)的GRID類可以被大部分程序設(shè)計(jì)語(yǔ)言所調(diào)用。下面介紹DLL的實(shí)現(xiàn)和C++語(yǔ)言調(diào)用方法。DLL的實(shí)現(xiàn)必須選擇一個(gè)宿主語(yǔ)言,筆者采用C++Builder開發(fā)工具中的DLLWizard實(shí)現(xiàn)了DLL的建立(見圖3、圖4),調(diào)用方法一般的語(yǔ)言介紹文獻(xiàn)均有介紹[6],此不贅述。
圖3 選擇DLLWizard對(duì)話框 圖4 創(chuàng)建DLL向?qū)?/p>
4實(shí)際應(yīng)用
圖5 GRID類查詢方法在盆地模擬數(shù)據(jù)前處理中的應(yīng)用
在川西坳陷海相烴源巖生烴史模擬工作中需要大量的平面文件操作,如由地層厚度數(shù)據(jù)形成構(gòu)造數(shù)據(jù)。模擬中設(shè)計(jì)了20個(gè)層位,其各層構(gòu)造數(shù)據(jù)通過Sufer軟件手動(dòng)相加極其繁瑣,其極易出錯(cuò)。而通過上述GRID類,只須調(diào)用相關(guān)方法既可實(shí)現(xiàn)。通過對(duì)構(gòu)造數(shù)據(jù)的直線查詢,迅速提取構(gòu)造剖面與實(shí)際地震剖面對(duì)比(見圖5),為地質(zhì)人員提高工作效率。因此,通過GRID類的調(diào)用可以將地質(zhì)研究人員從繁瑣的手動(dòng)操作中解放出來(lái),節(jié)約寶貴的時(shí)間用于地質(zhì)研究。在模擬分析中,通過條件查詢快速計(jì)算出源巖各演化階段處于不同成熟階段分布面積和源巖各演化階段生烴強(qiáng)度較大值面積,為更精確的地質(zhì)分析提供依據(jù)。
5結(jié)語(yǔ)
地質(zhì)工作中各類平面數(shù)據(jù)體,都可以采用格網(wǎng)格式表達(dá)。Surfer軟件雖然可以實(shí)現(xiàn)對(duì)格網(wǎng)格式數(shù)據(jù)的簡(jiǎn)單計(jì)算處理,但這種計(jì)算處理功能往往局限于固定的格式,遠(yuǎn)遠(yuǎn)滿足不了實(shí)際的應(yīng)用需求,筆者利用GRID類編寫簡(jiǎn)單的應(yīng)用程序就可以輕而易舉的實(shí)現(xiàn)這些功能,且可以在實(shí)際應(yīng)用中,根據(jù)實(shí)際需要進(jìn)行添加或修改后只需要編譯一下DLL工程,而不需要重新編譯自己的應(yīng)用程序,帶來(lái)了極大的便利。
[參考文獻(xiàn)]
[1]白世彪,閭國(guó)年,楊一鵬.關(guān)于ArcGIS和Surfer格網(wǎng)文件的轉(zhuǎn)換方法 [J].測(cè)繪通報(bào),2005,51(2) :48~54.
[2]張麗英.面向?qū)ο蟮能浖_發(fā)技術(shù)的研究及實(shí)現(xiàn)[J] .軟件開發(fā)與設(shè)計(jì),2009(11):57.
[3]步山岳.動(dòng)態(tài)鏈接庫(kù)DLL[J].電腦編程技巧與維護(hù),2002,9(5):50~52.
[4]鄧斌,盛文,陳玉.Borland C++Builder中動(dòng)態(tài)鏈接庫(kù)的創(chuàng)建和調(diào)用[J].現(xiàn)代電子技術(shù),2003,27(1):15~17.
[5]錢能.C++ 程序設(shè)計(jì)教程[M].北京:清華大學(xué)出版社,1999.
[6]李幼儀.C++Builder高級(jí)應(yīng)用開發(fā)指南[M].北京:清華大學(xué)出版社,2002.
[編輯]洪云飛
[文獻(xiàn)標(biāo)志碼]A
[文章編號(hào)]1673-1409(2016)07-0063-04
[中圖分類號(hào)]TP311.1
[作者簡(jiǎn)介]王保華(1981-),男,工程師,碩士生,現(xiàn)主要從事油氣資源評(píng)價(jià)等方面研究工作;E-mail:wangbh.syky@sinopec.com。
[基金項(xiàng)目]國(guó)家科技重大專項(xiàng)(2011ZX05005-001);中國(guó)石油化工集團(tuán)公司科技項(xiàng)目(P13073)。
[收稿日期]2015-11-26
[引著格式]王保華,陸建林,左宗鑫.地質(zhì)地層數(shù)據(jù)處理的GRID類設(shè)計(jì)及DLL實(shí)現(xiàn)[J].長(zhǎng)江大學(xué)學(xué)報(bào)(自科版),2016,13(7):63~66.