3

我试图在Cesium中指出珠穆朗玛峰的顶部。昨晚我最有可能的候选人是我借来的代码来进行大地测量到 ecef 的转换(来自 PySatel.coord)。今早复习,看来是对的:

a = 6378.137
b = 6356.7523142
esq = 6.69437999014 * 0.001
e1sq = 6.73949674228 * 0.001
f = 1 / 298.257223563


def geodetic2ecef(lat, lon, alt):
    """Convert geodetic coordinates to ECEF.

    Units are degrees and kilometers.
    """
    lat, lon = radians(lat), radians(lon)
    xi = sqrt(1 - esq * sin(lat))
    x = (a / xi + alt) * cos(lat) * cos(lon)
    y = (a / xi + alt) * cos(lat) * sin(lon)
    z = (a / xi * (1 - esq) + alt) * sin(lat)
    return x, y, z

我从维基百科中提取了珠穆朗玛峰顶峰的纬度/经度/纬度。在将对象定位到我的 CZML 之前,我将上述代码提供的 ECF 坐标乘以 1000(m/km)。我得到一个 ECF 位置:[302995.41122130124、5640733.98308375、2981975.8695256836]。使用默认的地形提供者(在教程中描述),这一点明显高于珠穆朗玛峰的峰值。

这是相关的 CZML 片段:

{"position": 
  {"cartesian": [302995.41122130124, 5640733.98308375, 2981975.8695256836]}, 
 "id": "ellipsoid-1", 
 "ellipsoid": 
   {
     "radii": {"cartesian": [3545.5375159540376, 
                              164.44985193756034, 
                              164.62702908803794]}, 
     "material": {"solidColor": {"color": {"rgba": [0, 255, 0, 100]}}}
   }, 
 "orientation": {"unitQuaternion": [0.00014107125875577922, 
                                    -0.011462389405915903, 
                                    -0.010254110199791062, 
                                    -0.70702315200093502]}
}
4

2 回答 2

6

这里有几个因素在起作用。

首先,Cesium 用于地形的源数据可能低于珠穆朗玛峰峰的预期高度。我们使用 CGIAR SRTM 数据集,所以他们的 FAQ 中的这个项目是相关的:

为什么有些山区的山峰明显低于应有的高度?

如前所述,许多原始数据空白集中在山区和雪域。因此,实际上对高山地区的许多山峰进行了插值。如果不使用高分辨率协变量进行插值,则插值无法识别数据空白实际上是一个峰值,并且倾向于“压平”峰值,从而导致低估该区域的真实高程。此问题在版本 4 中已基本解决。

他们说它在 Cesium 使用的 v4 版本中得到了很大的解决,所以希望这第一个因素不是实际问题。

其次,我们对与 Cesium 一起使用的源地形数据的处理可能会使峰值稍微变平。这个问题很快就会得到纠正,希望在接下来的几个月内。

第三,维基百科提供的高度是平均海平面以上的高度(MSL)。MSL 是一个复杂的表面,很难在数学上使用,所以你的 geodetic2ecef 没有这样做。相反,它像铯一样,假设高度是相对于 WGS84 椭球的,这是一个更好的表面。

NGA 有一个网站可以用来查找 WGS84 椭球上方的 MSL 高度,也称为大地水准面高度: http ://earth-info.nga.mil/GandG/wgs84/gravitymod/egm96/intpt.html

据报道,珠穆朗玛峰峰(27° 59′ 17″ N,86° 55′ 31″ E),MSL比WGS84低28.73。如果你从维基百科上报告的峰值高度减去这个数字,你至少应该更接近。

此页面包含有关以编程方式计算大地水准面高度的信息:http: //earth-info.nga.mil/GandG/wgs84/gravitymod/egm96/egm96.html

我建议对 15 分钟的大地水准面高度文件进行插值,而不是根据系数计算高度。

与该问题没有直接关系的其他一些注释:

  • Cesium 有将 LLA(我们称之为制图)转换为笛卡尔的代码。见Ellipsoid.cartographicToCartesian
  • 您可以在 CZML 中以 carographicDegrees 或 CartographicRadians 指定坐标而不是笛卡尔坐标,然后 Cesium 会自动为您进行转换。但是,在指定高度时,您仍然需要调整大地水准面。另外,不要忘记经度是第一位的。
于 2013-04-30T12:23:59.000 回答
1

Proj4js - 著名的 proj4 库的一个端口 - 可能会为您完成这项工作。

于 2013-04-30T12:27:16.840 回答