Cesium根据经纬度获得该位置的实体+实体闪烁

本文讨论了如何使用Cesium库将经纬度数据转换为屏幕坐标并拾取实体,同时提到飞行效果可能导致坐标不准确的问题,以及场景视角变化对坐标计算的影响。
摘要由CSDN通过智能技术生成

能拿到实体的经纬度数据可以反过来计算这一经纬度在地球上的高度,根据经纬度高度再去计算笛卡尔坐标系下的坐标,再将笛卡尔坐标转换成屏幕坐标,用这个屏幕坐标去拾取当前屏幕上这个位置的实体
闪烁的效果实现的很粗糙,就是拿到实体数据之后设置延时来改变实体的颜色
也可以加上飞行效果,让视角调整到显示该实体

补充说明
后来使用这个功能的时候,发现加上飞行效果之后计算得到的实体不准确。这个核心就是坐标转换,把计算出来的世界坐标转换成屏幕坐标,但是如果你的这个世界坐标不在当前屏幕显示的范围内就没有办法拾取到这个实体。还有一种情况就是,在计算的过程中场景视角移动了,那么计算出来的屏幕坐标可能就不准确了那么就可能拾取不到你想要拾取的实体

        let position = null
        let pickedObject = null
        let retrievedEntity = null
      	//  根据经纬度计算高度
        let baseHeight = viewer.scene.sampleHeight(
          new Cesium.Cartographic(
            Cesium.Math.toRadians(lng), 
            Cesium.Math.toRadians(lat) 
          )
        );
        position = Cesium.Cartographic.fromDegrees(lng, lat, baseHeight);
        let cartesian3 = Cesium.Ellipsoid.WGS84.cartographicToCartesian(position);
        let cartesian2 = Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene, cartesian3);
        // 转成屏幕坐标
        pickedObject = viewer.scene.pick(cartesian2);
        retrievedEntity = pickedObject
        // 拿到实体
        retrievedEntity = pickedObject.id
        //  模拟闪烁效果
        retrievedEntity.polygon.material = Cesium.Color.LIME;
            setTimeout(()=>{
              retrievedEntity.polygon.material =  Cesium.Color.YELLOW.withAlpha(0.8)
            },500)
            setTimeout(()=>{
              retrievedEntity.polygon.material = Cesium.Color.LIME
            },1000)
              setTimeout(()=>{
              retrievedEntity.polygon.material =  Cesium.Color.YELLOW.withAlpha(0.8)
            },1500)
            setTimeout(()=>{
              retrievedEntity.polygon.material = Cesium.Color.LIME
            },2000)
              setTimeout(()=>{
              retrievedEntity.polygon.material =  Cesium.Color.YELLOW.withAlpha(0.8)
            },2500)
                 setTimeout(()=>{
               retrievedEntity.polygon.material = Cesium.Color.LIME
            },3000)
              setTimeout(()=>{
              retrievedEntity.polygon.material =  Cesium.Color.YELLOW.withAlpha(0.8)
            },3500)
                 setTimeout(()=>{
               retrievedEntity.polygon.material = Cesium.Color.LIME
            },4000)
              setTimeout(()=>{
              retrievedEntity.polygon.material =  Cesium.Color.YELLOW.withAlpha(0.8)
            },4500)
  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值