基于Qt和动态链接库的SEG-Y格式地震数据读写软件开发
2017-04-14张成云石深涵熊杰夏成静张伊
张成云,石深涵,熊杰,夏成静,张伊
(长江大学电子信息学院,湖北 荆州 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对读写代码封装的方法及软件调试结果。
1 SEG-Y格式文件格式
标准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格式读写软件设计
图2 SEG-Y格式读写软件结构框图
SEG-Y格式读写软件采用人机交互方式设置参数,实现地震数据读取和导出功能。根据SEG-Y格式文件的特点,设计软件功能模块框图如图2所示。
该软件模块由5个模块组成:工作区管理模块为新建文件和打开工作区提供支持;地震数据文件信息处理模块负责读取文本文件头、二进制文件头和各道头参数,如CDP号、XLine号、Line号、采样点数、采样间隔、采样点数据格式等;地震数据读取模块实现SEG-Y文件数据读取功能;地震数据格式转换模块负责IEEE、IBM、PC 3种格式的相互转换;文件管理模块实现文件输入和输出功能。
3 SEG-Y格式文件读写软件开发
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编译结果
4 软件测试及结果
图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格式文件各项参数的变化依次呈现,提供详细的数据变换结果。
5 结语
利用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.