三维数据体生成与切片
文章目录
我们在计算得到的数据通常是非等间隔网格,为了用GMT进行2D可视化,需要将数据网格化后进行插值。
1. 将文本文件转换为三维数据体
我们拿到的原始文件是包含经度、纬度、深度、和每个数据点的数据(速度、温度、密度等)组成的文本格式文件,以这次的数据为例,我将Excel文件直接复制到文本中形成了以空格为分隔符的文本文件,以下列出部分行:
|
|
网格化说明
由于这样的数据点是非等间隔的,没有办法进行切片时所需要的插值操作,所以我先将数据进行了三维网格化。这里我选用了Python语言和它的科学计算模块Numpy、Scipy进行网格化。Matlab也可以实现类似功能,核心函数也叫griddata
。
|
|
2. 平面和剖面的切片
用GMT绘制二维图像需要从上一步网格好的数据文件中对某个平面或剖面进行切片。对平面的切片简单一些,对剖面的切片则需要先对大圆弧路径进行插值,生成数据点坐标,再用这些坐标对三维数据体进行插值。
2.1 对数据的平面切片 (cut_plane.py
)
|
|
那么这时输出的数据包括了4列,依次为经度,纬度,南北方向的速度和东西方向的速度。
2.2 对数据的剖面切片 (cut_sec.py
)
虽热都是对数据体的切片,但是剖面的切片要更复杂一些。主要的难点是:
- 对大圆弧路径的等距离划分。其中要考虑球面三角函数和椭球矫正(有现成代码)。但是这里为了方便直接调用了GMT里的
project
命令,直接生成横向网格,更加方便。 - 对原先的南北和东西分量进行坐标旋转,旋转角度是剖面两个端点之间的方位角(请参考IRIS 的一个教程)。
那么先导入函数库
|
|
生成数据点
以下是生成据点的函数。需要说明的是gmt project
是GMT内一个用于投影点的命令,这里直接在Python中调用了,这条命令的具体说明请参考GMT中文手册。所以如果系统中没有GMT,就只能尝试用别的方法了。
|
|
对矢量数据进行坐标系旋转
大部分都是标准公式。需要一提的是distaz
来自seispy_distaz.py
,一个在原版distaz
基础上改进过的版本,说不定以后做其他处理还能用的上。
|
|
数据插值
插值和平面切片是类似的。只有以下几点不同:
- 速度为坐标系转化后的速度。
- 需要对垂直方向速度,温度和密度等进行插值。
|
|
这个脚本中一些其他小技巧
由于剖面不止一条,所以我按照我在地震学上的处理方式做了一个剖面列表,给每个剖面编上序号,切剖面和画剖面时只需要改动剖面编号。剖面列表lines.lst
内容如下:
|
|
最后最好空一行,否则有的语言读取可能会有bug。
所以在剖面切片的脚本中就加入了输入剖面编号,剖面切片的功能。以下是输入编号输出对应剖面经纬度的函数:
|
|
文章作者 Mijian Xu
上次更新 2020-01-11