|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
//文件: SegY文件操作类
|
|
|
//主要功能:
|
|
|
//
|
|
|
//程序编写: 2011-4-1
|
|
|
//
|
|
|
//
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
#pragma once
|
|
|
#include "databuffer.h"
|
|
|
#include "SeisFileHeader.h"
|
|
|
#include "TInterval.h"
|
|
|
|
|
|
namespace NSeis
|
|
|
{
|
|
|
|
|
|
//地震数据道规一化方式
|
|
|
enum EUniformType
|
|
|
{
|
|
|
ufoTypeNone = 0,
|
|
|
ufoTypeRMS = 1, //均方根
|
|
|
ufoTypeAvg, //平均值
|
|
|
ufoTypeMax, //最大值
|
|
|
};
|
|
|
|
|
|
//一道数据的相关统计数据
|
|
|
class AFX_EXT_CLASS CSeisTraceDataInfo
|
|
|
{
|
|
|
public:
|
|
|
CSeisTraceDataInfo()
|
|
|
{
|
|
|
m_dMaxValue = 0; //最大值
|
|
|
m_dMinValue = 0; //最小值
|
|
|
m_dRms = 0; //均方根值
|
|
|
m_dAverage = 0; //平均值
|
|
|
}
|
|
|
|
|
|
double m_dMaxValue; //最大值
|
|
|
double m_dMinValue; //最小值
|
|
|
double m_dRms; //均方根值
|
|
|
double m_dAverage; //平均值
|
|
|
//double m_dSum; //振幅和
|
|
|
//double m_dSumSquare; //振幅平方和
|
|
|
//double m_dSumSquareW; //带有权重的振幅平方和
|
|
|
//double m_dMedian; //中值
|
|
|
|
|
|
//获得规一化因子
|
|
|
double GetUniformFactor(EUniformType ut);
|
|
|
};
|
|
|
|
|
|
//一道数据
|
|
|
class AFX_EXT_CLASS CSeisTraceData : public CDataBuffer
|
|
|
{
|
|
|
public:
|
|
|
CSeisTraceData(void);
|
|
|
~CSeisTraceData(void);
|
|
|
|
|
|
void Create(int num, int samBytes);
|
|
|
void Create(int num, CFileSegy::EDataType dt);
|
|
|
void Attach(BYTE* pData, int nSampleNum, int nSampleBytes);
|
|
|
void Attach(BYTE* pData, int nSampleNum, CFileSegy::EDataType dt);
|
|
|
|
|
|
virtual void Clear(void);
|
|
|
void Serialize(CArchive& ar, const short &ver);
|
|
|
CSeisTraceData& operator=(CSeisTraceData& dbf);
|
|
|
CSeisTraceDataInfo& GetDataInfo() { return dataInfo; }
|
|
|
void SetDataInfo(CSeisTraceDataInfo& di) { dataInfo = di; }
|
|
|
|
|
|
void RestatDataInfo(CFileSegy::EDataType& dt); //重新统计振幅数据并填充m_dataInfo,一般情况在Read中进行
|
|
|
inline double GetValue(int nIndex, CFileSegy::EDataType& dt); //获得该道中第nIndex个索引振幅值
|
|
|
|
|
|
//快速排序
|
|
|
void QuickSort(CFileSegy::EDataType& dt);
|
|
|
|
|
|
public:
|
|
|
//将道数据保存为指定格式,一般用于该SegY为速度数据时
|
|
|
enum EOutType
|
|
|
{
|
|
|
outTypeCurve = 1, //双狐曲线格式:X振幅、Y时间
|
|
|
outTypeTV, //未匹配坐标的速度谱格式
|
|
|
outTypeStationV, //匹配后的速度谱格式
|
|
|
outTypeXYTA, //坐标(XY)、时间(T)、振幅(A)
|
|
|
outTypeXYICTA, //坐标(XY)、主测线(I)、联络线(C)、时间(T)、振幅(A)
|
|
|
};
|
|
|
//参数CSeisTraceHeader中保存有坐标及线道号
|
|
|
//参数TIntervalStep中为开始结束索引号及步长,0 <= 索引号 <= 道数据个数-1
|
|
|
//参数bRemoveBeginZero:是否移除开始的0数据
|
|
|
void Write( CFile& fw, CSeisTraceInfo& sti, TIntervalStep<int> ts,
|
|
|
EOutType wt, CFileSegy::EDataType& dt, bool bRemoveBeginZero ); //索引号范围
|
|
|
void Write( CFile& fw, CSeisTraceInfo& sti, TIntervalStep<double> ts,
|
|
|
EOutType wt, CFileSegy::EDataType& dt, double offsetTime, bool bRemoveBeginZero ); //时间范围,需要插值
|
|
|
void Write( CFile& fw, double sample_interval, TIntervalStep<int> ts,
|
|
|
double offsetTime, EOutType wt, CFileSegy::EDataType& dt, bool bRemoveBeginZero );
|
|
|
|
|
|
////////////////////////////////////////////////////////////////
|
|
|
CRowCol m_rowcol; //该道的线道号
|
|
|
CPoint2D m_coor; //该道的坐标
|
|
|
|
|
|
protected:
|
|
|
//道数据的统计信息,包括道的最大最小值、均方根值,为float型
|
|
|
CSeisTraceDataInfo dataInfo;
|
|
|
};
|
|
|
|
|
|
inline double CSeisTraceData::GetValue(int nIndex, CFileSegy::EDataType& dt)
|
|
|
{
|
|
|
switch(dt)
|
|
|
{
|
|
|
case CFileSegy::typeIbmGainLong:
|
|
|
case CFileSegy::typeIbmFloat:
|
|
|
case CFileSegy::typeIeeFloat: return GetDataFloat()[nIndex];
|
|
|
|
|
|
case CFileSegy::typeIbmShort:
|
|
|
case CFileSegy::typeIeeShort: return GetDataShort()[nIndex];
|
|
|
|
|
|
case CFileSegy::typeIbmLong:
|
|
|
case CFileSegy::typeIeeLong: return GetDataLong()[nIndex];
|
|
|
|
|
|
case CFileSegy::typeIeeDouble: return GetDataDouble()[nIndex];
|
|
|
|
|
|
case CFileSegy::typeChar: return GetDataChar()[nIndex];
|
|
|
}
|
|
|
return 0.0;
|
|
|
}
|
|
|
|
|
|
}//namespace
|
|
|
|
|
|
using namespace NSeis; |