基于三角网变换的不规则三角网

7.2.0 新版功能.

Alias

tinshift公司

输入类型

投影或地理坐标(水平),米(垂直)

输出类型

投影或地理坐标(水平),米(垂直)

Domain

2D或3D

可用表格

正向和反向

这个 tinshift 转换需要一个强制参数, file ,它指向一个JSON文件,其中包含三角剖分和关联的元数据。输入和输出坐标必须是地理坐标或投影坐标。根据JSON文件的内容,可以转换坐标的水平、垂直或两个分量。

该变换是可逆的,其计算复杂度与前向变换相同。

参数

要求的

+file=<filename>

TIN的JSON文件的文件名。

例子

使用芬兰EPSG:2393(“KKJ/芬兰统一坐标系”)将点投影CRS转换为EPSG:3067(“ETRS89/TM35FIN(E,N)”)

$ echo 3210000.0000 6700000.0000 0 2020 | cct +proj=tinshift +file=./triangulation_kkj.json

209948.3217     6697187.0009    0.0000     2020

算法

内部, tinshift 将整个文件放入内存。人们认为三角测量应该足够小。

当一个点被变换时,必须找到它所落入的三角形。我们不需要迭代所有的三角形,而是在内存中建立一个四叉树来加速候选三角形的识别。

为了确定一个点是否落入一个三角形,我们计算它的3 barycentric coordinates 从它的投影坐标来看, \(\lambda_i\) 对于 \(i=1,2,3\) . 它们是真实的价值(在 [0,1] 三角形内点的范围),给出三角形3个顶点中每个顶点的权重。

已知这些权重后,插值目标水平坐标就是将这些权重与三角形3个顶点处的目标水平坐标进行线性组合 (\(Xt_i\)\(Yt_i\) ):

\[X{target}=Xt\u 1 * \lambda_1 + Xt_2 * \lambda_2+Xt_3*\lambda_3 * \lambda_1 + Yt_2 * \λ2+钇3*\λ3\]

此插值在三角剖分的顶点处是精确的,并且在每个三角形内具有线性特性。它完全等价于三角插值的其他公式,例如

\[ \begin{align}\begin{aligned}X_{目标}=A+X_{源} * B + Y_{{source}} * C\\Y_{目标}=D+X_{源} * E + Y_{{source}} * F\end{aligned}\end{align} \]

式中,A、B、C、D、E、F常数(对于给定三角形)是通过求解2个3线性方程组,由三角形3个顶点的源坐标对和目标坐标对约束得到的:

\[Xt_i=A+Xs_i * B + Ys_i * C级 * E + Ys_i * F\]

与垂直坐标变换类似,其中 \(Zoff_i\) 是三角形每个顶点的垂直偏移:

\[Z_{目标}=Z_{源}+ZOFF_1 * \lambda_1 + Zoff_2 * \lambda_2+Zoff_3*\lambda_3\]

三角剖分的约束条件

没有检查三角测量的一致性。强烈建议三角形之间不要重叠(在考虑源坐标或正变换时,或反变换的目标坐标时),否则将选择哪个三角形是未指定的。除此之外,三角剖分不需要有特定的属性(比如Delaunay三角剖分)

文件格式

三角剖分以基于文本的格式存储,使用JSON作为序列化。

下面是一个最小的示例,从KKJ到ETRS89转换,只有一个三角形:

{
  "file_type": "triangulation_file",
  "format_version": "1.0",
  "name": "Name",
  "version": "Version",
  "publication_date": "2018-07-01T00:00:00Z",
  "license": "Creative Commons Attribution 4.0 International",
  "description": "Test triangulation",
  "authority": {
    "name": "Authority name",
    "url": "http://example.com",
    "address": "Adress",
    "email": "test@example.com"
  },
  "links": [
    {
      "href": "https://example.com/about.html",
      "rel": "about",
      "type": "text/html",
      "title": "About"
    },
    {
      "href": "https://example.com/download",
      "rel": "source",
      "type": "application/zip",
      "title": "Authoritative source"
    },
    {
      "href": "https://creativecommons.org/licenses/by/4.0/",
      "rel": "license",
      "type": "text/html",
      "title": "Creative Commons Attribution 4.0 International license"
    },
    {
      "href": "https://example.com/metadata.xml",
      "rel": "metadata",
      "type": "application/xml",
      "title": " ISO 19115 XML encoded metadata regarding the deformation model"
    }
  ],
  "transformed_components": [ "horizontal" ],
  "vertices_columns": [ "source_x", "source_y", "target_x", "target_y" ],
  "triangles_columns": [ "idx_vertex1", "idx_vertex2", "idx_vertex3" ],
  "vertices": [ [2,49,2.1,49.1], [3,50,3.1,50.1], [2, 50, 2.1,50.1] ],
  "triangles": [ [0, 1, 2] ]
}

因此,在通用元数据之后,我们定义了输入和输出CRS(仅供参考),并且转换会影响坐标的水平分量。我们命名 verticestriangles 数组。我们定义了每个顶点的源坐标和目标坐标,并通过引用每个顶点的索引来定义一个三角形 vertices 数组。

对于文件,更具体的项目是:

input_crs

标识顶点中源坐标的CR的字符串。典型的 EPSG:XXXX . 如果转换是针对垂直分量,则这应该是复合CRS的代码(可以是EPSG:XXXX+YYYY其中XXXX是水平CRS的代码,YYYY是垂直CRS的代码)。例如,对于KKJ->ETRS89转换,这是EPSG:2393 (KKJ / Finland Uniform Coordinate System ). 假设输入坐标按“可视化标准化”/“地理信息系统友好”顺序传递,即地理坐标为经度、纬度,投影坐标为东距、北距。

output_crs

标识顶点中目标坐标的CR的字符串。典型的 EPSG:XXXX . 如果转换是针对垂直分量,则这应该是复合CRS的代码(可以是EPSG:XXXX+YYYY其中XXXX是水平CRS的代码,YYYY是垂直CRS的代码)。例如,对于KKJ->ETRS89转换,这是爱普生:3067(“ETRS89/TM35FIN(E,N)”)。输出坐标将以“可视化标准化”/“地理信息系统友好”的顺序返回,即地理坐标为经度、纬度,投影坐标为东距、北距。

transformed_components

可以包含一个或两个字符串的数组:坐标的水平分量变换时为“水平”和/或垂直分量变换时为“垂直”。

fallback_strategy

标识如何处理不属于任何指定三角形的点的字符串。此商品适用于 format_version >=1.1。可能的值包括 nonenearest_sidenearest_centroid 。默认为 none 和表示不变换位于指定三角形之外的点。这也是他们的行为 format_version 1.1之前的版本。如果 fallback_strategy 设置为 nearest_side ,然后,没有落入任何三角形的点根据欧几里德距离最接近它们的三角形进行变换。如果 fallback_strategy 设置为 nearest_centroid ,则不落入任何三角形的点将根据具有最近质心(其中线的交点)的三角形进行变换。

vertices_columns

指定中行的列的名称 vertices 数组。一定有很多元素 vertices_columns 就像在一排 vertices . 以下名称具有特殊含义: source_xsource_ytarget_xtarget_ysource_ztarget_zoffset_z . source_xsource_y 是强制性的。 source_x 表示源经度(度)或东距。 source_y 表示源纬度(度)或北距。 target_xtarget_y 是强制性的 horizontal 在中指定 transformed_components . (source_ztarget_zoffset_z 是强制性的 vertical 在中指定 transformed_components

triangles_columns

指定中行的列的名称 triangles 数组。一定有很多元素 triangles_columns 就像在一排 triangles . 以下名称具有特殊含义: idx_vertex1idx_vertex2idx_vertex3 . 它们是强制性的。

顶点

一种数组,其项本身就是数组,列数与中所述的相同 vertices_columns .

三角形

一种数组,其项本身就是数组,列数与中所述的相同 triangles_columns . 的值 idx_vertexN 列必须是索引(介于0和len之间) (vertices -1) 项目的 vertices 数组。

A JSON schema 可用于此文件格式。