Math 如何将二维栅格点(x,y)作为三维点(x,y,z)映射到球体上

Math 如何将二维栅格点(x,y)作为三维点(x,y,z)映射到球体上,math,3d,geometry,map-projections,Math,3d,Geometry,Map Projections,我有一组二维网格点(x,y),我想将其作为三维点(x,y,z)映射/投影到球体上 我意识到随着abs(y)的增加,会有一些向两极的扭曲,但我的网格补丁将只覆盖赤道附近球体的一部分,因此可以避免严重的扭曲 我很难找到正确的方程式。我希望你可以使用许多地球投影的倒数 与其他投影相比,墨卡托在赤道附近相当不错 公式在wiki页面上。 摘自维基百科关于墨卡托投影的文章: Given a "mapping sphere" of radius R, the Mercator projection (x,y)

我有一组二维网格点(x,y),我想将其作为三维点(x,y,z)映射/投影到球体上

我意识到随着abs(y)的增加,会有一些向两极的扭曲,但我的网格补丁将只覆盖赤道附近球体的一部分,因此可以避免严重的扭曲


我很难找到正确的方程式。

我希望你可以使用许多地球投影的倒数

与其他投影相比,墨卡托在赤道附近相当不错

公式在wiki页面上。

摘自维基百科关于墨卡托投影的文章:

Given a "mapping sphere" of radius R,
the Mercator projection (x,y) of a given latitude and longitude is:
   x = R * longitude
   y = R * log( tan( (latitude + pi/2)/2 ) )

and the inverse mapping of a given map location (x,y) is:
  longitude = x / R
  latitude = 2 * atan(exp(y/R)) - pi/2
要从反向映射的结果中获取三维坐标,请执行以下操作:

Given longitude and latitude on a sphere of radius S,
the 3D coordinates P = (P.x, P.y, P.z) are:
  P.x = S * cos(latitude) * cos(longitude)
  P.y = S * cos(latitude) * sin(longitude)
  P.z = S * sin(latitude)
(请注意,“地图半径”和“3D半径”几乎肯定会有不同的值,因此我使用了不同的变量名。)

我假设球体上的(x,y)是纬度、经度

如果是,请参阅

在那里:

φ=90度-纬度

θ=经度


rho=球体的半径。

谢谢。我意识到这就是我想要的,但是我在推导球面上二维点(x,y)到三维点(x,y,z)的方程时遇到了困难。啊,实际的公式。这是一个不平凡的数学运算,你可能会有更好的运气。一旦你得到了公式,你可以回到这里来帮助编程。另外,我不知道你在问什么……2D
x
y
代表什么?它们是纬度/经度,还是球体某个平面矩形投影上的坐标?在最后一个例子中,你用的是什么投影?我的纬度是29.65163。当我试图计算y值时,我得到了一个错误(在Python中),因为
tan((纬度+pi/2)/2)
是-0.0970531183,对该值执行日志操作会抛出一个“数学域错误”,因为该值为负值。我做错了什么?在添加
pi/2
之前,您需要将纬度从度转换为弧度。这将把范围
+/-90度
转换为
+/-pi/2弧度
,除非你在极点,否则不会溢出功能范围(在这种情况下,麦卡托投影是奇异的…)你知道如何从x,y和z获得纬度和经度吗?纬度是
atan2(z,sqrt(x*x+y*y))
,经度是
atan2(y,x)
。这两种方法都会产生弧度,可以直接在反向贴图中使用,但如果您想要的话,必须将弧度转换为度。