:author: 田冬冬
:date: 2025-12-31

.. index:: ! grdblend
.. program:: grdblend

grdblend
========

:官方文档: :doc:`gmt:grdblend`
:简介: 将多个部分重叠的网格文件合并成一个网格文件

**grdblend** 读取网格文件列表和合并参数文件，并通过使用余弦锥度权重合并多个网格文件来创建一个二进制网格文件。

合并过程中会遇到如下几种情况：

- 某个节点只有一个值：使用该值填充该节点
- 某个节点有多个值：设置为加权平均值
- 某个节点没有值：该节点的值由 :option:`-di` 选项控制，默认为NaN

输入网格数据中，若网格节点配准方式或网格间隔与输出数据不同，则会自动调用
:doc:`grdsample` 对这些网格数据进行重采样。

**注意**：由于 **grdblend** 操作的逐行 I/O 特性，输入和输出均仅支持 netCDF 和原生二进制网格格式。

语法
----

**gmt grdblend**
*blendfile* \| *grid1* *grid2* ...
:option:`-G`\ *outgrid*
:option:`-I`\ *increment*
:option:`-R`\ *region*
[ :option:`-C`\ **f**\|\ **l**\|\ **o**\|\ **u**\ [**+n**\|\ **p**] ]
[ :option:`-Q` ]
[ :option:`-Z`\ *scale* ]
[ :option:`-V`\ [*level*] ]
[ :option:`-W`\ [**z**] ]
[ :option:`-di`\ *nodata*\ [**+c**\ *col*] ]
[ :option:`-f`\ *flags* ]
[ :option:`-n`\ *flags* ]
[ :option:`-r`\ *reg* ]
[ :doc:`--PAR=value </conf/overview>` ]

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

*blendfile* \| *grid1* *grid2* ...
    合并参数文件 *blendfile* 或列出要合并的网格文件 *grid1* *grid2* ...

    合并参数文件中包含了要合并的网格文件的文件名列表，其格式为::

        网格文件名（必须）  -R选项（可选）  相对权重（可选）

    - 在考虑权重的情况下，:option:`-R` 范围外的部分会给零权重，:option:`-R` 范围内的部分
      则会使用指定的相对权重，在边界处会加上2D余弦taper权重。
    - 若相对权重为负值，则整个反过来，即范围内的会给零权重，范围外的会给权重的绝对值。
    - :option:`-R` 选项可以取值 **-**，此时会直接使用该网格文件的数据范围。
    - 若未指定权重，则默认权重为1
    - 也可以不指定 *blendfile* 而只将所有网格文件名列在命令行中，此时会
      使用网格数据的真实范围，且所有网格文件的权重都是1

必须选项
--------

.. option:: -G

**-G**\ *outgrid*
    输出的网格文件名

.. include:: explain_-I.rst_

.. include:: explain_-R.rst_

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

.. option:: -C

**-C**\ **f**\|\ **l**\|\ **o**\|\ **u**\ [**+n**\|\ **p**]
    合并网格文件时，若多个网格出现重叠，则忽略权重并按照下面的规则设置重叠区域的值：

    - **-Cf** 将第一个访问该节点的网格数据作为该节点的值
    - **-Co** 将最后一个访问该节点的网格数据作为该节点的值
    - **-Cl** 将所有网格文件在该节点的值的最小值作为该节点的值
    - **-Cu** 将所有网格文件在该节点的值的最大值作为该节点的值

    对于 **-Cf** 和 **-Co** 而言，网格文件的顺序决定了这些节点的值。在这种模式下，
    权重和余弦tapering会被忽略。

    使用 **+n** 或 **+p** 则首先将网格节点值初始化为第一个网格文件的值，
    对于接下来的其它网格文件，仅当其值小于等于0或大于等于0时才考虑是否更新该节点的值。

.. option:: -Q

**-Q**
    创建一个无头段的二进制网格文件（非netCDF格式）以供其它程序使用

.. include:: explain_-V.rst_

.. option:: -W

**-W**\ [**z**]
    不合并数据，仅输出每个节点所使用的权重。

    **-Wz** 表示输出 Z 值乘以权重的和。

.. option:: -Z

**-Z**\ *scale*
    在输出前先将数据乘以比例因子 *scale*，默认值为 1

.. include:: explain_-di.rst_
..

    将无数据的节点的值设置为 *nodata*，默认值为NaN

.. include:: explain_-f.rst_

.. include:: explain_-n.rst_

.. include:: explain_nodereg.rst_

.. include:: explain_help.rst_

.. include:: explain_grd_coord.rst_

锥度处理
------------

虽然计算得到的权重从 1 逐渐减小到 0，但由于计算的是加权平均值，因此如果仅提供了一个网格，则加权输出将与输入完全相同。
如果想对数据网格进行锥度处理，请参阅 :doc:`grdmath` 的 TAPER 算子。

示例
----

假设要合并几个网格文件，则可以设置合并参数文件 *blend.job* 的内容为::

    piece_1.nc -R0/30/-90/90 1
    piece_2.nc -R25/50/-90/90 1.5
    piece_3.nc -R45/80/-90/90 0.9
    piece_4.nc -R80/160/-90/90 1

执行如下命令即可实现数据合并::

    gmt grdblend blend.job -Gblend.nc -R0/160/-90/90 -I1m/1m -V

将所有网格文件 MB_*.nc 以相同权重合并::

    gmt grdblend MB_*.nc -Gblend.nc -R0/360/-90/90 -I1m/1m -V

关于文件数量过多情况下的警告
-----------------------------------------------------

虽然 **grdblend** 可以处理任意数量的文件，但其工作原理是保持正在进行合并的文件处于打开状态，并在处理完成后立即将其关闭。
根据会话情况，可能会有许多文件同时处于打开状态。某些操作系统对同时打开的并发文件数量设置了相当有限的默认限制（例如 256 个）。
如果遇到此问题，可以更改此限制。请参阅操作系统文档以了解如何更改系统限制。

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

:doc:`grd2xyz`,
:doc:`grdconvert`,
:doc:`grdedit`,
:doc:`grdsample`
