地理空间完整性调查环境

简介

gie [ -hovql [ args ] ] file[s]

描述

gie 地理空间完整性调查环境是项目转换库的回归测试环境。它的主要设计目标是能够对作为PROJ一部分的代码执行回归测试,同时不需要任何其他类型的工具,而只需要编译库所使用的同一个C编译器。

-h, --help

打印使用信息

-o <file>, --output <file>

指定输出文件名

-v, --verbose

详细:提供非必要的信息输出。重复 -v 为了更详细(例如。 -vv

-q, --quiet

安静:与冗长相反。在安静模式下,甚至不会报告错误。只有通过返回代码进行交互(成功时为0,非零表示失败测试的数量)

-l, --list

列出项目内部系统错误代码

--version

打印版本号

测试 gie 在简单文本文件中定义。通常有分机 .gie . 测试 gie 是用gie的专用构建命令语言编写的。gie命令语言的基本功能仅通过3个命令动词实现: operation ,定义要测试的项目操作, accept ,定义要读取的输入坐标,以及 expect ,它定义了预期的结果。

的示例测试文件 gie 使用上述三个基本命令的:

<gie>

--------------------------------------------
Test output of the UTM projection
--------------------------------------------
operation  +proj=utm  +zone=32  +ellps=GRS80
--------------------------------------------
accept     12  55
expect     691_875.632_14   6_098_907.825_05

</gie>

解析 gie 文件开始于 <gie> 什么时候结束 </gie> 到达。以前有过吗 <gie> 之后呢 </gie> 不考虑。测试用例是通过定义 operation 哪一个 accept 输入坐标和 expect 输出坐标。

因为 gie 测试包在 <gie>/</gie> 标签也可以将测试用例添加到定制的 init files . 在读取初始化文件时,PROJ将忽略这些测试 +初始化gie 忽略任何没有包装的东西 <gie>/</gie> .

gie 测试由一组命令定义,如 operationacceptexpect 在上面的例子中。命令一起组成 gie 命令语言。任何一行 gie 不以命令开头的文件将被忽略。在上面的示例中,可以看到如何使用它来添加注释和样式 gie 测试文件以使其更具可读性,并记录各种测试的目的。

低于 gie命令语言 详细解释。

实例

  1. 在打开所有调试信息的情况下运行文件中的所有测试

gie -vvvv corner-cases.gie
  1. 在多个文件中运行所有测试

gie foo bar

gie命令语言

operation <+args>

定义要测试的项目操作。例子:

operation proj=utm zone=32 ellps=GRS80
# test 4D function
accept    12 55 0 0
expect    691875.63214  6098907.82501  0  0

# test 2D function
accept    12 56
expect    687071.4391   6210141.3267
accept <x y [z [t]]>

定义要读取的输入坐标。获取测试坐标。坐标可以由2、3或4个值定义,其中前两个值是x和y分量,第三个值是z分量,第四个值是时间分量。坐标中组件的数量决定了测试操作的版本(2D、3D或4D)。一个可以接受多个坐标 operation . 对于每个 accept 随行的 expect 是必需的。

注意 gie 接受下划线 (_ )作为一个分隔符。它不是必需的(事实上,输入例程完全忽略了它),但是它显著地提高了投影坐标中通常需要的非常长的数字字符串的可读性。

operation 举个例子。

expect <x y [z [t]]> | <error code>

定义将从通过操作传递的接受坐标返回的预期坐标。期望的坐标可以由2、3或4个分量定义,类似于 accept . 一个坐标可以有多个 operation . 对于每个 expect 随行的 accept 是必需的。

operation 举个例子。

除了需要一个坐标之外,在无法创建操作的情况下,还可能需要一个PROJ错误代码。这在测试错误是否被正确捕获和处理时非常有用。下面是一个示例,它测试了在构造不可逆管道时管道操作符是否正确失败。

operation   proj=pipeline step
            proj=urm5 n=0.5 inv
expect      failure pjd_err_malformed_pipeline

gie --list 获取可预期的错误代码列表。

tolerance <tolerance>

这个 tolerance 命令控制接受的坐标可以偏离预期坐标的程度。这对于测试操作是否满足某个数字公差阈值非常方便。一些操作的精度预计在毫米以内,而其他操作的精度可能仅在几米以内。 tolerance 应该

operation       proj=merc
# test coordinate as returned by ```echo 12 55 | proj +proj=merc``
tolerance       1 cm
accept          12 55
expect          1335833.89 7326837.72

# test that the same coordinate with a 50 m false easting as determined
# by ``echo 12 55 |proj +proj=merc +x_0=50`` is still within a 100 m
# tolerance of the unaltered coordinate from proj=merc
tolerance       100 m
accept          12 55
expect          1335883.89  7326837.72

默认公差为0.5 mm。看到了吗 proj -lu 可能的单位列表。

roundtrip <n> <tolerance>

对操作进行往返测试。 roundtrip 需要一个 operation 和A accept 命令运行。接受的坐标首先以正向模式传递给操作,然后正向操作的输出被传递回反向操作。此程序已完成 n 次。如果产生的坐标在初始坐标的设定公差范围内,则测试通过。

具有默认100次迭代和默认公差的示例:

operation       proj=merc
accept          12 55
roundtrip

计数和默认公差示例:

operation       proj=merc
accept          12 55
roundtrip       10000

计数和公差示例:

operation       proj=merc
accept          12 55
roundtrip       10000 5 mm
direction <direction>

这个 direction 命令指定操作的执行方向。这可以是 forwardinverse . 下面是一个例子,其中测试了对称变换管道在两个方向上返回相同的结果。

operation proj=pipeline zone=32 step
          proj=utm  ellps=GRS80 step
          proj=utm  ellps=GRS80 inv
tolerance 0.1 mm

accept 12 55 0 0
expect 12 55 0 0

# Now the inverse direction (still same result: the pipeline is symmetrical)

direction inverse
expect 12 55 0 0

默认方向为“向前”。

ignore <error code>

这在依赖于不保证可用的网格的测试用例中特别有用。下面就是一个例子。

operation proj=hgridshift +grids=nzgd2kgrid0005.gsb ellps=GRS80
tolerance 1 mm
ignore    pjd_err_failed_to_load_grid
accept    172.999892181021551 -45.001620431954613
expect    173                 -45

gie --list 可忽略的错误代码列表。

require_grid <grid_name>

检查网格<gridu name>的可用性。如果没有找到,那么 accept/expect 配对直到下一个 operation 将被跳过。 require_grid 可以重复多次以指定需要存在的多个轴网。

echo <text>

将用户定义的文本添加到输出流。请参见下面的示例。

<gie>
echo ** Mercator projection tests **
operation +proj=merc
accept  0   0
expect  0   0
</gie>

哪些回报

-------------------------------------------------------------------------------
Reading file 'test.gie'
** Mercator projection test **
-------------------------------------------------------------------------------
total:  1 tests succeeded,  0 tests skipped,  0 tests failed.
-------------------------------------------------------------------------------
skip

在第一次出现错误后跳过任何测试 skip . 在下面的示例中,只执行第一次测试。跳过第二个测试。这个特性主要与编写新测试用例时的调试有关。

<gie>
operation proj=merc
accept  0   0
expect  0   0
skip
accept  0   1
expect  0   110579.9
</gie>

严格模式

7.1 新版功能.

普通gie语法的一个更严格的变体可以通过将gie命令包装在 <gie-strict></gie-strict> . 在严格模式下,注释行必须以尖锐字符开头。未知命令将被视为错误。命令仍可以拆分为几行,但中间行必须以空格字符结尾,后跟反斜杠以标记继续。

<gie-strict>
# This is a comment. The following line with multiple repeated characters too
-------------------------------------------------
# A command on several lines must use " \" continuation
operation proj=hgridshift +grids=nzgd2kgrid0005.gsb \
          ellps=GRS80
tolerance 1 mm
ignore    pjd_err_failed_to_load_grid
accept    172.999892181021551 -45.001620431954613
expect    173                 -45
</gie-strict>

背景

更重要的是,gie不仅仅是“地理空间完整性调查环境”的缩写,它还是Gerald Ian Evenden(1935-2016)的缩写、用户id和USGS电子邮件地址。Gerald Ian Evenden是一位地理空间幻想家,早在20世纪80年代就开始了今天的项目。

杰拉尔德清楚地看到地图投影 只是一些特殊的功能 . 其中有些相当复杂,大部分是两个变量,但都是 只是一些特殊的功能 ,也不比 sin()cos()tan()hypot() 已在C标准库中提供。

因此,杰拉尔德说, 它们不应该特别难用 对于一个程序员来说 sin() 的, tan() S和 hypot() 很容易找到。

杰拉尔德的聪明才智也体现在愿景的实现上,他设计了一个全面但简单的键值对系统,用于参数化地图投影,以及高度灵活的 PJ 结构,存储这些键值对的运行时编译版本,从而进行映射投影函数调用, pj_fwd(PJ, point) ,就像传统的函数调用一样简单 hypot(x,y) .

虽然今天,我们可能有更正式的定义良好的元数据系统(最突出的是ogcwkt2表示),但没有什么比Gerald的key-value系统更容易阅读(“与人兼容”)。特别是这个系统,以及整个项目系统,是杰拉尔德送给任何使用和/或交流地理数据的人的伟大礼物。

为了纪念杰拉尔德,命名一个项目,注意项目系统的完整性是合理的。

为了纪念杰拉尔德·伊恩·埃文登(Gerald Ian Evenden,1935--2016)的精神,这就是地理空间完整性调查环境。