:author: 周茂, 田冬冬, 陈箫翰
:date: 2026-01-12

.. index:: ! split
.. program:: split

split
========

:官方文档: :doc:`gmt:gmtsplit`
:简介: 将表数据拆分成单独的段

**split** 从标准输入 [或 *xy[z][dh]file*] 读取一系列 (*x, y* [*, z*]) 记录 [或者可选的 (*x, y* [, *z*], *d, h*)；参见 :option:`-S` 选项]，
并将其拆分为独立的 (*x, y* [, *z*]) 系列列表，使得每个系列在 *x-y* 平面上具有几乎恒定的方位角。
该模块提供了多种选项：可以仅选择具有特定方向的系列，可以为系列设定最小长度，还可以对 *z* 值和/或 *x, y* 值进行高通或低通滤波。
**split** 是数据提取与 :doc:`wiggle` 绘图之间非常有用的过滤器，也可用于将大型 *x, y* [, *z*] 数据集划分为若干分段。

语法
----

**gmt split**
[ *table* ]
[ :option:`-A`\ *azimuth*/*tolerance* ]
[ :option:`-C`\ *course_change*]
[ :option:`-D`\ *minimum_distance* ]
[ :option:`-F`\ *xy\_filter*/*z\_filter* ]
[ :option:`-N`\ *template* ]
[ :option:`-Q`\ *flags* ]
[ :option:`-S` ]
[ :option:`-V`\ [*level*] ]
[ :option:`-bi`\ *binary* ]
[ :option:`-bo`\ *binary* ]
[ :option:`-d`\ *nodata*\ [**+c**\ *col*] ]
[ :option:`-e`\ *regexp* ]
[ :option:`-f`\ *flags* ]
[ :option:`-g`\ *gaps* ]
[ :option:`-h`\ *headers* ]
[ :option:`-i`\ *flags* ]
[ :option:`-q`\ *flags* ]
[ :option:`-s`\ *flags* ]
[ :option:`-:`\ [**i**\|\ **o**] ]
[ :doc:`--PAR=value </conf/overview>` ]

输入数据
--------

*table*
    输入表文件，可以为 2 列，3 列或者 5 列，数据值为 (x,y,[z[,d,h]])。
    默认情况下认为输入只包含 3 列，若输入数据为 5 列，使用 :option:`-S` 选项确保 d
    不是递减的

可选选项
--------

.. option:: -A

**-A**\ *azimuth*/*tolerance*
    计算方位角，只输出和方位角 *azimuth* 相差小于 *tolerance* 的段

.. option:: -C

**-C**\ *course\_change*
    当检测到航向发生变化且超过 *course\_change* 时，结束该航段

.. option:: -D

**-D**\ *minimum\_distance*
    输出总长度大于 *minimum\_distance* 的段，默认值为 0

.. option:: -F

**-F**\ *xy\_filter*/*z\_filter*
    对数据进行滤波，假定数据为 d 列（x 的增量）的函数。*xy\_filter* 和 *z\_filter*
    分别为 x，y 值和 z 值的滤波的长度，单位和距离单位相同（见 :option:`-S` ）。如果长度
    为 0 ，即不进行滤波。滤波长度的绝对值的是余弦滤波总的窗口宽度，如果长度为
    正值，则数据为低通滤波，如果为负值，则为高通滤波。如果 *z\_filter* 不为 0，则
    在拆分之前对数据滤波，因此边缘效应只会发生在整体数据的开始和结尾处，在每段数据
    的头尾则不会有。如果 *xy\_filter* 不为 0，数据将先被拆分，然后对每段的 x 和 y
    值滤波，即在每段首尾都可能存在边缘效应，但是可以避免低通滤波将测线拐弯处舍入。

.. option:: -N

**-N**\ *template*
    将拆分后的每段都单独输出到文件 [默认在一个文件输出所有段]。可以追加一个格式化
    的文件模版，必须使用 C 语言格式的语法，例如 %d 表示整数，%08d 表示宽度为 8 的
    整数，位数不够则在前面补 0 [默认模版为 gmtsplit_segment_%d.{txt|bin}，后缀与
    输出文件格式有关]。或者给出一个带有两个 C 语言格式的模版，使用表数据的编号和
    段号生成文件名。

.. option:: -Q

**-Q**\ *flags*
    设置输出列包含 *xyzdh* 中的哪些列以及其顺序，中间不需要使用空格，且必须使用小写
    字母，默认为 :option:`-Q`\ *xyzdh* ；如果输入只包含两列，则为 :option:`-Q`\ *xydh* 。

.. option:: -S

**-S**
    支持包含 d 和 h 的列，这时输入数据为 x,y,z,d,h。其中 d 和 h 分别表示 x 的增量和
    y 的增量。使用 :option:`-f`\ **g** 时，数据为地理坐标，x 和 y 的坐标单位为度，增量的单位均
    为 km，角度为方位角。若为笛卡尔坐标，距离的单位和 x 以及 y 相同，角度从水平方向
    开始顺时针计算。

.. include:: explain_-V.rst_

.. include:: explain_-bi.rst_
..

    默认输入列为 2、3 或 5 列，由 :option:`-S` 选项设置。

.. include:: explain_-bo.rst_
..

    默认输出为 1-5 列，由 :option:`-Q` 选项设置。

.. include:: explain_-d.rst_

.. include:: explain_-e.rst_

.. include:: explain_-f.rst_

.. include:: explain_-g.rst_
..

    不要让单个分段中存在超过 *gap* 的间隙；一旦检测到，则将其拆分为两个分段 [默认忽略间隙]。

.. include:: explain_-h.rst_

.. include:: explain_-icols.rst_

.. include:: explain_-q.rst_

.. include:: explain_-s.rst_

.. include:: explain_colon.rst_

.. include:: explain_help.rst_

.. include:: explain_precision.rst_

距离计算
---------

输入数据的类型由 :option:`-f` 选项决定。如果给定了 :option:`-f`\ **g** ，则 *x, y* 以经度、纬度度数表示，距离单位为千米，角度为方位角。
否则，距离为与 *x, y* 单位相同的笛卡尔距离，且角度是从水平方向起逆时针旋转的角度。

示例
----

使用 NCEI 提供的 JA020015 航次中 -R300/315/12/20 范围内东西方向的测线绘制磁异常的
:doc:`wiggle` 图，并对测线进行 100 km 的低通滤波和 500 km 的高通滤波 ::

    gmt mgd77list JA020015 -R300/315/12/20 -Flon,lat,mag,dist,azim |\
        gmt split -A90/15 -F100/-500 -D100 -S -V -fg |\
        gmt wiggle -R300/315/12/20 -Jm0.6i -Baf -B+tJA020015 -T1 \
        -W0.75p -Ggray -Z200 -pdf JA020015_wiggles

原始测量数据为 MGD77 格式，因此建议使用 :doc:`mgd77list`
模块提取 dist 和 azim 而不是使用 **split** 计算。

将一个包含经纬度以及重力观测值的二进制双精度文件，拆分为 survey_xxxx.txt 形式的一系列
文件，拆分原则为间隙大于 100 km ::

    gmt split survey.bin -Nsurvey_%03d.txt -V -gd100k -D100 -: -fg -bi3d

相关模块
--------

:doc:`filter1d`,
:doc:`mgd77list`,
:doc:`wiggle`
