这个答案和其他两个也可以在这里找到。
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。