Python地震数据可视化实战:环境配置与常见报错排查
本文详解使用Python进行地震数据可视化的完整流程。涵盖Windows10下Python3.7环境搭建、obspy等依赖包安装及代理配置,深入分析config.yml编码异常(GBK与UTF-8冲突)的解决方法。针对本地SEGY数据绘图时出现的采样值溢出、卷头乱码及道头参数不规范等问题,提供了归一化处理、重写3200字节卷头及规范cdpt取值的具体解决方案,并对比了Cygwin与CMD终端的使用体验。
Python地震数据可视化环境搭建
本文分享一套基于Python的地震数据可视化实现方案,包含具体代码与操作细节,供读者参考学习。
本示例参考的源代码项目名为seisplot。
在开始之前,需完成以下准备工作:
建议在Windows10操作系统下安装Python3.7环境,并将参考源码下载至本地目录。
首先进行Demo绘图测试,以验证环境是否配置正确。
执行Demo绘图的具体指令如下。
在命令行中运行:cmd> python seisplot.py --demo
依赖安装与代理配置
测试过程中可能遇到第一个问题:缺少必要的依赖包。
File "D:/Desktop/python可视化/seisplot/seisplot.py", line 16, in <module>
import yaml
ModuleNotFoundError: No module named 'yaml'
>pip3 install yaml
Could not find a version that satisfies the requirement yaml (from versions: )
No matching distribution found for yaml
可通过查看项目中的environment.yml文件来确认所需依赖。
channels:
- defaults
- conda-forge
dependencies:
- matplotlib
- numpy
- obspy
- pillow
- pyyaml
需手动安装相关依赖包,例如obspy、pillow和pyyaml。
执行安装命令:cmd> pip3 install obspy
若遇到proxy error(代理错误),需添加--proxy server:port选项指定代理服务器地址和端口。
依赖包安装成功后,继续后续步骤。
配置文件编码异常排查
第二个常见问题是配置文件的编码异常。
D:\Desktop\python可视化\seisplot>python seisplot.py --demo
[91m
Welcome to
┌─┐┌─┐┬┌─┐┌─┐┬ ┌─┐┌┬┐
└─┐├┤ │└─┐├─┘│ │ │ │
└─┘└─┘┴└─┘┴ ┴─┘└─┘ ┴
Good luck[0m
Traceback (most recent call last):
File "seisplot.py", line 421, in <module>
cfg = yaml.load(f)
File "D:\ProgramFiles\Python36\lib\site-packages\yaml\__init__.py", line 70, in load
loader = Loader(stream)
File "D:\ProgramFiles\Python36\lib\site-packages\yaml\loader.py", line 34, in __init__
Reader.__init__(self, stream)
File "D:\ProgramFiles\Python36\lib\site-packages\yaml\reader.py", line 85, in __init__
self.determine_encoding()
File "D:\ProgramFiles\Python36\lib\site-packages\yaml\reader.py", line 124, in determine_encoding
self.update_raw()
File "D:\ProgramFiles\Python36\lib\site-packages\yaml\reader.py", line 178, in update_raw
data = self.stream.read(size)
UnicodeDecodeError: 'gbk' codec can't decode byte 0x99 in position 2003: illegal multibyte sequence
需要分析源码中参数传递的具体情况,特别是文件读取时的编码设置。
def load(stream, Loader=Loader):
"""
Parse the first YAML document in a stream
and produce the corresponding Python object.
"""
print(stream) ## debug by huanying03
loader = Loader(stream)
try:
return loader.get_single_data()
finally:
loader.dispose()
打印调试结果如下所示。
<_io.TextIOWrapper name='config.yml' mode='r' encoding='cp936'>
若发现编码不匹配,需检查系统代码页设置。
代码页65001代表UTF-8编码。
代码页936代表Windows默认的GBK编码。
代码页437代表美国英语编码。
仔细检查发现config.yml文件中存在异常字符,修正该文件中的错误字符后,问题得以解决。
第三个注意事项涉及Python调试打印语句的使用。
可使用print ("value=%d"%value)格式输出变量值。
完成上述步骤后,观察Demo数据的绘图结果。
具体效果如下所示。

本地SEGY数据绘图与异常处理
接下来进行本地实际数据的绘图测试。
应用本地数据绘图的具体指令如下。
在命令行中运行:cmd > python seisplot.py data/my.sgy
处理本地数据时,可能遇到第一个问题:数据道的采样值出现异常。
filename data2/t10.sgy
seismic.py:104:dt=4000
seismic.py:104:ns=512
seismic.py:144:header=b'C 1 CLIENT'
n_traces 500
n_samples 512
dt 0.004
t_start 0
t_end 2.044
max_val inf
min_val -inf
clip_val 180462501764003194804057887685476352
Read data in 0.4 s
++++++++++++++++++++++++++++++++++++++++++++++++++++++++
PLOTTING
plot width 17.00 in
plot height 11.00 in
Traceback (most recent call last):
File "seisplot.py", line 442, in <module>
main(t, cfg)
File "seisplot.py", line 214, in main
cfg)
File "D:\Desktop\python可视化\seisplot\plotter.py", line 123, in plot_histogram
y, x, _ = ax.hist(np.ravel(data), bins=int(100.0 / (clip_val / largest)),
OverflowError: cannot convert float infinity to integer
解决办法是对数据进行归一化处理,以消除数值范围过大导致的显示问题。
可能遇到的第二个问题是数据文件的卷头信息异常。
filename data2/marmousi_vel.segy.hdrs.sgy.cdp.sgy
seismic.py:104:dt=10000
seismic.py:104:ns=350
seismic.py:144:header=b'\xc3@\xf1@\xc3\xd3\xc9\xc5\xd5\xe3'
Traceback (most recent call last):
File "seisplot.py", line 442, in <module>
main(t, cfg)
File "seisplot.py", line 40, in main
s = Seismic.from_segy(target, params={'ndim': cfg['ndim']})
File "D:\Desktop\python可视化\seisplot\seismic.py", line 164, in from_segy
return cls.from_obspy(stream, params=params)
File "D:\Desktop\python可视化\seisplot\seismic.py", line 147, in from_obspy
x =np.array(list(stream.textual_file_header.decode()))
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc3 in position 0: invalid continuation byte
解决办法是重写3200字节的SEGY标准卷头,确保格式符合规范。
以下展示Marmousi相关数据的绘图示例。
速度模型的绘图结果如下所示。

Marmousi模型正演生成的炮集数据绘图结果如下所示。

测试工具与数据预处理建议
以下是测试过程中的备忘记录。
1
使用Cygwin执行指令时,反馈信息显示为彩色,便于分析各类信息。
相比之下,使用CMD终端执行指令后的反馈信息可读性较差,建议使用Cygwin提升体验。
2
当本地数据出现异常时,可通过CWP工具集中的segyread、sushw、sugain、segywrite等程序进行修改,使其满足绘图程序的要求。
具体注意事项包括:1)3200字节的卷头必须严格规范。
2)道头字中的cdpt取值(对应xline)必须规范。
3)道采样值最好进行归一化处理,以避免溢出错误。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









