从经度\纬度转换为笛卡尔坐标

dap*_*hez 95 mapping geometry geospatial

我有一些以地球为中心的坐标点,以纬度和经度(WGS-84)给出.

如何将它们转换为笛卡尔坐标(x,y,z),原点位于地球的中心?

dap*_*hez 119

这是我找到的答案:

只是为了使定义完整,在笛卡尔坐标系中:

  • x轴经过长,纬度(0,0),因此经度0与赤道相遇;
  • y轴经过(0,90);
  • 并且z轴穿过两极.

转换是:

x = R * cos(lat) * cos(lon)

y = R * cos(lat) * sin(lon)

z = R *sin(lat)
Run Code Online (Sandbox Code Playgroud)

其中R是近似的地球半径(例如6371KM).

如果您的三角函数需要弧度(他们可能会这样做),您需要先将经度和纬度转换为弧度.你显然需要一个十进制表示,而不是degrees\minutes\seconds(参见这里有关转换的信息).

反向转换公式:

   lat = asin(z / R)
   lon = atan2(y, x)
Run Code Online (Sandbox Code Playgroud)

asin当然是正弦曲线.阅读维基百科中的atan2.不要忘记从弧度转换回度数.

这个页面为此提供了c#代码(注意它与公式有很大不同),还有一些解释和很好的图表说明为什么这是正确的,

  • @starblue:我不确定你是否可以将给定答案标记为"正确"或"错误".使用可用的lat/lng(参考WGS-84)的球面近似(以获得ECEF样式的x,y,z坐标)对于原始海报的需要"足够"或"不够".对于距离和方位估计,我敢打赌这个简单的转换很好.如果他正在发射卫星,也许不是.毕竟,WGS-84本身是"错误的"......因为它不是地球表面的完美模型; 所有椭圆体模型都是近似值.太糟糕了OP并没有告诉我们他想要做什么. (36认同)
  • -1这是错的.你假设地球是一个球体,而WGS-84则假设是一个椭圆体. (15认同)
  • @Dan H这个问题要求WGS-84,如果你回答其他问题,你至少应该讨论差异/错误,这个答案没有. (8认同)
  • 是否可以在不使用 z 的情况下从笛卡尔坐标转换为常规坐标?如果一开始就只有 x 和 y 呢? (2认同)

bn.*_*bn. 41

我最近使用WGS-84数据的"Haversine Formula"做了类似的事情,这是"Haversines法则"的衍生物,结果非常令人满意.

是的,WGS-84假设地球是一个椭圆体,但我相信你只能使用类似"Haversine Formula"的方法得到大约0.5%的平均误差,这可能是你的情况下可接受的误差量.你总会有一些误差,除非你说的是几英尺的距离,甚至理论上地球的曲率......如果你需要更严格的WGS-84兼容方法,请查看"Vincenty公式".

我明白的地方starblue是从哪里来的,但良好的软件工程往往是关于权衡,所以这一切都取决于你需要你在做什么的准确性.例如,从"曼哈顿距离公式"与从"距离公式"的结果计算的结果可以是用于某些情况下更好,因为它在计算上是更便宜.想想"哪一点最接近?" 您不需要精确距离测量的场景.

关于,"Haversine公式"很容易实现并且很好,因为它使用"球面三角法"而不是基于二维三角法的"余弦定律"方法,因此您可以获得精确的平衡过于复杂.

一位名叫Chris Veness的绅士在http://www.movable-type.co.uk/scripts/latlong.html上有一个很棒的网站,它解释了你感兴趣的一些概念并演示了各种程序化实现; 这也应该回答你的x/y转换问题.

  • 检查了你的链接。0.5% 的引用是针对两点之间大圆距离的误差,因此与此问题没有严格相关性。我认为在将经纬度转换为以地球中心为原点的笛卡尔坐标时,假设球形地球的误差可能很大。不清楚提问者想用笛卡尔坐标**做什么**。要么出于某种奇怪的原因在它们中工作更方便,要么可能是数据导出的某些要求?如果是后者,准确性将很重要。 (2认同)

小智 9

在 python3.x 中,它可以使用:

# Converting lat/long to cartesian
import numpy as np

def get_cartesian(lat=None,lon=None):
    lat, lon = np.deg2rad(lat), np.deg2rad(lon)
    R = 6371 # radius of the earth
    x = R * np.cos(lat) * np.cos(lon)
    y = R * np.cos(lat) * np.sin(lon)
    z = R *np.sin(lat)
    return x,y,z
Run Code Online (Sandbox Code Playgroud)


小智 7

转换GPS?WGS84)笛卡尔坐标的 理论https://en.wikipedia.org/wiki/Geographic_coordinate_conversion#From_geodetic_to_ECEF_coordinates

以下是我正在使用的内容:

  • GPS(WGS84)和笛卡尔坐标的经度是相同的.
  • 纬度需要通过WGS 84椭球参数转换半长轴为6378137米,并且
  • 扁平化的倒数是298.257223563.

我附上了我写的VB代码:

Imports System.Math

'Input GPSLatitude is WGS84 Latitude,h is altitude above the WGS 84 ellipsoid

Public Function GetSphericalLatitude(ByVal GPSLatitude As Double, ByVal h As Double) As Double

        Dim A As Double = 6378137 'semi-major axis 
        Dim f As Double = 1 / 298.257223563  '1/f Reciprocal of flattening
        Dim e2 As Double = f * (2 - f)
        Dim Rc As Double = A / (Sqrt(1 - e2 * (Sin(GPSLatitude * PI / 180) ^ 2)))
        Dim p As Double = (Rc + h) * Cos(GPSLatitude * PI / 180)
        Dim z As Double = (Rc * (1 - e2) + h) * Sin(GPSLatitude * PI / 180)
        Dim r As Double = Sqrt(p ^ 2 + z ^ 2)
        Dim SphericalLatitude As Double =  Asin(z / r) * 180 / PI
        Return SphericalLatitude
End Function
Run Code Online (Sandbox Code Playgroud)

请注意,h高于该高度WGS 84 ellipsoid.

通常GPS会给我们H以上的MSL高度.的MSL高度必须被转换到高度h高于WGS 84 ellipsoid通过使用位势模型EGM96(勒蒙纳等人,1998).
这是通过插入大地水准面高度文件的网格以15弧分的空间分辨率来完成的.

或者,如果你有一些级别的专业人员 GPS有海拔高度H(msl,高于平均海平面的高度)UNDULATION,geoid以及从内部表格中ellipsoid (m)选择的数据输出的关系.你可以得到h = H(msl) + undulation

通过笛卡尔坐标到XYZ:

x = R * cos(lat) * cos(lon)

y = R * cos(lat) * sin(lon)

z = R *sin(lat)
Run Code Online (Sandbox Code Playgroud)

  • 我想这是球体的半径,对地球来说是6371公里. (3认同)

Stj*_*jko 5

如果您关心基于椭球体而不是球体获取坐标,请查看Geographic_coordinate_conversion - 它给出了公式。GEodetic Datum具有转换所需的 WGS84 常数。

那里的公式还考虑了相对于参考椭球面的高度(如果您从 GPS 设备获取高度数据则很有用)。


Bri*_*ins 5

PROJ.4软件提供了一个命令行程序,可以做转换,比如

LAT=40
LON=-110
echo $LON $LAT | cs2cs +proj=latlong +datum=WGS84 +to +proj=geocent +datum=WGS84
Run Code Online (Sandbox Code Playgroud)

它还提供了C API。特别是,该函数pj_geodetic_to_geocentric将执行转换,而无需首先设置投影对象。