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