You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

128 lines
3.6 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

//////////////////////////////////////////////////////////////////////////////
//文件: 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;