首页 / 浏览问题 / 三维GIS / 问题详情
cesium 地形后坐标及屏幕坐标位置获取
28EXP 2020年08月30日
在有地形的cesium上,加载entity后,根据entity的所在屏幕位置添加一个跟随漂移的div。在没有地形情况下,div能够和entity重合在一起漂移,有地形的话div和entity不在一起。

鼠标点击获取的entity数据:cartesian = x: -96074.14568124061, y: 5551244.187686776, z: 3146643.211928328

entity添加时候的position:cartesian = x: -95969.48525969112, y: 5548142.899409168, z: 3144945.1329337396

根据pt = Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene, cartesian);获取屏幕位置用来定位div,由于在有地形情况下cartesian不一样,pt在屏幕位置就错位了。

谢谢!

2 个回答

您好,位置的偏差一般都是由于定位点坐标与底图坐标不一致导致的。关于坐标点转换您可以参考这篇博客:https://blog.csdn.net/qq_34149805/article/details/78393540

6,077EXP 2020年08月31日
谢谢回复。

在有地形情况下,如果获取某个经纬度的屏幕坐标。有地形和无地形两种情况下,该经纬度屏幕坐标是一样的吗?

这个问题我也遇到了,

var position = Cesium.SceneTransforms.wgs84ToWindowCoordinates(_this.viewer.scene, positionC3)

添加地形前后,屏幕上entity的位置变化了,但entity转换的屏幕坐标是一样的,所以弹窗对不上。

原因是因为添加地形后,viewer.scene发生了变化,所以需要用scene把笛卡尔三重新转换一下:

var cartographic= _this.viewer.scene.globe.ellipsoid.cartesianToCartographic(positionC3);
var cartesian3 = Cesium.Cartesian3.fromDegrees(
    Cesium.Math.toDegrees(cartographic.longitude),
    Cesium.Math.toDegrees(cartographic.latitude),
    Math.round((_this.viewer.scene.globe.getHeight(cartographic)) * 100) / 100
);
var position = Cesium.SceneTransforms.wgs84ToWindowCoordinates(_this.viewer.scene, cartesian3 )

用通过scene转换一遍的cartesian3再求屏幕坐标,就是准确的坐标

5EXP 2021年02月24日
...