mirror of
				https://github.com/jiawanlong/Cesium-Examples.git
				synced 2025-11-04 01:04:17 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			197 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			197 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/*
 | 
						||
 * @class {Popup} 地图弹窗
 | 
						||
 * @param {viewer} viewer 三维视图
 | 
						||
 * @param {className} string 样式名
 | 
						||
 * */
 | 
						||
 | 
						||
class Popup {
 | 
						||
    constructor(option) {
 | 
						||
        this.options = option;
 | 
						||
        this.viewer = option.viewer; //弹窗创建的viewer
 | 
						||
        this.className = option.className;
 | 
						||
        this.html = option.html || null;
 | 
						||
        this.id = 0;
 | 
						||
        this.ctnList = {};
 | 
						||
    }
 | 
						||
    add(conf) {
 | 
						||
        var _this = this;
 | 
						||
        var geometry = conf.geometry; //弹窗挂载的位置
 | 
						||
        var id = "popup_" + (((1 + Math.random()) * 0x10000) | 0).toString(16) + _this.id++;
 | 
						||
        var ctn = document.createElement('div');
 | 
						||
        ctn.className = "bx-popup-ctn" + (this.className ? " " + this.className : " bx-popup-ctn1");
 | 
						||
        ctn.id = id;
 | 
						||
        document.getElementById(_this.viewer.container.id).appendChild(ctn);
 | 
						||
        //测试弹窗内容
 | 
						||
        var testConfig = conf.content;
 | 
						||
        ctn.innerHTML = _this.createHtml(testConfig.header, testConfig.content, conf.isclose);
 | 
						||
        _this.ctnList[id] = [geometry, ctn];
 | 
						||
        _this.render();
 | 
						||
        // ctn.style.transform = 'translateY(-' + ctn.offsetHeight + 'px)';
 | 
						||
        // if (this.className == "bx-popup-ctn2")
 | 
						||
        // ctn.style.marginLeft = '-' + (ctn.offsetWidth / 2) + 'px';
 | 
						||
        if (!_this.eventListener) {
 | 
						||
            _this.eventListener = function (clock) {
 | 
						||
                _this.render();
 | 
						||
            };
 | 
						||
            _this.viewer.clock.onTick.addEventListener(_this.eventListener)
 | 
						||
        }
 | 
						||
 | 
						||
        if (conf.isclose === false) {} else {
 | 
						||
            if (ctn.getElementsByClassName("bx-popup-close") && ctn.getElementsByClassName("bx-popup-close").length > 0) {
 | 
						||
                ctn.getElementsByClassName("bx-popup-close")[0].onclick = function () {
 | 
						||
                    _this.close(ctn);
 | 
						||
                };
 | 
						||
            }
 | 
						||
        }
 | 
						||
        return ctn;
 | 
						||
    }
 | 
						||
    render() {
 | 
						||
        var _this = this;
 | 
						||
        for (var c in _this.ctnList) {
 | 
						||
            // var s1 = _this.viewer.scene.cartesianToCanvasCoordinates(_this.ctnList[c][0]);
 | 
						||
            var position = Cesium.SceneTransforms.wgs84ToWindowCoordinates(_this.viewer.scene, _this.ctnList[c][0]);
 | 
						||
            // console.log(s1.toString() + " ---- " + position.toString());
 | 
						||
            if (position && position.x && position.y) {
 | 
						||
                if (Math.abs(position.x) > (window.innerWidth * 2) || Math.abs(position.y) > (window.innerHeight * 2)) {
 | 
						||
                    _this.ctnList[c][1].style.display = "none";
 | 
						||
                } else {
 | 
						||
                    _this.ctnList[c][1].style.display = "";
 | 
						||
                    _this.ctnList[c][1].style.left = position.x + "px";
 | 
						||
                    _this.ctnList[c][1].style.top = position.y + "px";
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
    }
 | 
						||
    createHtml(header, content, isclose) {
 | 
						||
        if (this.html) {
 | 
						||
            return this.html(header, content);
 | 
						||
        } else {
 | 
						||
            var html = `
 | 
						||
            ${(isclose === false ? '' : '<div class="bx-popup-close"><span class="iconfont_DEU icon-guanbi">×</span></div>')}
 | 
						||
            <div class="divpoint-wrap">
 | 
						||
            <div class="divpoint-border">
 | 
						||
            <div class="divpoint-center">
 | 
						||
            <div class="bx-popup-header-ctn">
 | 
						||
            ${header}
 | 
						||
            </div>
 | 
						||
            <div class="bx-popup-content-ctn" >
 | 
						||
            <div class="bx-popup-content" >
 | 
						||
            ${content}
 | 
						||
            </div>
 | 
						||
            </div>
 | 
						||
            </div>
 | 
						||
            </div>
 | 
						||
            </div>
 | 
						||
            <div class="directional"></div>
 | 
						||
            `;
 | 
						||
            return html;
 | 
						||
        }
 | 
						||
    }
 | 
						||
    close(e) {
 | 
						||
        e.remove();
 | 
						||
        delete this.ctnList[e.id];
 | 
						||
        if (Object.keys(this.ctnList).length == 0) {
 | 
						||
            this.viewer.clock.onTick.removeEventListener(this.eventListener);
 | 
						||
            this.eventListener = null;
 | 
						||
        }
 | 
						||
    }
 | 
						||
    closeAll(e) {
 | 
						||
        for (var o in this.ctnList) {
 | 
						||
            this.ctnList[o][1].remove();
 | 
						||
        }
 | 
						||
        this.ctnList = {};
 | 
						||
        this.viewer.clock.onTick.removeEventListener(this.eventListener);
 | 
						||
        this.eventListener = null;
 | 
						||
    }
 | 
						||
}
 | 
						||
 | 
						||
/*
 | 
						||
 * @class {Tooltip} 地图弹窗cesium中
 | 
						||
 * @param {opt} 配置 
 | 
						||
 * */
 | 
						||
class Tooltip {
 | 
						||
    constructor(opt) {
 | 
						||
        this.options = {
 | 
						||
            color: 'rgb(32, 160, 255)',
 | 
						||
            stroke: 'rgb(56, 218, 255)',
 | 
						||
            opacity: 0.6,
 | 
						||
            textcolor: 'white',
 | 
						||
            strokewidth: 3,
 | 
						||
            lineheight: 25,
 | 
						||
            fontSize: '14px',
 | 
						||
            x: 15,
 | 
						||
            y: 50,
 | 
						||
            defaultHeight: 200,
 | 
						||
            width: 200,
 | 
						||
        }
 | 
						||
        this.options = Object.assign(this.options, opt);
 | 
						||
        this.tooltipEntitylist = {};
 | 
						||
        this.viewer = opt.viewer; //弹窗创建的viewer
 | 
						||
        this.dataSource = new Cesium.CustomDataSource("tooltipname");
 | 
						||
        this.viewer.dataSources.add(this.dataSource);
 | 
						||
    }
 | 
						||
    add(option) {
 | 
						||
        var this_ = this;
 | 
						||
        var header = option.header,
 | 
						||
            content = option.content;
 | 
						||
        var contlist = content.split("<br/>");
 | 
						||
        var x = this_.options.x,
 | 
						||
            y = this_.options.y,
 | 
						||
            height = this_.options.defaultHeight;
 | 
						||
        var width = option.width || this_.options.width;
 | 
						||
        height = contlist.length * this_.options.lineheight + 10;
 | 
						||
        if (header && header != '') {
 | 
						||
            height += 27;
 | 
						||
        }
 | 
						||
        var cen = '';
 | 
						||
        for (var i = 0; i < contlist.length; i++) {
 | 
						||
            cen += '<tspan x="' + x + '" y="' + y + '">' + contlist[i] + '</tspan>';
 | 
						||
            y += this_.options.lineheight;
 | 
						||
        }
 | 
						||
        var data = `data:image/svg+xml,
 | 
						||
                <svg width="${width+10}" height="${height+30}" version="1.1" xmlns="http://www.w3.org/2000/svg">
 | 
						||
                    
 | 
						||
    <path d=" M${width+5} 15 Q${width+5} 5 ${width+5-10} 5 L15 5 Q5 5 5 15 L5 ${height-10+5} Q5 ${height+5} 15 ${height+5} L${width/2-10+5} ${height+5} ${width/2+5} ${height+20+5} ${width/2+10+5} ${height+5} ${width-10+5} ${height+5} Q${width+5} ${height+5} ${width+5} ${height-10+5} Z"
 | 
						||
     fill="${this_.options.color}" stroke="${this_.options.stroke}" style="${this_.options.strokewidth}:3;opacity:${this_.options.opacity};stroke-opacity:0.8"></path>
 | 
						||
    <path d=" M${width+5} 15 Q${width+5} 5 ${width+5-10} 5 L15 5 Q5 5 5 15 L5 30 ${width+5} 30 Z" 
 | 
						||
    fill="${this_.options.color}" style="opacity:0.5;"></path>
 | 
						||
<text x="15" y="22" fill="${this_.options.textcolor}" style="font-size:${this_.options.fontSize}; font-weight: 600;">${header}</text>
 | 
						||
         <text fill="${this_.options.textcolor}" style="font-size: ${this_.options.fontSize};">
 | 
						||
            ${cen}
 | 
						||
      </text>
 | 
						||
 | 
						||
    </svg>
 | 
						||
    `;
 | 
						||
        var entity = {
 | 
						||
            position: option.position,
 | 
						||
            billboard: {
 | 
						||
                image: data,
 | 
						||
                horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
 | 
						||
                verticalOrigin: Cesium.VerticalOrigin.BOTTOM
 | 
						||
            },
 | 
						||
        };
 | 
						||
        var ety=this_.dataSource.entities.add(entity);
 | 
						||
        var id = option.id || Cesium.createGuid();
 | 
						||
        var tooltip = {
 | 
						||
            id: id,
 | 
						||
            entity: ety,
 | 
						||
            clear: function () {
 | 
						||
                this_.cleartooltip(id)
 | 
						||
            }
 | 
						||
        };
 | 
						||
        this_.tooltipEntitylist[id] = tooltip;
 | 
						||
    }
 | 
						||
 | 
						||
    cleartooltip(id) {
 | 
						||
        var this_ = this;
 | 
						||
        if (id) {
 | 
						||
            this_.dataSource.entities.remove(this_.tooltipEntitylist[id].entity)
 | 
						||
            delete this_.tooltipEntitylist[id]
 | 
						||
        } else {
 | 
						||
            this_.dataSource.entities.removeAll();
 | 
						||
            this_.tooltipEntitylist = {};
 | 
						||
        }
 | 
						||
    }
 | 
						||
}
 | 
						||
 |