0

我已经花了一个多星期的时间试图为此研究解决方案,但到目前为止一无所获。

给定一个单位矩阵作为我们的起始位置和方向。然后使用 geotrans 和已知的起始位置的纬度、经度和高度,我得到一个 x、y、z 地心坐标。从 (0,0,0) 的原点开始的归一化向量给出了矩阵的向上和平移。但是,我需要向前和向右,以便我可以将距离原点以米为单位的距离传递到变换矩阵中,并获得大致准确的 GCC。我是否拥有计算正确和向前所需的所有输入?

输入
原点:0、0、0
全局:-1645380、-4885138、3752889
向上(标准化):全局 - 原点

所需的输出
正确:?? ?
向前: ?? ?

4

1 回答 1

0

这个答案和其他两个也可以在这里找到。
https://gis.stackexchange.com/questions/30448/local-coordinate-to-geocentric

给定大地坐标 (GDC) 的单个输入

前两个步骤由 geotrans 在“后台”完成了很多工作,至少可用于 C/C++ 和 Java。它解释了地球的椭圆体性质,并且可以从一个坐标系到另一个坐标系进行多次转换。
1) 将 GDC 转换为地心坐标 (GCC) = vector3 原点
2) 获取原点上方 100m 的点的 GCC = vector3 AboveOrigin

矩阵的“向上”分量非常简单,只是从原点上方的点到原点的向量。当我实现这个时,我认为它是倒退的,应该是 AboveOrigin - Origin 但由于我不明白的原因,它与描述的一样。
3) vector3 Up = Origin - AboveOrigin
4) 向上标准化

你需要一个垂直于你真正的前向或北向矢量和你的真正权利的矢量。你的真正向上和直向上正 Z 的叉积,它是通过 GCC 中用于地理传输的轴,将为你提供一个临时右向量。
5) vector3 temp = 与 vector3 (0,0,1) 交叉
6) 归一化 temp

这是您的最终前向或北向矢量
7) vector3 forward = Up cross temp
8) Normalize forward

现在重新计算右或东向量
8) vector3 right = Up cross temp
9) Normalize right
10) 用 forward、right、up 和 origin 初始化你的 4x4 矩阵

例如:在我们的地图上,我们有标签以十进制度数描述地图的顶部、底部、左侧和右侧边缘。从那里我们得到中心并指向中心上方。

中心 - (-1645379.875, -4885137.5, 3752889)
上方 - (-1645406, -4885214, 3752948)

只需这两点,您就可以按照这些步骤获得一个矩阵,该矩阵可以应用于局部空间中的坐标,并在 GCC 中取回一个相当准确的点。

为了测试这一点,我通过 geotrans 在地图上找到了 9 个点、地图的中心、四个角以及每个边缘中间的四个点。忽略地球的曲率并知道这是一张小地图,我只取了 GCC 中地图中心到四个边缘的平均距离。然后,我使用该 X/Y 距离生成 9 个局部坐标以通过矩阵并与通过 geotrans 找到的点进行比较。在测试转换点与 geotrans 点的距离时,最差的结果是顶部中间和右上角,误差为 57.3 厘米,左侧中间为 0 或接近 0。

于 2012-08-01T20:24:44.133 回答