✍️ 朱邓达 , 田冬冬 • 📅 2025-07-10

# sample1d

官方文档:

  sample1d

简介:

  对 1D 表数据进行重采样

sample1d 从文件（或标准输入）读取一个多列的 ASCII 格式（或二进制）数据， 对时间序列或指定测线点位进行重采样。其中独立变量 （即单调递增或递减的变量，以下称之为 time ） 默认位于首列，用户可指定其他列作为独立变量。可以使用等距或其他指定采样。 所有列都将基于新的采样间隔重新采样。除平滑样条 （smoothing spline）方法外， 还可选择多种插值方法。其中，平滑样条通过在拟合误差和曲率之间进行权衡 （即不完全精确拟合数据点以换取更平滑的曲线）来实现平滑效果。 本模块不支持输入数据范围外做外推插值。通过使用 `-C` 指定 CPT， 本模块将基于输入数据最后一列做颜色插值，将 r,g,b,a 添加到输出。

## 语法

gmt sample1d [ table ] [ `-A`[f|p|m|r|R][+d][+l] ] [ `-C`[section/]master|cpt|color\(_1\),color\(_2\)[,color\(_3\),...][+h[hinge]][+i dz][+u|U unit][+s fname] ] [ `-E` ] [ `-F` a|c|e|l|n|s p[+d1|2] ] [ `-N` col ] [ `-T`[min/max/]inc[+a][+i|n][+u] | [`-T` file|list]] [ `-V`[level] ] [ `-W` col ] [ `-bi` binary ] [ `-bo` binary ] [ `-d` nodata[+c col] ] [ `-e` regexp ] [ `-f` flags ] [ `-g` gaps ] [ `-h` headers ] [ `-i` flags ] [ `-j` flags ] [ `-o` flags ] [ `-q` flags ] [ `-s` flags ] [ `-w` flags ] [ `-:`[i|o] ] [ --PAR=value ]

## 输入数据

table

  一个或多个ASCII或二进制表数据。若不提供表数据，则会从标准输入中读取。

## 可选选项

-A

-A[f|p|m|r|R][+l]

  关于沿测线进行采样（如果设置了 `-T`...unit ）的一些选项，在 `-A` 后追加：

  - f - 沿测线采样，保留原始点位，按需会适当插值线段中点（默认）。

  - m - 类似 f ，但测线变为阶梯状，先沿经度采样，再沿纬度采样。

  - p - 类似 f ，但测线变为阶梯状，先沿纬度采样，再沿经度采样。

  - r - 等距采样，此时输入的点位（尤其是端点）可能不会严格包括在输出结果中。

  - R - 类似 r ，但会适当调整采样点间距使输入点位都在输出结果中。

  还支持以下选项：

  - +d - 删除重复输入记录（即 time 没变化）。

  - +l - 使地理距离的测量沿着恒向线（rhumb lines 或 loxodromes ， 即沿着该方向行进时行进方向始终与经线保持相同夹角）而不是默认的大圆弧。 loxodromes的计算模式是在球面上，故 +l 不可与 -je 同时使用。

-C

-C[section/]master|cpt|color\(_1\),color\(_2\)[,color\(_3\),...][+h[hinge]][+i dz][+u|U unit][+s fname]

  基于 z 值确定颜色分量。通过指定主 CPT 名称，CPT 文件或用逗号分割的多个颜色， 以创建一个 CPT。如果不指定参数，则在现代模式下使用当前 CPT（如果可用）。 支持以下多种输入：

  1. 主 CPT 名称，例如 earth （详见 内置CPT ）， 可使用 CPT 名称 master 或包括相对路径的 section/master 来指定（内置 CPT 不可添加 .cpt 扩展名）。

  2. 自定义 CPT 文件 cpt ，例如 my_colors.cpt 。

  3. 自动从多个颜色 color\(_1\),color\(_2\)[,color\(_3\),...] 中创建线性连续的 CPT，其中 z 值从 0 开始， 每添加一种颜色 z 值加 1。在这种情况下， color\(_i\) 可以是 r/g/b (e.g. 255/100/75)， h-s-v (e.g. 180-0.8-1)， c/m/y/k (e.g. 80/50/40/30)，HTML十六进制 (e.g. #aabbcc) 或 颜色名称。逗号之间不能有空格。

  支持以下选项：

  - +h - 对于有软铰链 (soft hinge) 的主 CPT，可指定 hinge 值启用铰链， 而对于有硬铰链 (harde hinge) 的 CPT，可以修改铰链位置 hinge ，但不能禁用。

  - +i - 指定 dz 使网格 z 值范围分层，默认使用精确范围。

  - +s - 将创建的 CPT 保存到文件 fname。当 CPT 是自动创建时这很有用， 但必须用于 `-C` 的末尾。

  - +u - 对于任何其他主 CPT，可以通过指定其原始单位 unit 将其 z 值单位转换为米。

  - +U - 与 +u 类似，但是将 z 值单位从米转换为指定单位 unit 。

  注： 我们将在原始输出后新增四列，分别为 red、green 和 blue 的颜色分量 （均在 0-255 范围内）以及透明度（0-100%，0 表示不透明）。如果颜色表为灰度表， 则输出灰度（0-255）而非三原色。

-E

-E

  如果输入数据中每行记录最后包含有文本列，输出的插值结果将尝试保留 time 精确匹配的记录对应的文本列，其它 time 不匹配的则没有文本。默认忽略文本列。

-F

-F a|c|e|l|n|s p[+d1|2]

  选择 1-D 插值方式:

  - a - Akima 样条（默认）

  - e - 阶梯曲线

  - c - 自然三次样条 (Natural cubic spline)

  - l - 线性插值

  - n - 不插值，取最近的数据点作为插值后的值

  - s - 平滑三次样条，指定拟合因子 p 以权衡样条拟合和曲率

  用户也可以更改 GMT 默认的插值方式，见 GMT_INTERPOLANT 。 可以加上 +d1 或 +d2 来计算样条的一阶导或二阶导。 注： 如果使用 e 或 n 的插值方法来计算导数，则结果恒为 0。

`-F` 选项允许您在多个插值方法中选择，包括一个近似方法（平滑样条）。 你也可以指定选项来计算导数。

-N

-N col

  选择独立变量 time 的列索引 col ，默认为 0（即首列）。

-T

-T[min/max/]inc[+a][+i|n][+u] | [-T file|list]

  定义要等距采样的 time 范围（从 min 到 max ）和步长 inc （默认使用输入的 time 值）。用法 `-T` list 表示指定一系列 time 值， 例如 `-T` 13,15,16,22.5 。具体详见 生成一维数组 。 若不使用 `-A` ，默认为 `-A` f 。

  注： 对于空间 (x, y) 或 (lon, lat) 序列的重新采样， 用户必须使用有效的距离单位给出步长，例如 `-T` 20k 。 关于单位见 距离单位 ，笛卡尔坐标则用单位 c 做距离单位。 此时前两列必须为空间坐标，GMT 将基于前两列空间坐标以及指定的步长沿大圆路径插值。

-V

-V[level]

  设置 verbose 等级 [w]。 (参数详细介绍)

-W

-W col

  指定列索引值为 col 的列作为平滑三次样条的权重， 要求使用 -Fs 。

-bi

-bi[ncols][type][w][+l|b]

  控制二进制文件的输入格式。 (参数详细介绍)

-bo

-bo[ncols][type][w][+l|b]

  控制二进制文件的输出格式。 (参数详细介绍)

-d

-d[i|o]nodata

  将某些特定值当作 NaN。 (参数详细介绍)

-e

-e[~]"pattern" | -e[~]/regexp/[i]

  筛选或剔除匹配指定模式的数据记录。 (参数详细介绍)

-f

-f[i|o]colinfo

  显式指定当前输入或输出数据中每一列的数据类型。 (参数详细介绍)

-g

-g[a]x|y|d|X|Y|D|[col]z gap[+n|p]

  确定数据或线段的间断。 (参数详细介绍)

-h

-h[i|o][n][+c][+d][+m segheader][+r remark][+t title]

  在读/写数据时跳过文件开头的若干个记录。 (参数详细介绍)

-i

-i cols[+l][+s scale][+o offset][,...][,t[word]]

  对输入的数据进行列选择以及简单的代数运算。 (参数详细介绍)

-j

-je|f|g

  设置球面距离的计算方式。 (参数详细介绍)

-o

-o cols[,...][,t[word]]

  对输出的数据进行列选择以及简单的代数运算。 (参数详细介绍)

-q

-q[i|o][~]rows[+c col][+a|f|s]

  对输入或输出的行进行筛选，该选项在一定程度上可以代替 gawk 的某些功能。 (参数详细介绍)

-s

-s[cols][+a|+r]

  设置 NaN 记录的处理方式。 (参数详细介绍)

-w

-wy|a|w|d|h|m|s|c period[/phase][+c col]

  将输入坐标转换为循环坐标。 (参数详细介绍)

-:

-:[i|o]

  交换输入或输出数据的前两列。 (参数详细介绍)

-^ 或 -

  显示简短的帮助信息，包括模块简介和基本语法信息（Windows下只能使用 -）

-+ 或 +

  显示帮助信息，包括模块简介、基本语法以及模块特有选项的说明

-? 或无参数

  显示完整的帮助信息，包括模块简介、基本语法以及所有选项的说明

--PAR=value

  临时修改GMT参数的值，可重复多次使用。参数列表见 配置参数

## 距离单位

GMT支持多种不同的距离单位，以及三种不同的球面距离计算方式。 详情见 单位 和 -j 选项。

## ASCII 格式精度

ASCII 格式输出数据通过 gmt.conf 配置文件控制。控制经纬度格式的参数为 FORMAT_GEO_OUT ；控制绝对时间的的参数包括 FORMAT_DATE_OUT 和 FORMAT_CLOCK_OUT ；普通浮点数通过参数 FORMAT_FLOAT_OUT 控制。上述格式控制可能会导致精度损失，这会在下游计算中导致一些问题。 如果用户需要保证数据精度，则应考虑将数据写为二进制文件，或者使用 FORMAT_FLOAT_OUT 指定更多的有效数字。

## 注意

平滑样条 \(s(t)\) 通过设置拟合因子 \(p\) 在最小化拟合误差 （完全拟合所有点，对应 \(p\) 很大）和最小化曲率（ \(p\) 接近 0）之间进行权衡。 具体而言，我们想要最小化以下泛函

\[F_p (s)= K (s) + p E (s), \quad p > 0,\]

其中拟合误差定义为

\[E (s)= \sum^n_{i=1} \left [ \frac{s(t_i) - y_i}{\sigma_i} \right ]^2\]

而曲率定义为样条的二阶导数的在区间上的定积分，

\[K (s) = \int ^b _a [s''(t) ]^2 dt.\]

可能需要反复试验来选择合适的 \(p\) 。

## 示例

注: 下面是该模块的一些有效语法示例。使用远程文件（文件名以 `@` 开头）的示例可以剪切并粘贴到您的终端中进行测试。其他需要输入文件的命令只是常见的使用类型的虚拟示例，但不能按编写的原样运行。

使用 Akima 样条以 1 km 为间隔重采样文件 profiles.tdgmb，文件格式为: time, distance, gravity, magnetics, bathymetry

    gmt sample1d profiles.tdgmb -N1 -Fa -T1 > profiles_equi_d.tdgmb

使用三次样条插值，在 grav_pos.dg 指定的点位上采样文件 depths.txt

    gmt sample1d depths.txt -Tgrav_pos.dg -Fc > new_depths.txt

将 0 到 6 之间的数据以 0.01 为间隔用三次样条重采样，不输出数据而是输出一阶偏导（即斜率）:

    gmt sample1d points.txt -T0/6/0.01 -Fc+d1 > slopes.txt

测线数据中包含经度、纬度和深度，将其采样为每 2 海里一个点:

    gmt sample1d track.txt -T2n -AR > new_track.txt

同上，但确保包含了原始数据点:

    gmt sample1d track.txt -T2n -Af > new_track.txt

以 5 km 为间隔，沿着恒向线采样

    gmt sample1d track.txt -T5k -AR+l > new_track.txt

在文件 temperatures.txt 中采样 2000 年到 2018 年每月温度:

    gmt sample1d temperatures.txt -T2000T/2018T/1o > monthly_temp.txt

在地形剖面上给定拟合因子使用平滑样条插值:

    gmt sample1d @topo_crossection.txt -T300/500/0.1 -Fs0.001 > smooth.txt

## 相关模块

greenspline, filter1d