////////////////////////////////////////////////////////////////////////////// //文件: SegY文件操作类 //主要功能: // 操纵SegY文件的文件头及道头信息,以获得相应参数信息 //程序编写: 2011-4-1 // // ///////////////////////////////////////////////////////////////////////////// #pragma once #include "rowcol.h" #include "binaryposition.h" namespace NSeis { //SegY格式结构///////////////////////////////////////////////////////////////////// // // | 文件头 | 第一道 | 第二道 | 第n道 |最后一道 | // -------------------------------------------------------------------- // | 3200+400 | 240 | | 240 | | | 240 | | // | 字节 | 字节 | 道数据 | 字节 | 道数据 | ....... | 字节 | 道数据 | // | 文件头 | 道头 | | 道头 | | | 道头 | | // -------------------------------------------------------------------- // /////////////////////////////////////////////////////////////////////////////////// //SegY格式文件头,总共3600个字节,有用的仅是后400个字节 //#define SGY_FILE_HEADER_LEN 3600 //#define SGY_TRACE_HEADER_LEN 240 class AFX_EXT_CLASS CSeisFileHeader { public: CSeisFileHeader(void); ~CSeisFileHeader(void); int ReadHeader(CFileSegy& fr); void Initialize(void); //初始化下面定义的参数,必须在读取头数据以后 int line_num; /* (04-07)line number (only one line per reel) */ unsigned short sample_interval; /* (16-17)sample interval in micro secs for this reel */ unsigned short sample_num; /* (20-21)number of samples per trace for this reel */ short format_code; /* (24-25)data sample format code: 1 = floating point (4 bytes) 2 = fixed point (4 bytes) 3 = fixed point (2 bytes) 4 = fixed point w/gain code (4 bytes) + SEG-Y rev 1: 5 = IEEE float (4 bytes) 8 = signed char (1 byte)*/ short system_coor; /* (54-55)measurement system code: 1 = meters 2 = feet */ inline BYTE* GetBytes(int offset, int len){ return m_byHeader + offset; } inline BYTE* GetHeader() { return m_byHeader; }; int GetFormatLength(); //获得一个采样点的字节长度,必须在format_code初始化之后 void operator=(CSeisFileHeader& dbf); protected: BYTE m_byHeader[400]; }; class AFX_EXT_CLASS CSeisTraceInfo { public: CSeisTraceInfo(void); bool isUsable; //该道数据是否正确,(28-29),仅为1时才正确 unsigned short sample_interval; /* (116-117)sample interval in micro secs for this reel */ unsigned short sample_num; /* (114-115)number of samples per trace for this reel */ double m_dCoorScale; //(70-71)短整型,坐标缩放因子 bool m_bUseCoorScale; //是否使用坐标缩放因子进行坐标计算 short system_coor; //坐标单位: 1 = meters 2 = feet,从文件头中获得,需要外部指定, //当为feet时,将自动转换为meters CRowCol m_rowcol; //线号与道号,inline=row, crossline=col CPoint2D m_coor; //坐标,最终以米为单位保存,其它单位时在内部进行转换 }; //SegY格式的道头,占有240个字节 class AFX_EXT_CLASS CSeisTraceHeader { public: CSeisTraceHeader(void); ~CSeisTraceHeader(void); int ReadHeader(CFileSegy& fr); void Initialize(void); //初始化下面定义的参数,必须在读取头数据以后 CSeisTraceInfo& GetTraceInfo() { return traceInfo; } int GetSampleNumber() { return traceInfo.sample_num; } double GetSampleInterval() { return traceInfo.sample_interval; } double GetScale(CBinaryPosition& bp); BYTE* GetBytes(CBinaryPosition& bp); inline BYTE* GetBytes(int offset, int len) { return m_byHeader + offset; } inline BYTE* GetHeader() { return m_byHeader; }; void operator=(CSeisTraceHeader& dbf); int Read(CFile& fr, const short& ver); void Write(CFile& fw, const short& ver); void Serialize(CArchive& ar, const short &ver); void ClonePositon(CSeisTraceHeader& sth); //复制以下位置参数 //位置定义 CBinaryPosition m_bpx; //坐标位置X定义 CBinaryPosition m_bpy; //坐标位置Y定义 CBinaryPosition m_bpz; //坐标位置Z定义,高程信息,一般为无效,只有用户设定后才能使用 CBinaryPosition m_bpRow; //线号位置定义 CBinaryPosition m_bpCol; //道号位置定义 CBinaryPosition m_bpScale; //缩放因子定义 protected: BYTE m_byHeader[240]; CSeisTraceInfo traceInfo; //读取道头得到的信息 }; } using namespace NSeis;