如何将相机坐标转换为DataVisualization Extension创建Sprite的匹配坐标?
解决相机坐标与DataVisualization Extension Sprite坐标不匹配的问题
核心原因:
navigation.getPosition()返回的是笛卡尔世界坐标(Cartesian3),而DataVisualization创建Sprite时默认使用地理坐标(经纬度+高程,即LatLng),二者坐标系基准不同,需要转换统一。转换代码示例:
- 将相机笛卡尔坐标转为地理坐标:
// 获取当前相机的笛卡尔坐标 const cameraPos = NOP_VIEWER.navigation.getPosition(); // 转换为Cesium Cartographic类型(弧度制经纬度+高程) const cartographicPos = Cesium.Cartographic.fromCartesian(cameraPos); // 转为常用的角度制经纬度,保留高程值 const lat = Cesium.Math.toDegrees(cartographicPos.latitude); const lng = Cesium.Math.toDegrees(cartographicPos.longitude); const height = cartographicPos.height; - 用转换后的地理坐标创建Sprite:
// 传入经纬度+高程到DataVisualization的Sprite创建方法 NOP_VIEWER.dataVisualization.addSprite({ position: [lng, lat, height], style: { image: 'your-sprite-icon.png', scale: 1.2 // 其他样式参数 } });
- 将相机笛卡尔坐标转为地理坐标:
反向转换(地理坐标转笛卡尔):
如果需要把DataVisualization Sprite的地理坐标转回相机使用的笛卡尔坐标,可使用:const cartesianPos = Cesium.Cartesian3.fromDegrees(lng, lat, height);
注意:默认情况下Viewer和DataVisualization Extension都基于WGS84坐标系,无需额外配置基准,直接按上述方法转换即可。
内容的提问来源于stack exchange,提问作者HAI MINH
相关产品推荐
相关产品推荐

