如何在Cesium中将x、y、z转换为经度、纬度和高度?

8
使用three.js库,我已经组装了一个设计(植物)。该设计包含许多较小的模型,这些模型具有从原点(0,0,0)引用的位置坐标(x,y,z)。以下链接中附有示例截图。

Assembled Model Ref Image

现在我想将各个模型及其位置加载到Cesium中。当我尝试直接将位置(x,y,z)转换为(north,east,up)进行加载时,结果并不如预期。所有的模型都是分散的。
我要实现的功能是,在某个原点(lon,lat,alt)的基础上,将模型相对于Cesium坐标系(lon,lat,alt)的(x,y,z)定位到cesium中。
例如:
- 原始地理坐标(ori_lon,ori_lat,ori_alt)=>(-106.690647,36.806761,0) - 模型坐标(m_x,m_y,m_z)=>(-150.9,126.26,217.7) - 期望的Cesium坐标:(ori_lon + m_x,ori_lat + m_y,ori_alt + m_z)
或者使用某些算法来实现此目的。
我已经尝试了以下文章,以将(x,y,z)转换为(long,lat,alt),并使用某些原点(long,lat,alt),但没有成功:(

(x, y, z) 坐标 >> 地理坐标

修复问题的建议/帮助。


变得更清晰:https://gis.stackexchange.com/questions/334002/cesium-projection-system 变得更困惑:https://groups.google.com/forum/#!topic/cesium-dev/a7QjKQ1Dt1M - Andrew
2个回答

8
编辑:由于搜索引擎似乎会把人们带到这里寻找笛卡尔坐标和地图投影坐标的转换,我将在此提供答案。

Cartographic.fromCartesian函数是执行此转换的最简单方法。请注意,它将返回一个以弧度表示而不是以度表示的Cartographic,高度以米为单位返回。

var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
console.log(
    'lon ' + Cesium.Math.toDegrees(cartographic.longitude) + ', ' +
    'lat ' + Cesium.Math.toDegrees(cartographic.latitude) + ', ' +
    'alt ' + cartographic.height);

原始答案: 如果您在这里阅读原始问题的细节,那么提问者试图在LLA空间中将坐标相加,这是不正确的。 我在这里的原始答案解释了如何将它们都转换为笛卡尔空间并在那里添加结果。

可以使用Cesium.Cartesian3.fromDegrees来完成此操作。

var position = Cesium.Cartesian3.fromDegrees(-106.690647, 36.806761, 0);
var offset = new Cesium.Cartesian3(-150.9, 126.26, 217.7);
Cesium.Cartesian3.add(position, offset, position);

根据offset所在的坐标系,可能需要进行旋转才能应用于全局笛卡尔空间。例如,如果它是东北天坐标系,则可以使用相应的函数创建并应用该变换。

2
你的代码实现了LLA到XYZ的转换,但问题要求实现XYZ到LLA的转换。 - ekerner
1
是的,原问题提出者试图采用错误的方式,将x/y/z偏移转换为LLA以便在LLA空间中进行模型偏移,这是不正确的。我的答案通过将LLA位置转换为Cartesian3并在那里添加Cartesian偏移来翻转此操作,这是他的情况所需的。Cesium确实包含两种转换方法,如果您愿意,我可以编辑我的答案以包括另一种方法的详细信息。 - emackey

3

Cartesian3转经纬度,以防万一需要

function toDegrees(cartesian3Pos) {
  let pos = Cesium.Cartographic.fromCartesian(cartesian3Pos)
  return [pos.longitude / Math.PI * 180, pos.latitude / Math.PI * 180]
}

console.log(toDegrees({
  x: -1681498.1800000381,
  y: 4576516.394998055,
  z: 4098410.649998016
})) // [110.17428132202518, 40.23966923800238]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接