Gis 如何将大地测量位置转换为与铯地形模型一起工作的ECF位置

Gis 如何将大地测量位置转换为与铯地形模型一起工作的ECF位置,gis,geospatial,coordinate-systems,cesium,czml,Gis,Geospatial,Coordinate Systems,Cesium,Czml,我想在珠穆朗玛峰的顶端画一个点。到昨晚为止,我最有可能的候选代码是我借用来进行大地测量到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 ge

我想在珠穆朗玛峰的顶端画一个点。到昨晚为止,我最有可能的候选代码是我借用来进行大地测量到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
我从维基百科上获取了珠穆朗玛峰的纬度/经度/高度。我将上述代码提供的ECF坐标乘以1000(m/km),然后在CZML中定位对象。我得到的ECF位置为:[302995.411221301245640733.983083752981975.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]}
}

这里有几个因素在起作用

首先,铯用于地形测量的原始数据可能低于珠穆朗玛峰的预期高度。我们使用CGIAR SRTM数据集,因此其常见问题解答中的此项是相关的:

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

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

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

第二,我们对源地形数据进行处理,以便与铯一起使用,这可能会使峰值变平一点。这个问题将很快得到纠正,希望在未来几个月内得到纠正

第三,维基百科提供了高于平均海平面(MSL)的高度。MSL是一个复杂的曲面,在数学上很难处理,因此您的大地测量2ECEF没有这样做。相反,它和铯一样,假设高度是相对于WGS84椭球体的,而WGS84椭球体是一个更好的表面

NGA有一个网站,可用于查找WGS84椭球体上方的MSL高度,也称为大地水准面高度:

据报道,珠穆朗玛峰(北纬27°59′17〃,东经86°55′31〃)的MSL比WGS84低28.73米。如果你从维基百科上报道的山峰高度中减去这个数字,你至少应该更接近了

此页面包含有关以编程方式计算大地水准面高度的信息:

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

与问题没有直接关系的几个其他注意事项:

  • 铯有将LLA(我们称之为制图)转换为笛卡尔坐标的代码。请参见椭球体。制图中心
  • 您可以在CZML中以制图度数或制图半径(而不是笛卡尔坐标)指定坐标,然后铯将自动为您进行转换。但是,在指定高度时,仍必须调整大地水准面。另外,不要忘记经度是第一位的

-著名的proj4图书馆的一个端口-可能会为您做这项工作。

似乎是一个问题,因为我在@Beachwalker上考虑过这一点。这是一个奇怪的技术组合,我不确定它最适合哪里,主要是因为我不知道我的错误在哪里。它可以是坐标转换,铯javascript库,或者其他一些细节。结果证明它是一个组合。由于四舍五入(较小),山顶的DEM高程较低,如您所建议。此外,我使用的geodetic2ecef函数与elpild.js中的函数不匹配。我将算法从elpiloid.js移植到Python代码中,并切换到DEM报告的高程(最大为GTOPO30),现在它排列得非常好。我仍然需要理解为什么两个测地2ECEF函数给出不同的结果。