✍️ 田冬冬 , 陈箫翰 • 📅 2025-12-31

# fitcircle

官方文档:

  fitcircle

简介:

  拟合球面上数据点的平均位置及圆弧

fitcircle 从标准输入 [或 table] 的前两列读取 (经度, 纬度) 值。这些值被转换为单位球上的笛卡尔三维矢量。 然后找到两个位置：输入位置的平均值，以及最拟合输入位置的大圆的极点。用户可以从该问题的两个可能解中选择一个或两个。 第一个称为 -L1，第二个称为 -L2。当数据沿大圆紧密聚集时，两个解相似。 如果数据分散程度较大，则大圆极点的确定将不如平均值那样准确。比较这两个解可作为定性检查。

-L1 解近似于角距离余弦绝对值之和的最小化。 该解将平均位置确定为数据的 Fisher 平均值，将极点位置确定为平均值与数据之间叉积的 Fisher 平均值。 对叉积取平均会根据点到平均值的距离按比例赋予权重，类似于平面线性回归中远距离点的“杠杆作用”。

-L2 解近似于角距离余弦平方和的最小化。 它创建了一个由数据矢量分量平方和组成的 3 x 3 矩阵。该矩阵的特征向量给出了平均位置和极点位置。 当有数千个数据时，此方法可能更容易受到舍入误差的影响。极点由最小特征值对应的特征向量给出； 它是数据中表现最差的因子，且通过任何一种方法都不易估计。

## 语法

gmt fitcircle [ table ] `-L` norm [ `-F` flags ] [ `-S`[lat] ] [ `-V`[level] ] [ `-a` flags ] [ `-bi` binary ] [ `-di` nodata[+c col] ] [ `-e` regexp ] [ `-f` flags ] [ `-g` gaps ] [ `-h` headers ] [ `-i` flags ] [ `-o` flags ] [ `-q` flags ] [ `-:`[i|o] ] [ --PAR=value ]

## 输入数据

table

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

## 必须选项

-L

-L norm

  norm 取值 - 1: 解法1 - 2: 解法2 - 3 或留空: 同时输出解法1和解法2的结果

## 可选选项

-F

-F f|m|n|s|c

  控制输出格式。

  正常情况下，该命令会将计算结果以较复杂的形式输出。使用本选项，则只返回简单的坐标。 后面可以加上其他修饰符以指定要返回的坐标：

  - f 平面地球平均位置

  - m 平均位置

  - n 大圆北极

  - s 大圆南极

  - c 小圆极点及其余纬，需要 `-S`

-S

-S lat

  尝试拟合小圆而非大圆。极点将被约束在连接“最佳拟合大圆极点”与“数据平均位置”的大圆上。 可附加所需的小圆固定纬度 lat [默认自动确定最佳纬度]。

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

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

-o

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

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

-q

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

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

-:

-:[i|o]

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

-^ 或 -

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

-+ 或 +

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

-? 或无参数

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

--PAR=value

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

## ASCII 格式精度

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

## 示例

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

以最小二乘法寻找最拟合远程文件 @sat_03.txt 中 (经度, 纬度) 点的大圆参数:

    gmt fitcircle @sat_03.txt -L2 -Fm

假设在文件 ship.xyg 中有沿着弯曲船迹的 经度, 纬度, 重力 数据。希望将这些数据投影到大圆上，并按距离进行重采样，以便对其进行滤波或检查其频谱:

    gmt fitcircle ship.xyg -L2
    gmt project ship.xyg -Cox/oy -Tpx/py -S -Fpz | gmt sample1d -S-100 -I1 > output.pg

此处，ox/oy 是 fitcircle 得到的平均位置的经纬度，而 px/py 是极点的经纬度。文件 output.pg 包含了沿最拟合 ship.xyg 的大圆每隔 1 km 采样一次的距离和重力数据。

数据文件 data.txt 中包含 经度, 纬度 点，使用 L2 范数返回北半球大圆极点位置:

    gmt fitcircle data.txt -L2 -Fn > pole.txt

用两种计算方法拟合了数据的大圆弧路径和小圆弧路径，并借助 project 生成路径坐标。

    #!/usr/bin/env bash
    gmt begin fitcircle_ex1

        # Fit great circle to red points and small circle to green points
        # Plot the best-fitting great and small circles as well as the
        # location of the mean locations and pole locations for both
        # the -L1 and -L2 options (i.e., -L3).

        gmt fitcircle gcircle.txt -L3 > g.txt
        gmt fitcircle scircle.txt -L3 -S > s.txt
        gpole1=`grep "L1 N Hemisphere" g.txt | gawk '{printf "%s/%s\n", $1, $2}'`
        gpole2=`grep "L2 N Hemisphere" g.txt | gawk '{printf "%s/%s\n", $1, $2}'`
        spole1=`grep "L1 Small Circle Pole" s.txt | gawk '{printf "%s/%s\n", $1, $2}'`
        spole2=`grep "L2 Small Circle Pole" s.txt | gawk '{printf "%s/%s\n", $1, $2}'`
        slat1=`grep "L1 Small Circle" s.txt | gawk '{print 90-$NF}'`
        slat2=`grep "L2 Small Circle" s.txt | gawk '{print 90-$NF}'`
        gmt plot -Rg -JG-30/40/7i -Bg gcircle.txt -Sc0.04i -Gred -Xc -Yc
        gmt plot scircle.txt -Sc0.04i -Ggreen
        gmt project -G1 -T$gpole1 -L-180/180 | gmt plot -W3p
        gmt project -G1 -T$gpole2 -L-180/180 | gmt plot -W1p,-
        gmt project -G1/$slat1 -T$spole1 -L-180/180 | gmt plot -W3p
        gmt project -G1/$slat2 -T$spole2 -L-180/180 | gmt plot -W1p,-
        grep "Great Circle Pole" g.txt | gmt plot -Sa0.2i -Gred -W0.25p
        grep "Small Circle Pole" s.txt | gmt plot -Sa0.2i -Ggreen -W0.25p
        grep "L1 Average" g.txt | gmt plot -Sa0.2i -Gyellow -W0.25p
        grep "L2 Average" g.txt | gmt plot -Sa0.2i -Gyellow -W0.25p
        grep "L1 Average" s.txt | gmt plot -Sa0.2i -Gyellow -W0.25p
        grep "L2 Average" s.txt | gmt plot -Sa0.2i -Gyellow -W0.25p

        rm g.txt s.txt
    gmt end

fitcircle示例

## 相关模块

vector, project, mapproject, sample1d