✍️ 田冬冬 , 周茂 , 朱邓达 • 📅 2026-01-06

# nearneighbor

官方文档:

  nearneighbor

简介:

  使用最邻近算法网格化表数据

nearneighbor 读取 (x,y,z[,w]) 形式的数据，并使用最邻近算法计算网格点的加权平均值。 计算原理为

\[w(r_i) = \frac{w_i}{1 + d(r_i) ^ 2}, \quad d(r) = \frac {3r}{R}, \quad \bar{z} = \frac{\sum_i^n w(r_i) z_i}{\sum_i^n w(r_i)}\]

其中 n 为满足筛选标准的数据点数，\(r_i\) 为网格点到第 i 个数据点的距离，如果不给定 输入点的权重，则假定其为等权，即 \(w_i = 1\)

`Source Code`

算法示意图。R 为搜索半径，其限制了考虑的点和扇区的数量，只有每个扇区中最近的点（红色点）参与估计

## 语法

gmt nearneighbor [ table ] `-G` outgrid `-I` increment `-R` region `-S` search_radius[unit] [ `-E` empty ] [ `-N` sectors[+m min_sectors]|n ] [ `-V`[level] ] [ `-W` ] [ `-a` flags ] [ `-bi` binary ] [ `-di` nodata[+c col] ] [ `-e` regexp ] [ `-f` flags ] [ `-h` headers ] [ `-i` flags ] [ `-n` flags ] [ `-qi` flags ] [ `-r` reg ] [ `-w` flags ] [ `-:`[i|o] ] [ --PAR=value ]

## 输入数据

table

  输入表数据，包含三列或四列 (x,y,z[,w]) 形式的数据（见 `-W` 选项）

## 必须选项

-G

-G outgrid[=ID][+d divisor][+n invalid][+o offset|a][+s scale|a][:driver[dataType][+c options]]

> 输出网格文件名。通过追加 =ID 可指定 网格格式。 参数详细介绍请参考 写 netCDF 文件。

-I

-I xinc[+e|n][/yinc[+e|n]]

  指定X和Y方向的网格间隔

  - xinc 和 yinc 为 X 和 Y 方向的网格间隔。对于地理坐标，可以指定网格间隔单位 [默认单位为度]

  - +e 微调X和Y方向范围的最大值，使得其是网格间隔的整数倍（默认会微调 网格间隔以适应给定的数据范围）

  - +n 表明 xinc 和 yinc 不是网格间隔，而是X和Y方向的节点数。 此时会根据节点数、网格区域范围以及网格配准方式重新计算网格间隔。

  注意：

  - 若 yinc 设置为0，则表示其与 xinc 相同

  - 若使用 -R grdfile 选项，则网格间隔和配准方式已经根据网格文件自动初始化， 此时依然可以使用 -I 和 -r 覆盖相应的值

-R

-R xmin/xmax/ymin/ymax[+r][+u unit]

  指定数据范围。 (参数详细介绍)

-S

-S search_radius[unit]

  设置搜索半径 search_radius ，即上图中的 R，可在后面追加单位

## 可选选项

-E

-E empty

  指定空节点的值为 empty ，默认为 NaN

-N

-N sectors[+m min_sectors]|n

  以每个网格节点为中心可以将圆形的搜索区域划分为扇区 sectors 。+m 选项 用来设置最少搜索的扇区 min_sectors ，即至少 min_sectors 个扇区至少含有 一个数据时，才计算最终的加权值；未通过此测试的节点值被设置为 NaN，见 `-E` 。 如果不设置该选项，GMT 至少设置 50% 的扇区来计算加权值，默认情况下， sectos = min_sectors = 4。每个扇区最接近的值才会被用来计算加权值，远处的点 则被忽略。使用 -Nn 可以调用 GDAL 的最邻近算法，而不是用 GMT 的该算法。

-W

-W

  表明输入数据的第四列为权重，该权重与距离权重因子相乘即为最终权重

-V

-V[level]

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

-a

-a[[col=]name][,...]

  控制输入或输出为 OGR/GMT 格式时对非空间元数据的处理方式。 (参数详细介绍)

-bi

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

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

-di

-di 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]]

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

-n

-n[b|c|l|n][+a][+b BC][+c][+t threshold]

  设置网格文件的插值方式。 (参数详细介绍)

-qi

-qi[~]rows[+c col][+a|f|s]

  筛选输入的行或数据范围。 (参数详细介绍)

-r

-r[g|p]

  设置网格配置方式 [默认为网格线配准]。 (参数详细介绍)

-w

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

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

-:

-:[i|o]

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

-^ 或 -

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

-+ 或 +

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

-? 或无参数

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

--PAR=value

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

## 距离单位

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

## 网格值精度

不管输入数据的精度如何，创建网格文件的 GMT 程序将在内部以 4 字节浮点数组的形式保存网格。 这样做是为了节省内存，而且大多数实际数据都可以使用 4 字节浮点值存储。 具有更高精度的数据（即双精度值）将在 GMT 操作网格或写入新网格时失去该精度。 为了限制处理数据时的精度损失，用户应该始终考虑在处理之前对数据进行归一化。

## 示例

将文件 `ship_15.txt` 格网化成 5 分分辨率的网格，搜索半径设置为 15 分，绘制最终 的网格

    gmt begin map
        gmt nearneighbor @ship_15.txt -R245/255/20/30 -I5m -Ggrid.nc -S15m
        gmt grdimage grid.nc -B
    gmt end show

使用 `seaMARCII_bathy.lon_lat_z` 文件创建 0.5 分分辨率的网格，设置搜索半径为 5 km， 将搜索圆范围分为八个扇区，每个扇区必须有数据，并将最终的空节点设置为 -9999

    gmt nearneighbor seaMARCII_bathy.lon_lat_z -R242/244/-22/-20 -I0.5m -E-9999 -Gbathymetry.nc -S5k -N8+m8

使用 `geoid.xyz` 数据创建全球 1 度分辨率的网格，搜索半径为 200 km，距离计算使用 球面距离，将搜索范围分为4个扇区，至少 2 个扇区包含数据时计算加权值

    gmt nearneighbor geoid.xyz -R0/360/-90/90 -I1 -Ggeoid.nc -S200k -N4

## 相关模块

blockmean, blockmedian, blockmode, greenspline, sphtriangulate, surface, triangulate