最近在做cesium的气泡弹窗,找到作者:zlx312 原文:https://blog.csdn.net/zlx312/article/details/79824940?utm_source=copy 写的比较好的博客,并按照教程实现了,在此感谢并转载记录以后备用!

(在借鉴过程中出现两个问题,通过查询资料解决了,主要由以下三点,

(1)因为刚开始做地图,刚开始找不到scene是哪里定义的,后台查询资料确定 var scene = viewer.scene;

(2) 可能是版本问题,我使用文中的

var handler3D = new Cesium.ScreenSpaceEventHandler(scene.canvas);
   handler3D.setInputAction(function(movement) {           }定义鼠标事件一直诶成功,后来使用如下方法实现:

viewer.cesiumWidget.screenSpaceEventHandler.setInputAction(getLittleWindow,Cesium.ScreenSpaceEventType.RIGHT_CLICK);

(3)可能是一些经纬度设置转化的差异,在文中的var cartographic = Cesium.Cartographic.fromCartesian(movement.position);我一直是失败,查询了一些资料(https://blog.csdn.net/u012123612/article/details/78621498?utm_source=copy )发现需要在这一步前面添加:

var cartesian=viewer.camera.pickEllipsoid(evt.position,viewer.scene.globe.ellipsoid);
var cartographic=Cesium.Cartographic.fromCartesian(cartesian);

由于我们实现过程中的一些设置会有差异,因此如需参考,读者可首先根据@zlx312 博客中的方法试试,如果不行可以尝试我的一些修改方法,如上两点。

下面是zlx312 博客原内容,希望对君有用:

在Web GIS开发的过程中,我们非常需要一个信息窗口去展示点击实体的功能,Cesium自带的InfoWindow是比较方便调用的,但是有很多局限性:比如它只能出现在右上角;比如它的样式不太美观;比如它的按钮无法响应js的onclick事件~

这个时候我就在想百度地图、高德地图的SDK多好用啊,气泡两行代码就可以生成了~在我百思不得解的时候,cesium交流群里的大大们告诉我——自定义气泡窗口。听起来非常麻烦呢,于是我就马不停蹄地开始实践啦~

思想和部分核心代码参考GIS之家的博文cesium自定义气泡窗口infoWindow后续优化篇点击打开链接 ,非常有启发性的一篇文章,这里就不再赘述了,不过GIS之家的文章非常简练,作为小白的我刚开始是一头雾水的。本章主要是对附上我经过几日的努力编写出的完整实现代码,以供大家参考。

CSS

@CHARSET "UTF-8";
/*leaflet风格气泡窗口样式模板*/
.leaflet-popup {
    position: absolute;
    text-align: center;
}
.leaflet-popup-close-button {
    position: absolute;
    top: 0;
    right: 0;
    padding: 4px 4px 0 0;
    text-align: center;
    width: 18px;
    height: 14px;
    font: 16px/14px Tahoma, Verdana, sans-serif;
    color: #c3c3c3;
    text-decoration: none;
    font-weight: bold;
    background: transparent;
}
.leaflet-popup-content-wrapper {
    text-align: center;
    max-height: 200px;
    overflow-y: auto;
    background: white;
    box-shadow: 0 3px 14px rgba(0,0,0,0.4);
    padding: 1px;
    text-align: left;
    border-radius: 12px;
}
.leaflet-popup-content {
    margin: 13px 19px;
    line-height: 1.4;
}
.leaflet-popup-tip-container {
    margin: 0 auto;
    width: 200px;
    height: 100px;
    position: relative;
    overflow: hidden;
}
.leaflet-popup-tip {
    background: white;
    box-shadow: 0 3px 14px rgba(0,0,0,0.4);
    width: 17px;
    height: 17px;
    padding: 1px;
    margin: -10px auto 0;
    -webkit-transform: rotate(45deg);
    -moz-transform: rotate(45deg);
    -ms-transform: rotate(45deg);
    -o-transform: rotate(45deg);
    transform: rotate(45deg);
}
 
/*按钮样式*/
.add-button{
    
}
/**
 * 动态添加气泡窗口
 */
var removeHandler;
var content;
var autoInfoWindow;
 var infoDiv = '<div id="trackPopUp" style="display:none;">'+
                             '<div id="trackPopUpContent" class="leaflet-popup" style="top:5px;left:0;">'+
                               '<a class="leaflet-popup-close-button" href="#">×</a>'+
                               '<div class="leaflet-popup-content-wrapper">'+
                                 '<div id="trackPopUpLink" class="leaflet-popup-content" style="max-width: 300px;"></div>'+
                               '</div>'+
                               '<div class="leaflet-popup-tip-container">'+
                                 '<div class="leaflet-popup-tip"></div>'+
                               '</div>'+
                             '</div>'+
                           '</div>';
             $("#cesiumContainer").append(infoDiv);
    
            var handler3D = new Cesium.ScreenSpaceEventHandler(scene.canvas);
            handler3D.setInputAction(function(movement) {                        
                var pick = scene.pick(movement.position);
                if(pick && pick.id){
                    console.log(pick.id);
                    $('#trackPopUp').show();
                    var cartographic = Cesium.Cartographic.fromCartesian(movement.position);
                    var point=[cartographic.longitude / Math.PI * 180, cartographic.latitude / Math.PI * 180];
                    var destination=Cesium.Cartesian3.fromDegrees(point[0], point[1], 3000.0);
                        var id=pick.id._id.replace(/[^0-9]/ig,"");
                        content = 
                         '<table><tbody><tr><th style="color:black;">'+pick.id._name+'</th><td><button style="color:black;" οnclick="updateValve('+id+')">确定</button></td><td><button οnclick="deleteValve('+id+')" style="color:black;">删除</button></td></tr>'+
                         '<tr><th style="color:black;">类型</th><td><input style="color:black;" value='+station[id].stadianame+'></td></tr>'+
                         '<tr><th style="color:black;">经度</th><td><input id="x" style="color:black;" value='+station[id].x.toFixed(6)+'></td></tr>'+
                         '<tr><th style="color:black;">纬度</th><td><input id="y" style="color:black;" value='+station[id].y.toFixed(6)+'></td></tr>'+
                 '</tbody></table>'    
                var obj = {position:movement.position,destination:destination,content:content};
                infoWindow(obj);
                
                 function infoWindow(obj) {
                                var picked = scene.pick(obj.position);
                                if (Cesium.defined(picked)) {
                                    var id = Cesium.defaultValue(picked.id, picked.primitive.id);
                                    if (id instanceof Cesium.Entity) {
                                        $(".cesium-selection-wrapper").show();
                                        $('#trackPopUpLink').empty();
                                        $('#trackPopUpLink').append(obj.content);
                                        function positionPopUp (c) {
                                            var x = c.x - ($('#trackPopUpContent').width()) / 2;
                                            var y = c.y - ($('#trackPopUpContent').height());
                                            $('#trackPopUpContent').css('transform', 'translate3d(' + x + 'px, ' + y + 'px, 0)');
                                        }
                                        var c = new Cesium.Cartesian2(obj.position.x, obj.position.y);
                                        $('#trackPopUp').show();
                                        positionPopUp(c); // Initial position
                                                            // at the place item
                                                            // picked
                                        removeHandler = viewer.scene.postRender.addEventListener(function () {
                                            if(picked.id._polyline!=null){
                                                var pos={};
                                                pos.x=(id._polyline._positions._value["0"].x+id._polyline._positions._value[1].x)/2;
                                                pos.y=(id._polyline._positions._value["0"].y+id._polyline._positions._value[1].y)/2;
                                                pos.z=(id._polyline._positions._value["0"].z+id._polyline._positions._value[1].z)/2;
                                                var changedC = Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene,pos);
                                            }else{
                                                var changedC = Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene, id._position._value);
                                            }// If things moved, move the
                                                // popUp too
                                            if ((c.x !== changedC.x) || (c.y !== changedC.y)) {
                                                positionPopUp(changedC);
                                                c = changedC;
                                            }
                                        });
                                        // PopUp close button event handler
                                        $('.leaflet-popup-close-button').click(function() {
                                            $('#trackPopUp').hide();
                                            $('#trackPopUpLink').empty();
                                            $(".cesium-selection-wrapper").hide();
                                            removeHandler.call();
                                            return false;
                                        });                                
                                        return id;
                                    }
                                }            
                     }  
                }
                else{
                    $('#trackPopUp').hide();
                   
                }
            }, Cesium.ScreenSpaceEventType.LEFT_CLICK);            
JS部分如上,我的后端是Java写的,从数据库中一次性取出了所有信息存为JSON,方便调用

该气泡窗会随着缩放移动而动态改变,也可以响应js jquery的点击事件,如果觉得样式单调,自行美化CSS就可以了,非常方便~

效果如下

备注:地图上的点线是我通过将cad文件直接解析为json进行读取的,如果有必要的话后面的文章也会写一下过程(虽然可能太简单了没人看哈哈)
--------------------- 
作者:zlx312 
来源:CSDN 
原文:https://blog.csdn.net/zlx312/article/details/79824940?utm_source=copy 
版权声明:本文为博主原创文章,转载请附上博文链接!

(转载)cesium的气泡弹窗,已实现相关推荐

  1. qpython3h手机版 写弹窗代码_Android Q之气泡弹窗的实现示例

    在Android Q中,用户可以借助气泡,轻松地在设备上任何位置进行多任务处理.气泡内置于"通知"系统中,它会浮动在其他应用的上层,并会跟随用户的移动而移动到屏幕的任何位置,用于取 ...

  2. Android Q之气泡弹窗

    在Android Q中,用户可以借助气泡,轻松地在设备上任何位置进行多任务处理.气泡内置于"通知"系统中,它会浮动在其他应用的上层,并会跟随用户的移动而移动到屏幕的任何位置,用于取 ...

  3. vue-directive 自定义指令实现popover气泡弹窗

    vue 自定义指令实现popover气泡弹窗 效果展示 1 .写好 popover 组件 2.创建 自定义指令 popover.js 文件 <!--v-popover指令--> <t ...

  4. Cesium构造popup弹窗函数

    初学Cesium,发现没有自带的popup方法,从网上找资料自己写了一个,供大家参考 先上效果,样式方面大家可以自行发挥 构造函数 class Popup {constructor(info) {th ...

  5. cesium 设置时间_Cesium 车辆跟踪事件气泡弹窗一直开启

    展示图: 功能思路: (1)设置创建时钟组件JulianDate,该时间组件很重要,不仅是用来追踪路线使用,还要监听每个时间点到达的坐标位置. (2)气泡的实时根据坐标刷新,上一篇有说到,根据当前时间 ...

  6. Cesium 车辆跟踪事件气泡弹窗追随

    展示图: 功能思路: (1)设置创建时钟组件JulianDate,该时间组件很重要,不仅是用来追踪路线使用,还要监听每个时间点到达的坐标位置. (2)气泡的实时根据坐标刷新,上一篇有说到,根据当前时间 ...

  7. 转载---Cesium简介

    转载---https://blog.csdn.net/mrib/article/details/78260971 Cesium是什么 Cesium 是一款面向三维地球和地图的,世界级的JavaScri ...

  8. [转载]《科幻世界》那些已消失的作者

    看知乎日报突然想起了当年上学在图书馆看科幻世界的日子- 转载篇文章吧 原文连接:http://blog.renren.com/share/258295456/792872881 前几日,在整理书架过程 ...

  9. [转载]致创业者:APP已死 服务永生

    前几日,有位创业者和我讲他在带领团队做一个将爱踢球的人集中在一起的App,我告诉他你的创业方向错了.原因在于你的目的是要为爱踢球的人提供服务,而你现在却在竭尽全力的做App,你应该做的是设计你为爱踢球 ...

最新文章

  1. 太嚣张了!会Python的人!
  2. idea 设置光标回到上一次位置的快捷键
  3. python网页爬虫-Python网页爬虫
  4. mysql五大引擎之间的区别和优劣之分
  5. myeclipse中的classpath .
  6. 不适合学计算机的理由,哪些人不适合学计算机 原因是什么
  7. Python爬虫_BeauifulSoup
  8. c语言串口通信_STM32串口IAP分享
  9. [经验教程]iPhone苹果手机iOS系统App Store怎么下载手机APP到苹果iPhone手机?
  10. Android KeyStore的使用
  11. tempo jsnode扩展 3d图形支持。
  12. 小白爬虫入门~python爬取职友集招聘职位信息
  13. java word 颜色设置_Java 给Word文档添加背景颜色
  14. java添加zip并下载,java - 使用java创建zip并使其可下载。 - SO中文参考 - www.soinside.com...
  15. 23.5 MySQL架构
  16. 【ArcGIS|空间分析】空间分析准备流程
  17. Spring Boot应用集成Docker并结合Log4j2、Kafka、ELK管理Docker日志
  18. 创建react项目 Linux,idea2018 快速搭建react项目指南
  19. 哈佛凌晨四点半...
  20. 基于SSM实现停车位租赁系统

热门文章

  1. 职业股票交易利器:通达信使用软件篇
  2. 进度条实时显示request下载文件的解决方案
  3. blackbox_exporter+grafana+prometheus监控主机存活,端口存活及网站状态
  4. 从 chromium 源码来窥探浏览器的渲染
  5. java计算机毕业设计人口普查信息管理系统源码+系统+数据库+lw文档+mybatis+运行部署
  6. 图片格式转换,JPG图片转换成PDF
  7. 《恶意代码分析实战》第3章 动态分析基础技术(课后实验Lab 3)
  8. 从0到1搭建一台属于个人的服务器,永久可运行!
  9. win10与子系统ubuntu之间的相互访问
  10. 开源项目-旅游信息管理系统