張成云,石深涵,熊杰,夏成靜,張伊
(長江大學電子信息學院,湖北 荊州 434023)
基于Qt和動態鏈接庫的SEG-Y格式地震數據讀寫軟件開發
張成云,石深涵,熊杰,夏成靜,張伊
(長江大學電子信息學院,湖北 荊州 434023)
SEG-Y格式是國際通用的地震數據文件格式。針對該格式文件結構復雜、讀取困難的問題,在Qt框架下采用動態鏈接庫技術開發了可重用的SEG-Y格式地震數據讀寫軟件。該軟件首先讀取文件頭和道頭信息,然后以人機交互方式設置相應參數,最后讀取實際地震數據。測試結果表明,該軟件能正確讀寫SEG-Y格式地震數據文件,并以動態鏈接庫的形式供第三方使用,為地震數據處理解釋軟件的國產化提供支持。
SEG-Y格式;地震數據;讀寫軟件;Qt;動態鏈接庫
地震勘探是石油勘探中一種最常見和最重要的方法[1],地震數據一般采用SEG-Y格式存儲,該格式是由SEG(Society of Exploration Geophysicists)提出的國際標準,是石油勘探行業通用的地震數據格式。目前,國外商業軟件對SEG-Y格式文件讀寫支持較好,但其SEG-Y格式讀寫模塊不對外開放,無法重用。因此,有必要開發可重用的SEG-Y格式[1]地震數據讀寫軟件,為地震數據處理解釋軟件國產化提供支持。下面,筆者將先對SEG-Y文件格式進行分析,再在Qt框架[2]下開發SEG-Y格式地震數據讀寫軟件,最后分析在Qt中利用DLL對讀寫代碼封裝的方法及軟件調試結果。
標準SEG-Y格式文件[3]一般包括3部分,第1部分是EBCDIC文本文件頭,第2部分是二進制文件頭,第3部分是地震道數據集。SEG-Y文件格式如圖1所示,其中,文本文件頭長度為3200字節,采用EBCDIC字符編碼,需轉換成ASCII碼后才能在PC上顯示;二進制文件頭長度為400字節,其數據類型是16位或32位整型,記錄SEG-Y文件的格式信息;地震道數據集由各道地震數據組成,每一道地震數據由240字節的二進制道頭和采樣點數據集組成。其中,二進制道頭包含該道的CDP號、XLine號、Line號、采樣點數、采樣間隔、采樣點數據格式等信息。

圖1 SEG-Y文件格式示意圖

圖2 SEG-Y格式讀寫軟件結構框圖
SEG-Y格式讀寫軟件采用人機交互方式設置參數,實現地震數據讀取和導出功能。根據SEG-Y格式文件的特點,設計軟件功能模塊框圖如圖2所示。
該軟件模塊由5個模塊組成:工作區管理模塊為新建文件和打開工作區提供支持;地震數據文件信息處理模塊負責讀取文本文件頭、二進制文件頭和各道頭參數,如CDP號、XLine號、Line號、采樣點數、采樣間隔、采樣點數據格式等;地震數據讀取模塊實現SEG-Y文件數據讀取功能;地震數據格式轉換模塊負責IEEE、IBM、PC 3種格式的相互轉換;文件管理模塊實現文件輸入和輸出功能。
3.1 SEG-Y格式文件讀寫流程
SEG-Y格式文件的讀取過程復雜,包括文本文件頭、二進制文件頭的解析與顯示,人機交互進行參數設置,地震數據的讀取、導出等步驟。SEG-Y格式文件讀寫的流程圖如圖3所示。

圖3 SEG-Y格式文件讀寫流程圖
3.2 數據格式轉換
SEG-Y格式文件支持IEEE、IBM、PC這3種數據格式,軟件可以實現3種格式之間相互轉換的功能。以IBM格式轉換為IEEE格式為例,其轉化代碼如下:
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開發
DLL可以創建可重用代碼模塊[5,6],通過DLL對代碼進行共享,從而實現SEG-Y格式文件讀寫軟件模塊代碼重用。在Qt中創建DLL工程[4]步驟如下:在Library中選擇C++library,在Type中選擇Shared Library,在Name中命名DLL的工程名。創建完畢之后會生成2個頭文件,一個資源文件,除工程名對應的頭文件跟資源文件之外,還有一個“SEGy_global.h”。DLL的工程編譯,在工程名頭文件中加入需要封裝函數的成員變量和函數,同時還需要獲取封裝類中的對象,代碼如下:
extern “C”{
SEGYSHARED_EXPORT SEGy* getSEGyObject(); //獲取類SEGy的對象
SEGYSHARED_EXPORT void releseSEGyObject(SEGy*); //獲取類SEGy的對象
}
編寫的SEG-Y格式讀寫文件在minGW環境下進行編譯后,在工程的debug文件夾下可以找到“SEGy.dll、SEGy.o、SEGy.a”3個文件。其中,“SEGy.dll”是在Windows下面可調用的動態鏈接庫,“SEGy.o”是在Linux下可調用的動態鏈接庫。如果是在MSVC環境下編譯可以生成“SEGy.lib”和“SEGy.dll”文件,結果如圖4所示。

圖4 DLL編譯結果

圖5 測試程序流程圖
在Qt中建立地震數據可視化的測試
程序,進行SEG-Y格式文件可重用模塊的功能檢測。測試程序調用的流程圖如圖5所示。
為在測試程序中實現DLL調用,首先將SEGy.h和SEGy_global.h頭文件放在當前的工程文件夾下,添加到當前工程中;然后設置鏈接庫的路徑;最后在主程序中包含頭文件和宏定義,并導入動態鏈接庫文件。執行結果圖如圖6所示。
庫調用過程中,設置DLL的路徑需要以下代碼:
LIBS +=segy.DLLDESTDIR #很重要!路徑設置問題。
LIBS +=
通過上述代碼指出庫所在的文件夾位置,路徑設置正確后進行庫調用的下一步操作,代碼如下:
#include
#include “SEGy.h”
typedef SEGy* (*CreatSEGy)();
typedef bool (*ReleSEGyDll)(SEGy*);
圖6(a)是SEG-Y格式文件信息的處理:文件篩選獲取,SEG-Y格式文件道頭的讀取操作及地震數據的平面或立體呈現的選擇,為文件的讀取做準備;圖6(b)是對一個IBM格式文件的識別,讀取結果正確,說明讀寫軟件能正確讀寫SEG-Y格式地震數據;圖6(c)是格式轉換界面,該文件是由IBM格式轉換為IEEE格式,轉換后的SEG-Y格式文件各項參數的變化依次呈現,提供詳細的數據變換結果。
利用Qt框架良好的跨平臺特性,編寫了SEG-Y格式地震數據文件讀寫代碼,并通過DLL技術進行封裝實現了軟件模塊的可重用性。軟件測試結果表明,該軟件能正確讀取SEG-Y格式地震數據,且具有跨平臺和可重用特性,能為地震數據處理解釋軟件的國產化提供支持。

圖6 SEG-Y格式文件讀取軟件模塊執行結果圖
[1]劉旭躍,周巍,孔祥寧,等.SEG-Y格式自動轉化軟件的研究與實現[J].物探化探計算技術,2016,38(1):126~127.
[2]王文芳,許文峰,許冰清,等.基于Qt的人機交互2.5維地質建模軟件設計與實現[J].成都大學學報(自然科學版),2013,32(12):371~374.
[3]劉明忱,孫建國.基于C語言的SEG-Y數據格式分析與轉化[J] .地球物理學進展,2016,31(1):0260~0267.
[4]Jasmin Blanchette, Mark Summerfield.C++ GUI Programming with Qt4.Second Edition[M].閆鋒欣,曾泉人,張志強,等譯.北京: 電子工業出版社,2007:174~321.
[5]王保華,陸建林,左宗鑫.地質地層數據處理的GRID類設計及DLL實現[J].長江大學學報(自科版),2016,13(7):63~66.
[6] 宋偉聰,李德春,邱開林,等.VB與Fortran混合編程的重磁數據處理可視化系統[J].長江大學學報(自科版),2016,13(17):28~31.
[編輯] 洪云飛
2016-11-12
湖北省教育廳科學技術研究項目(D20131206, B2016034);長江大學創新創業訓練項目(20160042)。
熊杰(1975-),男,博士,副教授,現主要從事科學可視化、云計算、地球物理反演方面的教學與研究工作,xiongjie@yangtzeu.edu.cn。
TP391.9;P631.4
A
1673-1409(2017)01-0012-05
[引著格式]張成云,石深涵,熊杰,等.基于Qt和動態鏈接庫的SEG-Y格式地震數據讀寫軟件開發[J].長江大學學報(自科版),2017,14(1):12~16,74.