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