可逆算法:将纬度、经度和3D点互相转换

3
我知道有其他类似的问题,但它们大多只涉及将一个转换为另一个。但我正在寻找一种算法,可以相互转换。仅使用其中一个并不能产生期望的结果。
对于我的目的,单位球体是完全可接受的。任何半径值都将为1。
以下是我当前的方法,用简单的伪代码执行此操作。
从纬度和经度到单位球体上的点。
x = cos( longitude ) * sin( latitude )
y = sin( longitude ) * sin( latitude )
z = cos( latitude )
从单位球体上的三维坐标到纬度和经度。
latitude = acos( z )
longitude = atan2( x, y )
然而,这些并不是可逆的,而且我的三角学不如应该的那样好。

是的,但这并不能解决固有的可逆性问题。 - Chase
你看到的可逆性问题是什么?Atan2返回正确象限中的角度,而atan不一定会这样做。 - Andrew Morton
你的意思是这些不可逆转吗?你在问题中已经反转了从xyz到纬度/经度的转换。唯一需要注意的是atan函数无法返回正确象限的角度,这就是atan2的作用。 - SirGuy
修改了算法,但问题仍然存在。尝试将纬度设为0,经度设为1(大约是57度)进行测试。第一个测试结果为0,0,1,将其输入到第二个测试中得到的结果为0,0。不可逆转。 - Chase
atan2先接收y,然后是x。这样就能解决那个问题了。 - SirGuy
显示剩余4条评论
1个回答

2

将经纬度转换为xyz总是可行的,但从xyz转换为经纬度时,当sin(lat) == 0时会失败。在经纬度空间中没有解决方案,因此请远离它。
除此之外,您的公式只有一个小错误,即atan2应该先输入y再输入x,而不是先输入x再输入y


当sin(lat) = 0时,从经纬度转换为xyz会失败,因为它在极点上。此外,一些计算机语言采用参数顺序(x,y);例如Excel和OpenOffice Calc。 - Andrew Morton
@AndrewMorton 我发现有些语言按照(我认为)更合理的顺序使用它们,但我习惯于使用 y,x 的 C++、Java 和 Python。 - SirGuy
你也可以使用x,y,如果0°位置是向上的,而不是向右。我这么做已经有好几年了,因为有一个奇怪的游戏就是这样做的。 - Chase
排序顺序(x,y)有点讲道理,但由于它正在计算atan(y/x),我可以理解为什么顺序通常是(y,x)。我从之前链接的维基百科页面中获取了这些异常情况。 - Andrew Morton
@GuyGreer 我认为你的意思是相反的 - 即从经纬度到XYZ始终是可能的,但从XYZ到经纬度是有歧义的。每个经纬度对都定义了一个唯一的XYZ坐标,尽管多个经纬度对可能映射到同一个坐标,例如在极点处。这导致在反向转换时存在歧义。 - MooseBoys

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接