cesium 地形后坐标及屏幕坐标位置获取

0 投票
在有地形的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在屏幕位置就错位了。

谢谢!
8月 30, 2020 分类:  1136次浏览 | 用户: defineconst 初出茅庐 (28 分)

2 个回答

0 投票

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

8月 31, 2020 用户: 卷饼先生 名扬四海 (4,858 分)
谢谢回复。

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

这个问题我也遇到了,

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再求屏幕坐标,就是准确的坐标

2月 24 用户: 1376417288 (5 分)
...