4

从经度和纬度数据中获得正确的输出,我一天中的大部分时间都在头疼。我知道这个数据是正确的,通过在谷歌地图中绘制它。例如,我将显示这些经纬度坐标的数据:经度:4.905396 纬度:52.364643

在谷歌地图中绘制时,它显示了正确的位置,即荷兰的阿姆斯特丹: 在 gmaps 上绘制阿姆斯特丹的位置

现在,当我在我的应用程序中绘制它时,它看起来如下: 显示位置的自制应用程序

是的,谷歌地图是 2D 表示,我的是 3D,但这只是为了证明经度和纬度值是正确的,所以如果我将它们转换为 3D 空间的公式是正确的,它们应该出现在同一个位置。

我一直在阅读网络上的很多文章以及 stackoverflow 本身。我已经阅读了这些文章并应用了我看到的所有不同类型的公式:

将纬度和经度转换为 3D 空间中的点

球体上的 3D 坐标到纬度和经度

这两个似乎有很好的例子的明确解释,但似乎没有任何效果。我现在正在做的是计算 3D 空间中的位置,然后对其进行归一化并使用它作为方向来绘制一条末端带有点的线,正如您在我的应用程序的屏幕截图中看到的那样。当使用大多数示例中使用的地球半径时,这与仅从中心绘制一条线到计算位置没有什么不同。

我现在的公式是:

X = r * cos(latitude) * cos(lontitude);
Y = r * cos(latitude) * sin(longitude);
Z = r * sin(latitude);

我知道这是错误的,但我浏览了我在网上看到的所有示例,但没有一个显示正确的数据。通过使用来自谷歌地图的数据进行测试,我知道至少输入是正确的。

更新1:

我检查了纹理的拓扑结构,当它的纬度和经度分别为 0.0000 和 0.0000 时会发生这种情况: 用 0.0000 和 0.0000 检查经纬度

所以这意味着这已经是错误的,但它的偏移量是奇数,正如谷歌地图显示的那样,它应该是这样的: 谷歌地图经纬度 0.0000, 0.0000

绿色箭头是 0.0000、0.0000 标记。所以我的很明显,它偏向一边。我想它可能(不这么认为/希望如此)是纹理,我正在使用这个: http: //naturalearth.springercarto.com/ne3_data/16200/textures/2_no_clouds_16k.jpg

我从中获得:Shadedrelief Natural Earth textures

更新 2:我用纹理检查了我的球体的拓扑结构,它似乎对 0.0 和 0.0 关闭,但我也怀疑我的公式。我从网上尝试了很多不同的方法,其中一些得到的 0.0 0.0 与我的第一个公式相同,但很多都没有。我的经度和纬度以-180~180和-90~90为单位。

更新 3:这是阿姆斯特丹地块的视图,它有点偏离,就像 0.0 0.0 lat/long piont。我猜地图或计算在某个地方是错误的。我会尝试调整纹理以稍微移动。 几乎固定

4

2 回答 2

7

您必须首先将角度设为弧度,而不是度数。

然后检查:哪个轴向上?您的公式与 Z 向上(北极)和 X 在屏幕外(您将地球旋转到 0,0)一致

然而,更常见的是用 Y 向上和 Z 在屏幕外渲染视图。

检查纹理坐标是如何生成的,以查看哪个轴与 sin 一起使用。

于 2012-07-17T19:05:29.737 回答
1

到目前为止还没有提到,但请确保传递给 cos 和 sin 的角度是弧度而不是度数http://en.cppreference.com/w/cpp/numeric/math/cos

于 2012-07-17T18:52:21.133 回答