目录
1、SEG-Y 数据介绍
1)介绍
SEG-Y格式是由美国SEG学会 (Society of Exploration Geophysicists)提出的标准磁带数据格式之一,它是石油勘探行业地震数据的最为普遍的格式之一。
2)组成
SEG-Y数据一般以地震道为单位进行组织。标准SEG-Y数据文件包括三个部分:
(1)EBCDIC 文件头;(2)二进制文件头; (3)数据体 (道头和地震道数据)。
(1) EBCDIC文件头(3200字节)
由40个卡组成(例如:每行80个字符*40行),需要转换为ASCII码后才能显示。主要用于记录与整个工区相关的信息,如施工单位、施工区、监理单位等。
在加载SEG-Y数据时,头文件块可忽略。
(2)二进制文件头(400字节)
用来存储描述SEG-Y文件的一些关键信息,包括SEG-Y文件的数据格式、采样点数、采样间隔等。
(3)数据道道头
道头(Trace Header):长度:240 bytes;数据类型:32位、16位的整型;这部分包含每个道数据的元数据信息,如道序列号、道标识代码、坐标位置和记录参数等。
数据样本(Data Samples):这部分包含实际的地震数据样本,通常以16位整数表示,代表不同时间间隔下地震波场的振幅值。
4种不同的数据收集方式(一般CDP是二维术语、CMP是三维术语):
- 共炮点道集:它是通过在相同的炮点位置上多次进行震源激发,然后记录地震波在不同接收器位置上的返回信号,从而形成多道数据。
- 共中心点道集:CMP (Common Midpoint) Gather,它通过在相同的中心点位置上多次进行震源激发,然后记录地震波在不同接收器位置上的返回信号,形成多道数据。
- 共偏移矩道集:CMO (Common Midpoint Offset) Gather,偏移矩通常是指在共炮点或共中心点道集中,接收器和震源之间的空间距离,而共偏移矩道集则记录了这些偏移矩的数据。
- 共检波点道集:CDP (Common Depth Point) Stack,在这种数据集中,相同的接收器位置上多次记录地震波在不同震源位置上的返回信号,形成多道数据。
字节 | 描述 |
1-4 | 测线中道顺序号――若一条测线有若干SEG Y文件号数递增。强烈推荐所有类型的数据使用 |
5-8 | SEG Y文件中道顺序号――每个文件以道顺序1开始。 |
9-12 | 野外原始记录号。强烈推荐所有类型的数据使用(炮的标号?结合17-20看) |
13-16 | 野外原始记录的道号。强烈推荐所有类型的数据使用(原始的地震道,针对每炮来说,和25-28相同) |
17-20 | 震源点号――当在相同有效地表位置多于一个记录时使用。建议在道头197-202字节定义新的条目用于炮点号。 |
21-24 | 道集号(即CDP,CMP,CRP等)不同的炮共享一个道集 |
25-28 | 道集的道数――每个道集从道号1开始 |
29-30 | 道识别码: -1=其他 0=未知 1=地震数据 2=死道 3=哑道 4=时断 5=井口 6=扫描 7=定时 8=水断 9=近场枪信号 10=远场枪信号 11=地震压力传感器 12=多分量地震传感器――垂直分量 13=多分量地震传感器――横向分量 14=多分量地震传感器――纵向分量 15=旋转多分量地震传感器――垂直分量 16=旋转多分量地震传感器――切向分量 17=旋转多分量地震传感器――径向分量 18=可控源反应质量 19=可控源底盘 20=可控源估计地面力 21=可控源参考 22=时间速度对 23…N=选用,(最大N=32767) 强烈推荐所有类型的数据使用 |
31-32 | 产生该道的垂直叠加道数。(1是一道,2是两道求和,…) |
33-34 | 产生该道的水平叠加道数。(1是一道,2是两道求和,…) |
35-36 | 数据用途: 1=生产 2=试验 |
37-40 | 从震源中心点到检波器组中心的距离(若与炮激发线方向相反取负) |
41-44 | |
45-48 | |
49-52 | 震源距地表深度(正数) |
53-56 | 检波器组基准高程 |
57-60 | 震源基准高程 |
61-64 | 震源水深 |
65-68 | 检波器组水深 |
69-70 | 应用于所有在道头41-68字节给定的真实高程和深度的因子。因子=1,+10,+100,或+1000。若为正,因子为乘数;若为负,因子为除数。道头中69-70字节的因子应用于这些数值。 |
71-72 | 应用于所有在道头73-88字节和181-188字节给定的真实坐标值的因子。因子=1,+10,+100,或+1000。若为正,因子为乘数;若为负,因子为除数。 |
73-76 | 震源坐标――X |
77-80 | 震源坐标――Y |
81-84 | 检波器组坐标――X |
85-88 | 检波器组坐标――Y |
89-90 | 坐标单位: 1=长度(米或英尺) 2=弧度秒 3=小数度 4=度,分,秒(DMS) 注意:为编码±DDDMMSS 89-90字节等于±DDD*10+MM*10+SS,71-72字节设置为1;为编码±DDDMMSS 89-90字节等于±DDD*10+MM*10+SS*10,71-72字节设置为-100。 |
91-92 | |
93-94 | 风化层下速度(如二进制文件头3255-3256字节指明的ft/s或m/s) |
95-96 | 震源处井口时间(毫秒) |
97-98 | 检波器组处井口时间(毫秒) |
99-100 | 震源的静校正量(毫秒) |
101-102 | 检波器组的校正量(毫秒) |
103-104 | 应用的总静校正量(毫秒)(如没有应用静校正量为零) |
105-106 | 延迟时间A――以毫秒表示的240字节道识别头的结束和时间断点之间的时间。当时间断点出现在头之后,该值为正;当时间断点出现在头之前,该值为负。时间断点是最初脉冲,它由辅助道记录或由其他记录系统指定。 |
107-108 | 延迟时间B――以毫秒表示的时间断点到能量源起爆时间之间的时间。可正可负。 |
109-110 | 记录延迟时间――以毫秒表示的能量源起爆时间到数据采样开始记录之间的时间。在SEG Y修订版0中本条用来表示深水作业,如果数据记录不从0时间开始。该条可为负值以适应负的起始时间(即数据记录在零时间之前,假设静校正量应用于数据道的结果)。若某非零值(正或负)记录在该条,它造成的影响的注释应出现在原文文件头。 |
111-112 | 起始切除时间(毫秒) |
113-114 | 终止切除时间(毫秒) |
115-116 | 该道采样点数。强烈推荐所有类型的数据使用 |
117-118 | 该道采样间隔(微秒)。 一道记录的字节数必须和写在道头中的采样点数一致。对所有记录介质都重要,但对正确处理磁盘文件中的SEG Y数据尤为关键(见附录C)。 若二进制文件头中的3503-3504字节设置了固定长度道标志,SEG Y文件每道的采样间隔和采样点数必须与二进制文件头所记录的值一致。若没有设置固定长道标志,采样间隔和采样点数可能每道变化。 强烈推荐所有类型的数据使用 |
119-120 | 野外仪器增益类型: 1=固定 2=二进制 3=浮点 4…N=选用 |
121-122 | 仪器增益常数(分贝) |
123-124 | 仪器初始增益(分贝) |
125-126 | 相关:1=无 2=有 |
127-128 | 起始扫描频率(赫兹) |
129-130 | 终止扫描频率(赫兹) |
131-132 | 扫描长度(毫秒) |
133-134 | 扫描类型:1=线性 2=抛物线 3=指数 4=其他 |
135-136 | 扫描道斜坡起始长度(毫秒) |
137-138 | 扫描道斜坡终止长度(毫秒) |
139-140 | 斜坡类型:1=线性 2=cos 3=其他 |
141-142 | 假频滤波频率(赫兹),若使用 |
143-144 | 假频滤波坡度(分贝/倍频程) |
145-146 | 陷波频率(赫兹),若使用 |
147-148 | 陷波坡度(分贝/倍频程) |
149-150 | 低截频率(赫兹),若使用 |
151-152 | 高截频率(赫兹),若使用 |
153-154 | 低截坡度(分贝/倍频程) |
155-156 | 高截坡度(分贝/倍频程) |
157-158 | 数据记录的年――1975年标准没有说清应该记成2位还是4位还是两者都用。除SGE Y修订版0外,年份需记录成完整的4位罗马历法年(即2001年应记录为200110(7D116))。 |
159-160 | 日(以格林尼治标准时间和通用协调时间为基准的公元日) |
161-162 | 时(24小时制) |
163-164 | 分 |
165-166 | 秒 |
167-168 | 时间基准码: 1=当地 2=格林尼治标准时间 3=其他,应在扩展原文文件头的用户定义文本段解释 4=通用协调时间 |
169-170 | 道加权因子――最小有效位数定义为2伏。(N=0,1,…,32767) |
171-172 | 滚动开关位置1的检波器组号 |
173-174 | 野外原始记录中道号1的检波器组号 |
175-176 | 野外原始记录中最后一道的检波器组号 |
177-178 | 间隔大小(滚动时甩掉的总检波器组数) |
179-180 | 相对测线斜坡起始或终止点的移动 1=下(或后) 2=上(或前) |
181-184 | 该道的道集(CDP)位置X坐标(应用道头71-72字节的因子)。参考坐标系应通过扩展头位置数据文本段识别(见D-1节) |
185-188 | 该道的道集(CDP)位置Y坐标(应用道头71-72字节的因子)。参考坐标系应通过扩展头位置数据文本段识别(见D-1节) |
189-192 | 对于3-D叠后数据,本字段用来填纵向线号(In-line)。若每个SEG Y文件记录一条纵向线,文件中所有道的该值应相同,并且同样的值将记录在二进制文件头的3205-3206字节中。 |
193-196 | 对于3-D叠后数据,本字段用来填横向线号(Cross-line)。它应与道头21-24字节中的道集(CDP)号的值一致,但这并不是实例。 |
201-202 | 应用于道头中197-200字节中炮点号的因子,以得到实际数值。若为正,因子用作乘数;若为负,因子用作除数;若为零;炮点号不用于因子作用(即它是一个整数。典型的值是-10,允许炮点号小数点后有一位小数)。 |
203-204 | 道值测量单位: -1=其他(应在数据采样测量单位文本段描述) 0=未知 1=帕斯卡(Pa) 2=伏特(V) 3=毫伏(mV) 4=安培(A) 5=米(m) 6=米每秒(m/s) 7=米每秒二次方(m/s) 8=牛顿(N) 9=瓦特(W) |
205-210 | 转换常数――该倍数用于将数据道采样转换成转换单位(道头211-212字节指定)。本常数以4字节编码,尾数是两互补整数(205-208字节)和2字节,十的指数幂是两互补整数(209-210字节)(即(205-208字节)×10**(209-210字节))。 |
211-212 | 转换单位――经乘以道头205-210字节中的转换常数后的数据道采样测量单位。 -1=其他(应在数据采样测量单位文本段36页描述) 0=未知 1=帕斯卡(Pa) 2=伏特(V) 3=毫伏(mV) 4=安培(A) 5=米(m) 6=米每秒(m/s) 7=米每秒二次方(m/s) 8=牛顿(N) 9=瓦特(W) |
213-214 | 设备/道标识――与数据道关联的单位号或设备号(即4368对应可控源号4368或20316对应2船3线16枪)。本字段允许道关联横跨独立于道号的道集(道头25-28字节) |
215-216 | 在道头95-114字节给出的作用于时间的因子,以得到真实的毫秒表示的时间值。因子=1,+10,+100,+1000或+10000。若为正,因子用作乘数;若为负,因子用作除数。为零设定因子为一。 |
217-218 | 震源类型/方位――定义类型或能量源的方位。垂直项、横向项、纵向项作为正交坐标系的三个轴。坐标系轴的绝对角度方位可在面元网格定义文本段中定义(27页) -1到-n=其他(应在震源类型/方位文本段38页描述) 0=未知 1=可控震源――垂直方位 2=可控震源――横向方位 3=可控震源――纵向方位 4=冲击源――垂直方位 5=冲击源――横向方位 6=冲击源――纵向方位 7=分布式冲击源――垂直方位 8=分布式冲击源――横向方位 9=分布式冲击源――纵向方位 |
219-224 | 相对震源方位的震源能量方向――正方位方向在道头217-218字节定义。能量方向以度数长度编码(即347.8°编码成3478) |
225-230 | 震源测量――描述产生道的震源效应。测量可以简单,定量的测量如使用炸药总重量或气枪压力峰值或可控源振动次数和扫描周期时间。尽管这些简单的测量可接受,但最好使用真实的能量或工作测量单位。 本常数编码成4字节,尾数为两互补整数(225-228字节)和2字节,十的指数幂是两互补整数(209-230字节)(即(225-228字节)×10**(229-230字节))。 |
231-232 | 震源测量单位――用于震源测量、道头225-230字节的单位。 -1=其他(应在震源测量单位文本段39页描述) 0=未知 1=焦耳(J) 2=千瓦(kW) 3=帕斯卡(Pa) 4=巴(Bar) 4=巴-米(Bar-m) 5=牛顿(N) 6=千克(kg) |
233-240 | 未赋值――为任选信息预留 |
3)自问自答
1.1 问:如何确定是二维还是三维数据?
1.2 问:如何知道有几炮数据?每炮数据包含多少道?
纵轴:采样间隔(时间步长)?采样点数量?
横轴:检波器数据量?检波器距离(空间步长)?
1.3 问:如何查看频率范围?
1.4 问:如何查看是叠前还是叠后数据?
1.5 问:地震数据的组织方式是?共炮点道集或者共中心点道集?
2、Seisee 显示地震数据
1)查看帮助文件。
可以使用Seisee 软件查看数据,help里面有详细的使用指南。
2)调整颜色面板,采用不同方式显示数据。
3)自问自答
2.1 为什么下图中,在采样时间700附近,会出现下面这种重叠很大的区域?
2.2 SP\CDP\FFID(野外文件号) 的含义?
FFID野外记录数/炮点数
CDP(Common Depth Point)共深度点道集, 地震资料采集中,当反射界面水平时,在测线上不同的共炮点道集中,总能找到不同的道,它们都来自地下界面上的某个共同点,该点称为共深度点或共反射点,具有共同深度反射点的相应各记录道组成共深度点(或共反射点)道集称为CDP道集(或CRP道集)
SP?
4)参考资料
详细使用,请参考视频:SEGY数据读写概述——用SeiSee查看文件(附资料) - 知乎
3、segyio 读取数据
参考手册https://www.5axxw.com/wiki/content/5nl5d4
1)导入库
import segyio
import numpy as np
2)打开文件
with segyio.open(filename) as f:
...
Open接受几个选项(要获得更全面的引用,请使用help(segyio.open)
检查Open函数的docstring。最重要的选项是第二个(可选)位置参数。要打开文件进行写入,请从Cfopen
函数中执行segyio.open(filename, 'r+')
。
3)segy file对象有几个公共属性来描述这个结构:
f.ilines
推断的内联数字f.xlines
推断交叉线数f.offsets
推断的偏移量数f.samples
推断的样本偏移量(频率和记录时间延迟)f.unstructured
非结构化为True,结构化为Falsef.ext_headers
扩展文本标题的数目
如果以非结构化方式打开文件,则所有行属性都将是None
。
目前的现场结构数据是非结构化的。
4) 访问结构化的数据
with segyio.open(filename, 'r', ignore_geometry=True) as segyfile:
# Memory map file for faster reading (especially if file is big...)
segyfile.mmap()
# Print binary header info
print(segyfile.bin)
print(segyfile.bin[segyio.BinField.Traces])
# Read headerword inline for trace 10
print(segyfile.header[10][segyio.TraceField.INLINE_3D])
# Print inline and crossline axis
print(segyfile.xlines)
print(segyfile.ilines)
# Read data along first xline
data = segyfile.xline[segyfile.xlines[1]]
# Read data along last iline
data = segyfile.iline[segyfile.ilines[-1]]
# Read data along 100th time slice
data = segyfile.depth_slice[100]
# Read data cube
data = segyio.tools.cube(filename)
# Print offsets
print(segyfile.offset)
# Read data along first iline and offset 100: data [nxl x nt]
data = segyfile.iline[0, 100]
# Read data along first iline and all offsets gath: data [noff x nxl x nt]
data = np.asarray([np.copy(x) for x in segyfile.iline[0:1, :]])
# Read data along first 5 ilines and all offsets gath: data [noff nil x nxl x nt]
data = np.asarray([np.copy(x) for x in segyfile.iline[0:5, :]])
# Read data along first xline and all offsets gath: data [noff x nil x nt]
data = np.asarray([np.copy(x) for x in segyfile.xline[0:1, :]])
5)访问非结构化的数据
震源排布如图:
检波器排布如图:
import segyio
import numpy as np
import matplotlib.pyplot as plt
import scipy.io
filename = "@@@@@@@@@@@"
### 访问非结构化数据
with segyio.open(filename, ignore_geometry=True) as segyfile:
segyfile.mmap()
# plt.figure()
# # Scatter plot sources and receivers color-coded on their number
# # Extract header word for all traces 震源坐标
# sourceX = segyfile.attributes(segyio.TraceField.SourceX)[:]
# sourceY = segyfile.attributes(segyio.TraceField.SourceY)[:]
# nsum = segyfile.attributes(segyio.TraceField.NSummedTraces)[:] # NSummedTraces 产生该道的垂直叠加道数
# plt.scatter(sourceX, sourceY, c=nsum, edgecolor='none')
#
# # 检波器组坐标
# groupX = segyfile.attributes(segyio.TraceField.GroupX)[:]
# groupY = segyfile.attributes(segyio.TraceField.GroupY)[:]
# nstack = segyfile.attributes(segyio.TraceField.NStackedTraces)[:] # NStackedTraces 产生该道的水平叠加道数
# plt.scatter(groupX, groupY, c=nstack, edgecolor='none')
# plt.show()
print("总地震道数量和时间采样点数")
print(segyfile.trace)
print("总地震道数量:")
print(segyfile.tracecount)
print("采样时间点数量:") # 默认时间间隔 0.1 ms
print(len(segyfile.samples))
print("每炮的地震道数量:")
print(segyfile.header[-1][segyio.TraceField.TraceNumber])
print("炮的数量:")
print(segyfile.tracecount / segyfile.header[-1][segyio.TraceField.TraceNumber])
data =[]
# 非结构化访问的唯一方式:segyfile.header[i]、segyfile.trace[i]
# for i in range(len(segyfile.trace)): # len(segyfile.trace)
for i in range(250, 391, 1): # len(segyfile.trace)
# 访问头信息和其中的元素
# print(segyfile.header[i])
# print(segyfile.header[i][segyio.TraceField.TraceNumber])
# 访问数据信息
data.append(segyfile.trace[i])
# print(segyfile.trace[i])
data = np.array(data).T
vlim = max(abs(np.max(data)), abs(np.min(data)))
plt.imshow(data, cmap=plt.cm.seismic, vmax=100, vmin=-105, aspect="auto")
plt.colorbar()
plt.show()