cesium 绑定dom弹窗(跟随模型)

思路:
1.在页面中创建一个div标签;
2.确定标签在三维场景中的三维位置;并计算三维位置的屏幕坐标;
3.在每一帧的渲染中都计算一下这个三维坐标的屏幕位置,并把屏幕位置赋给标签。
4.当转到地球背面时,如果不想显示弹窗,则隐藏。
具体实现:
1.创建div标签
标签样式:

  .tag{
            position: absolute;
            background-color: MidnightBlue;
            background-color:rgba(0,10,40);
            border-top-left-radius: 10px;
            border-bottom-right-radius:10px;
            opacity: 0.5;
            font-size: 4px;
            color: aqua;
            width: 36px;
            height: 44px;
            padding: 1px 1px 1px;
        }

创建div时,最好是id和它要跟随的对象一致,方便场景中查找位置:

     //txt1 txt2 txt3 为div中要显示的文本,具体样式可修改 innerHTML那一行
    function addDom(id,txt1, txt2, txt3,) {
      let addDivDom = document.createElement('div');
      let bodyDom = document.getElementsByClassName("cesium-viewer")[0];
      bodyDom.insertBefore(addDivDom, bodyDom.lastChild);
      addDivDom.classList = 'tag';
      addDivDom.id = id;
      addDivDom.innerHTML = '<span style="color:white;font-size: 10px;padding: 5px">' + txt1 + '</span>' + '<span style="font-size: 11px;font-weight: bold">' + txt2 + '</span>' + '<p style="padding: 5px;margin-top: -3px;">' + txt3 + '</p>';
     }

2.确定标签在三维场景中的位置并转为屏幕坐标

    //三维笛卡尔坐标转屏幕坐标
    function transPosition(position) {
      return Cesium.SceneTransforms.wgs84ToWindowCoordinates(scene, position);
    }
    

(1).指定位置(经纬度)

    function fixDomPosition(domId,position){
        var dom=document.getElementById(domId);
        var cartesian=Cesium.Cartesian3.fromDegrees(position.longitude,position.latitude,position.height);
        var winPosi = transPosition(cartesian);
        if(winPosi!==undefined&&winPosi!==null){
          dom.style.display=""
          dom.style.left=winPosi.x+"px";
          dom.style.top=winPosi.y+"px";
        }else{
          dom.style.display="none"
        }
    }

(2).跟随相同ID的模型

    function modelFixDom(domId) {
      var entity=viewer.entities.getById(domId);
      var cartesian = entity.position._value;
      var dom=document.getElementById(domId);
      var winPosi = transPosition(cartesian);
      if(winPosi!==undefined&&winPosi!==null){
        dom.style.display=""
        dom.style.left=winPosi.x+"px";
        dom.style.top=winPosi.y+"px";
      }else{
        dom.style.display="none"
      }
    }

3.在每一帧的渲染中都计算一下这个三维坐标的屏幕位置,并把屏幕位置赋给标签。

    viewer.scene.preRender.addEventListener(function () {
      modelFixDom("modelDom");
      var position=new Cesium.Cartographic(116.587678,40.56756,0);
      fixDomPosition("fixDom",position);
    })

4.如果不想地球转到背面仍显示标签,则加个判断距离判断

    function modelFixDom(domId) {
      var entity=viewer.entities.getById(domId);
      var cartesian = entity.position._value;
      var dom=document.getElementById(domId);
      var winPosi = transPosition(cartesian);
      if(winPosi!==undefined&&winPosi!==null){
        var res = enableShow(cartesian);
        if(res){
            dom.style.display=""
            dom.style.left=winPosi.x+"px";
            dom.style.top=winPosi.y+"px";
        }else{
            dom.style.display="none"
        }
        
      }else{
        dom.style.display="none"
      }
    }
   function enableShow(cartesian){
       var res=false;
       var e = cartesian,
       f = viewer.scene.camera.position,
       g = viewer.scen
  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Cesium点位弹窗跟随点位移动是指在Cesium地图上,当我们点击一个具体的点位时,会弹出一个弹窗,同时该弹窗会随着点位的移动而保持在该点位附近。这个功能在展示地理信息的应用中非常常用。 实现这个功能,我们可以借助Cesium的实体(Entity)功能。首先,我们需要创建一个实体来表示点位。实体可以包含很多属性,比如位置、图标、标签等。接下来,在点击该点位时,我们可以通过监听该实体的点击事件来触发弹窗的显示和隐藏。同时,我们还需要监听实体的移动事件,以便在点位移动时,及时更新弹窗的位置。 具体地,我们可以使用Cesium的Viewer对象来创建地图,然后创建一个Cesium.Entity对象来表示我们的点位。接着,我们可以通过添加监听事件来实现点击弹窗跟随移动的功能。当点击该点位时,我们可以通过设置弹窗的CSS样式来实现显示,同时设置弹窗的位置为当前点位的位置。当点位移动时,我们可以监听实体的位置属性的改变,通过更新弹窗的位置属性来实现跟随移动,即弹窗的位置始终保持在点位的附近。 总结来说,实现Cesium点位弹窗跟随点位移动的功能,需要通过监听实体的点击事件来显示和隐藏弹窗,同时通过监听实体的位置属性的改变来更新弹窗的位置。这样就可以实现一个点位弹窗,在点位移动时保持在点位的附近随着点位移动的效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值