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

Roy*_* T. 39 math geometry latitude-longitude coordinates

我有以下信息:

存在一个具有原点(0,0,0)和半径R的球体.在进行射线球体交叉后,我知道球体上的三维空间中的一个点(XYZ)(三维空间中线条穿透的确切位置)球体船体).

对于我的程序,我想计算球体上XYZ点的纬度和经度,但我不能想(或谷歌)一种方法来轻松地做到这一点.

简而言之,我正在尝试编写的函数是:

public static LatLon FromVector3(Vector3 position, float sphereRadius)
{
    return Latitude and Longitude
}
Run Code Online (Sandbox Code Playgroud)

有人知道怎么做这个吗?作为参考,这个Wiki SVG文件可能会有所帮助:

地理坐标

更新:

感谢所有有用的答案,所以最后我使用了这段代码:

 public static LatLon FromVector3(Vector3 position, float sphereRadius)
    {
        float lat = (float)Math.Acos(position.Y / sphereRadius); //theta
        float lon = (float)Math.Atan(position.X / position.Z); //phi
        return new LatLon(lat, lon);
    }
Run Code Online (Sandbox Code Playgroud)

现在我必须考虑哪个答案对我有最大的帮助:P.

San*_*kha 33

我想从x,y,z(三维坐标系)中找到球面极坐标应该不难.

  1. r 如果它在表面上,它总是不变的.

    在此输入图像描述

  2. (90 - θ)你的纬度(负值意味着它在底部),因为它是从顶部测量的.

    在此输入图像描述

  3. φ是你的经度.(但不太确定经度系统)

    在此输入图像描述

还可以从维基百科查看此图表.

在此输入图像描述


Cur*_*urd 9

lat=atan2(z,sqrt(x*x+y*y))
lng=atan2(y,x)
Run Code Online (Sandbox Code Playgroud)

使用公式atan2()更方便.您不必添加/减去pi/2或关注不同象限中的符号问题或除以零.

lat北半球
lat将> 0,南半球将<0,东半球
lng将> 0,西半球
lng将<0


Tor*_*ker 8

这有助于使用Javascript/THREE.js:

var lat = 90 - (Math.acos(y / RADIUS_SPHERE)) * 180 / Math.PI;
var lon = ((270 + (Math.atan2(x , z)) * 180 / Math.PI) % 360) -180;
Run Code Online (Sandbox Code Playgroud)