C++ 局部坐标到地心坐标

C++ 局部坐标到地心坐标,c++,vector,C++,Vector,我花了一个多星期的时间试图研究解决这个问题的方法,但到目前为止什么都没有 给定一个单位矩阵作为我们的起始位置和方向。然后使用geotrans和已知的起始位置的纬度、长度和高度,我得到一个x、y、z地心坐标。来自(0,0,0)原点的归一化向量给出了矩阵的向上和平移。但是,我需要向前和向右,这样我就可以将从原点到变换矩阵的距离(以米为单位)传递到变换矩阵中,并获得大致准确的GCC。我是否有计算右转和前进所需的所有输入 输入 原点:0,0,0 全球:-1645380,-4885138,3752889

我花了一个多星期的时间试图研究解决这个问题的方法,但到目前为止什么都没有

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

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

期望输出
对:

转发:

这个答案和另外两个答案也可以在这里找到。

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

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

矩阵的“向上”分量非常简单,只是从原点上方点到原点的向量。当我实现这个时,我认为它是向后的,应该高于Origin-Origin,但由于一些原因,我不理解它是如所述的。
3) 矢量3向上=原点-原点上方
4) 向上标准化

你需要一个向量,它既垂直于你的正前方或正北方向量,又垂直于你的右前方。通过geotrans GCC中的轴的真向上和直向上正Z的叉积将为您提供一个临时右向量。
5) vector3温度=与vector3(0,0,1)上交叉
6) 使温度正常化

这是您的最终前进或北向矢量
7) 矢量3前进=上交叉温度
8) 正向标准化

现在重新计算右向量或东向量
8) vector3右=上交叉温度
9) 正常化权限
10) 使用正向、向右、向上和原点初始化4x4矩阵

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

中心-(-1645379.875,-4885137.513752889)
高于-1645406,-48852143752948)

仅使用这两点,您就可以按照步骤得到一个矩阵,该矩阵可以应用于局部空间中的坐标,并在GCC中得到一个相当精确的点


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

也许您可以在这里找到对坐标系有更多经验的人:谢谢Mihai。我就是这么做的。在这里可以找到三个不同的答案。。。嗯,如果你已经解决了这个问题,你应该把它作为一个答案贴出来,或者让一些主持人来结束这个问题。。。