Cesium实现Popup弹窗功能

先展示一下效果,大家可以通过修改样式文件,整点更好看的弹窗。我的审美一直是被吐槽的。。

  • 方法创建
    这里创建了Popup构造函数,用于创建Popup对象,并对对象内部的逻辑方法进行封装。实现的方法是在Cesium创建的View对象内动态添加一个弹窗元素,通过不断获取Popup弹窗绑定的空间座标,然后转换成页面相对座标来修改弹窗的位置。
     // 创建弹窗对象的方法
        var Popup = function(info){
            this.constructor(info);
        }
        Popup.prototype.id=0;
        Popup.prototype.constructor = function(info){
            var _this = this;
            _this.viewer = info.viewer;//弹窗创建的viewer
            _this.geometry = info.geometry;//弹窗挂载的位置
            _this.id ="popup_" +_this.__proto__.id++ ;
            _this.ctn = $("<div class='bx-popup-ctn' id =  '"+_this.id+"'>");
            $(_this.viewer.container).append( _this.ctn);
            //测试弹窗内容
            var testConfig = {
                header:"测试数据",
                content:"<div>测试窗口</div>",
            }
            _this.ctn.append(_this.createHtml(testConfig.header,testConfig.content));
            
            _this.render(_this.geometry);
            _this.eventListener = _this.viewer.clock.onTick.addEventListener(function(clock) {
                _this.render(_this.geometry);
            })
        }
        // 实时刷新
        Popup.prototype.render = function(geometry){
            var _this = this;
            var position = Cesium.SceneTransforms.wgs84ToWindowCoordinates(_this.viewer.scene,geometry)
            _this.ctn.css("left",position.x- _this.ctn.get(0).offsetWidth/2);
            _this.ctn.css("top",position.y- _this.ctn.get(0).offsetHeight - 10);
        }
        // 动态生成内容
        Popup.prototype.createHtml = function(header,content){
                var html = '<div class="bx-popup-header-ctn">'+
                header+
                '</div>'+
                '<div class="bx-popup-content-ctn" >'+
                '<div class="bx-popup-content" >'+    
                content+
                '</div>'+
                '</div>'+
                '<div class="bx-popup-tip-container" >'+
                '<div class="bx-popup-tip" >'+
                '</div>'+
            '</div>'+
            '<a class="leaflet-popup-close-button" >X</a>';
            return html;
        }
        // 关闭弹窗按钮
        Popup.prototype.close=function(){
            var _this = this;
            _this.ctn.remove();
            _this.viewer.clock.onTick.removeEventListener( _this.eventListener );
        }

     

  • 样式修改
    一些基础的样式修改,让你的弹窗更像弹窗,而后你也可以在此基础上进行修改,让你的弹窗更美观。
    .bx-popup-ctn{
        position: absolute;
        z-index: 999;
        background: #fff;
    }
    .bx-popup-tip-container {
        width: 40px;
        height: 20px;
        position: absolute;
        left: 50%;
        margin-left: -20px;
        overflow: hidden;
        pointer-events: none;
    }
    .bx-popup-tip {
        width: 17px;
        background: #fff;
        height: 17px;
        padding: 1px;
        margin: -10px auto 0;
        -webkit-transform: rotate(45deg);
        -moz-transform: rotate(45deg);
        -ms-transform: rotate(45deg);
        transform: rotate(45deg);
    }
    .bx-popup-header-ctn{
        background: #090302;
        color: #fff;
        font-size: 15px;
        padding: 4px;
    }
    .bx-popup-content-ctn{
        padding:15px ;
    }
    .leaflet-popup-close-button{
        user-select: auto;
        position: absolute;
        right: 0;
        top: 0;
        color: #fff;
        cursor: pointer;
    }

     

  • 测试代码编写
    我这里采用Cesium的点击事件,获取点击地球对应的座标,然后在这个位置产生一个Popup对象
     // 测试代码,点击地图后,在点击的位置创建弹窗
        var viewer = new Cesium.Viewer('cesiumContainer');
        var handler3D = new Cesium.ScreenSpaceEventHandler(
        viewer.scene.canvas);
        handler3D.setInputAction(function(click){
            console.log("click")
            var pick= new Cesium.Cartesian2(click.position.x,click.position.y);
            if(pick){
                // 获取点击位置座标
                var cartesian = viewer.scene.globe.pick(viewer.camera.getPickRay(pick), viewer.scene);
                if(cartesian){
                    // 调用弹窗方法
                    var popup = new Popup({
                        viewer:viewer,
                        geometry:cartesian
                    })
                }
            }
        }, Cesium.ScreenSpaceEventType.LEFT_CLICK )


    完整的代码可以在我的Github获取https://github.com/privatecp/CesiumPopup

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章