張成云,石深涵,熊杰,夏成靜,張伊
(長江大學電子信息學院,湖北 荊州 434023)
基于Qt和動態(tài)鏈接庫的SEG-Y格式地震數(shù)據(jù)讀寫軟件開發(fā)
張成云,石深涵,熊杰,夏成靜,張伊
(長江大學電子信息學院,湖北 荊州 434023)
SEG-Y格式是國際通用的地震數(shù)據(jù)文件格式。針對該格式文件結(jié)構(gòu)復雜、讀取困難的問題,在Qt框架下采用動態(tài)鏈接庫技術(shù)開發(fā)了可重用的SEG-Y格式地震數(shù)據(jù)讀寫軟件。該軟件首先讀取文件頭和道頭信息,然后以人機交互方式設(shè)置相應(yīng)參數(shù),最后讀取實際地震數(shù)據(jù)。測試結(jié)果表明,該軟件能正確讀寫SEG-Y格式地震數(shù)據(jù)文件,并以動態(tài)鏈接庫的形式供第三方使用,為地震數(shù)據(jù)處理解釋軟件的國產(chǎn)化提供支持。
SEG-Y格式;地震數(shù)據(jù);讀寫軟件;Qt;動態(tài)鏈接庫
地震勘探是石油勘探中一種最常見和最重要的方法[1],地震數(shù)據(jù)一般采用SEG-Y格式存儲,該格式是由SEG(Society of Exploration Geophysicists)提出的國際標準,是石油勘探行業(yè)通用的地震數(shù)據(jù)格式。目前,國外商業(yè)軟件對SEG-Y格式文件讀寫支持較好,但其SEG-Y格式讀寫模塊不對外開放,無法重用。因此,有必要開發(fā)可重用的SEG-Y格式[1]地震數(shù)據(jù)讀寫軟件,為地震數(shù)據(jù)處理解釋軟件國產(chǎn)化提供支持。下面,筆者將先對SEG-Y文件格式進行分析,再在Qt框架[2]下開發(fā)SEG-Y格式地震數(shù)據(jù)讀寫軟件,最后分析在Qt中利用DLL對讀寫代碼封裝的方法及軟件調(diào)試結(jié)果。
標準SEG-Y格式文件[3]一般包括3部分,第1部分是EBCDIC文本文件頭,第2部分是二進制文件頭,第3部分是地震道數(shù)據(jù)集。SEG-Y文件格式如圖1所示,其中,文本文件頭長度為3200字節(jié),采用EBCDIC字符編碼,需轉(zhuǎn)換成ASCII碼后才能在PC上顯示;二進制文件頭長度為400字節(jié),其數(shù)據(jù)類型是16位或32位整型,記錄SEG-Y文件的格式信息;地震道數(shù)據(jù)集由各道地震數(shù)據(jù)組成,每一道地震數(shù)據(jù)由240字節(jié)的二進制道頭和采樣點數(shù)據(jù)集組成。其中,二進制道頭包含該道的CDP號、XLine號、Line號、采樣點數(shù)、采樣間隔、采樣點數(shù)據(jù)格式等信息。
圖1 SEG-Y文件格式示意圖
圖2 SEG-Y格式讀寫軟件結(jié)構(gòu)框圖
SEG-Y格式讀寫軟件采用人機交互方式設(shè)置參數(shù),實現(xiàn)地震數(shù)據(jù)讀取和導出功能。根據(jù)SEG-Y格式文件的特點,設(shè)計軟件功能模塊框圖如圖2所示。
該軟件模塊由5個模塊組成:工作區(qū)管理模塊為新建文件和打開工作區(qū)提供支持;地震數(shù)據(jù)文件信息處理模塊負責讀取文本文件頭、二進制文件頭和各道頭參數(shù),如CDP號、XLine號、Line號、采樣點數(shù)、采樣間隔、采樣點數(shù)據(jù)格式等;地震數(shù)據(jù)讀取模塊實現(xiàn)SEG-Y文件數(shù)據(jù)讀取功能;地震數(shù)據(jù)格式轉(zhuǎn)換模塊負責IEEE、IBM、PC 3種格式的相互轉(zhuǎn)換;文件管理模塊實現(xiàn)文件輸入和輸出功能。
3.1 SEG-Y格式文件讀寫流程
SEG-Y格式文件的讀取過程復雜,包括文本文件頭、二進制文件頭的解析與顯示,人機交互進行參數(shù)設(shè)置,地震數(shù)據(jù)的讀取、導出等步驟。SEG-Y格式文件讀寫的流程圖如圖3所示。
圖3 SEG-Y格式文件讀寫流程圖
3.2 數(shù)據(jù)格式轉(zhuǎn)換
SEG-Y格式文件支持IEEE、IBM、PC這3種數(shù)據(jù)格式,軟件可以實現(xiàn)3種格式之間相互轉(zhuǎn)換的功能。以IBM格式轉(zhuǎn)換為IEEE格式為例,其轉(zhuǎn)化代碼如下:
void SEGy::IBM2IEEE(float* data, bool swap)
{
…
if(swap)
{
tem = cbuf[0]; cbuf[0] = cbuf[3]; cbuf[3] = tem;
tem = cbuf[2]; cbuf[2] = cbuf[1]; cbuf[1] = tem;
}
expp = (unsigned char)(*mantis?24);
*mantis = (*mantis)?8;
shift = 1;
while(*mantis > 0 && shift < 23) {
*mantis = *mantis?1;
shift++;
}
*mantis = *mantis?1;
sign = expp & 0x80;
expp = expp & 0x7F;
if(expp != 0)
{
expp = expp-64;
*umantis = *umantis?9;
expll = 0x7F + (expp*4 - shift);
expll = expll?23;
if(sign) *umantis = expll | *mantis | 0x80000000;
else *umantis = expll | *mantis;
}
}
3.3 Qt框架下DLL開發(fā)
DLL可以創(chuàng)建可重用代碼模塊[5,6],通過DLL對代碼進行共享,從而實現(xiàn)SEG-Y格式文件讀寫軟件模塊代碼重用。在Qt中創(chuàng)建DLL工程[4]步驟如下:在Library中選擇C++library,在Type中選擇Shared Library,在Name中命名DLL的工程名。創(chuàng)建完畢之后會生成2個頭文件,一個資源文件,除工程名對應(yīng)的頭文件跟資源文件之外,還有一個“SEGy_global.h”。DLL的工程編譯,在工程名頭文件中加入需要封裝函數(shù)的成員變量和函數(shù),同時還需要獲取封裝類中的對象,代碼如下:
extern “C”{
SEGYSHARED_EXPORT SEGy* getSEGyObject(); //獲取類SEGy的對象
SEGYSHARED_EXPORT void releseSEGyObject(SEGy*); //獲取類SEGy的對象
}
編寫的SEG-Y格式讀寫文件在minGW環(huán)境下進行編譯后,在工程的debug文件夾下可以找到“SEGy.dll、SEGy.o、SEGy.a”3個文件。其中,“SEGy.dll”是在Windows下面可調(diào)用的動態(tài)鏈接庫,“SEGy.o”是在Linux下可調(diào)用的動態(tài)鏈接庫。如果是在MSVC環(huán)境下編譯可以生成“SEGy.lib”和“SEGy.dll”文件,結(jié)果如圖4所示。
圖4 DLL編譯結(jié)果
圖5 測試程序流程圖
在Qt中建立地震數(shù)據(jù)可視化的測試
程序,進行SEG-Y格式文件可重用模塊的功能檢測。測試程序調(diào)用的流程圖如圖5所示。
為在測試程序中實現(xiàn)DLL調(diào)用,首先將SEGy.h和SEGy_global.h頭文件放在當前的工程文件夾下,添加到當前工程中;然后設(shè)置鏈接庫的路徑;最后在主程序中包含頭文件和宏定義,并導入動態(tài)鏈接庫文件。執(zhí)行結(jié)果圖如圖6所示。
庫調(diào)用過程中,設(shè)置DLL的路徑需要以下代碼:
LIBS +=segy.DLLDESTDIR #很重要!路徑設(shè)置問題。
LIBS +=
通過上述代碼指出庫所在的文件夾位置,路徑設(shè)置正確后進行庫調(diào)用的下一步操作,代碼如下:
#include
#include “SEGy.h”
typedef SEGy* (*CreatSEGy)();
typedef bool (*ReleSEGyDll)(SEGy*);
圖6(a)是SEG-Y格式文件信息的處理:文件篩選獲取,SEG-Y格式文件道頭的讀取操作及地震數(shù)據(jù)的平面或立體呈現(xiàn)的選擇,為文件的讀取做準備;圖6(b)是對一個IBM格式文件的識別,讀取結(jié)果正確,說明讀寫軟件能正確讀寫SEG-Y格式地震數(shù)據(jù);圖6(c)是格式轉(zhuǎn)換界面,該文件是由IBM格式轉(zhuǎn)換為IEEE格式,轉(zhuǎn)換后的SEG-Y格式文件各項參數(shù)的變化依次呈現(xiàn),提供詳細的數(shù)據(jù)變換結(jié)果。
利用Qt框架良好的跨平臺特性,編寫了SEG-Y格式地震數(shù)據(jù)文件讀寫代碼,并通過DLL技術(shù)進行封裝實現(xiàn)了軟件模塊的可重用性。軟件測試結(jié)果表明,該軟件能正確讀取SEG-Y格式地震數(shù)據(jù),且具有跨平臺和可重用特性,能為地震數(shù)據(jù)處理解釋軟件的國產(chǎn)化提供支持。
圖6 SEG-Y格式文件讀取軟件模塊執(zhí)行結(jié)果圖
[1]劉旭躍,周巍,孔祥寧,等.SEG-Y格式自動轉(zhuǎn)化軟件的研究與實現(xiàn)[J].物探化探計算技術(shù),2016,38(1):126~127.
[2]王文芳,許文峰,許冰清,等.基于Qt的人機交互2.5維地質(zhì)建模軟件設(shè)計與實現(xiàn)[J].成都大學學報(自然科學版),2013,32(12):371~374.
[3]劉明忱,孫建國.基于C語言的SEG-Y數(shù)據(jù)格式分析與轉(zhuǎn)化[J] .地球物理學進展,2016,31(1):0260~0267.
[4]Jasmin Blanchette, Mark Summerfield.C++ GUI Programming with Qt4.Second Edition[M].閆鋒欣,曾泉人,張志強,等譯.北京: 電子工業(yè)出版社,2007:174~321.
[5]王保華,陸建林,左宗鑫.地質(zhì)地層數(shù)據(jù)處理的GRID類設(shè)計及DLL實現(xiàn)[J].長江大學學報(自科版),2016,13(7):63~66.
[6] 宋偉聰,李德春,邱開林,等.VB與Fortran混合編程的重磁數(shù)據(jù)處理可視化系統(tǒng)[J].長江大學學報(自科版),2016,13(17):28~31.
[編輯] 洪云飛
2016-11-12
湖北省教育廳科學技術(shù)研究項目(D20131206, B2016034);長江大學創(chuàng)新創(chuàng)業(yè)訓練項目(20160042)。
熊杰(1975-),男,博士,副教授,現(xiàn)主要從事科學可視化、云計算、地球物理反演方面的教學與研究工作,xiongjie@yangtzeu.edu.cn。
TP391.9;P631.4
A
1673-1409(2017)01-0012-05
[引著格式]張成云,石深涵,熊杰,等.基于Qt和動態(tài)鏈接庫的SEG-Y格式地震數(shù)據(jù)讀寫軟件開發(fā)[J].長江大學學報(自科版),2017,14(1):12~16,74.