cesium自定义气泡窗口infoWindow后续优化篇

http://www.cnblogs.com/giserhome/p/6248858.html
该篇文章实现的自定义气泡窗口是基于修改cesium源代码基础上,这种做法只是援兵之计,凑合应付的,投机取巧罢了,实际上是不太适合的,cesium api更新版本替换,又得手动的去设置一下源代码;本篇则是从另一个角度真正的实现了自定义气泡窗口,气泡窗口的样式定义则是leaflet风格的,效果截图如下:

具体实现思路:

1.气泡窗口css样式

/*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: 40px;
    height: 20px;
    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);
}

2.气泡窗口div面板

//动态添加气泡窗口DIV
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>‘;
$("#"+cesium.mapDivId).append(infoDiv);

气泡窗口div面板看实际情况的,也可以设置在页面html里面,我这里由于需要,是在js动态添加进来的。

3.核心的实现思路部分:如何动态刷新气泡窗口的位置

(1)cesium的点击事件Cesium.ScreenSpaceEventType.LEFT_CLICK监听鼠标的当前位置坐标,然后根据当前坐标去动态更新气泡窗口div的显示位置;

(2)监听cesium的postRender变化事件,这里特别关键,因为你拖拽球体移动,气泡窗口div也要对应移动的,气泡窗口的位置变化跟cesium球体是要动态刷新的;

附上部分关键代码:

cesium点击事件,获取当前位置

            handler3D.setInputAction(function(movement) {
                //点击弹出气泡窗口
                var pick = cesium.cesiumViewer.scene.pick(movement.position);
                if(pick && pick.id){//选中某模型
                }
                else{
                    $(‘#trackPopUp‘).hide();
                }
            }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
            //加载3D模型

新气泡窗口的位置更新

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)‘);
}

postRender变化事件

var removeHandler = viewer.scene.postRender.addEventListener(function () {
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)) {
c = changedC;
}
});
时间: 2024-10-05 10:11:27

cesium自定义气泡窗口infoWindow后续优化篇的相关文章

arcgis api for js入门开发系列二十一气泡窗口信息动态配置模板

前面地图查询篇实现图层查询query功能,但是查询结果的气泡窗口展示信息是在代码写死绑定图层的字段来的,比如name属性字段对应的值.但是这种实现方式很不灵活,对于图层字段不变的情况下或者多个图层字段名称都是一致情况下,还好,代码也不用变动:要是图层字段新增或者删除以及多个图层的字段不一致情况下,每次改动,查询结果的js代码也要对应的修改,对于维护来说,挺不方便的.所以,本篇优化一下气泡窗口的信息模板,采取动态可配置化图层字段方式,在配置文件里面配置好图层需要展示的字段模板,比如在mapconf

画图工具之优化篇

import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; /** * 1.新建一个LoginListener事件处理类, * 该类实现M

百度地图JavaScript API自定义覆盖物、自定义信息窗口增删时的显示问题

项目中,需求:在百度地图上实时画出车辆,并能点击车辆弹出信息框查看实时信息. 实现:通过不停的画覆盖物并删除掉.点击覆盖物时弹出信息窗口. 问题:删除掉覆盖物后信息窗也删除掉了.因为信息窗是建立在覆盖物的基础上的. 如何做到,我点击覆盖物弹出信息框,信息框能够持续显示实时信息,直到点击关闭? 做下笔记,包括了自定义覆盖物标识.自定义信息窗口.信息窗口显示实时信息.清除覆盖物时信息窗口的显示问题等等. 贴张效果图:     代码: <script type="text/javascript&

nginx优化篇之Linux 内核参数的优化

原博客地址(欢迎访问):http://www.loveyqq.tk/blog/2014/05/27/nginxyou-hua-pian-zhi-linux-nei-he-can-shu-de-you-hua/ 由于默认的Linux内核参数考虑的是最通用的场景,这明显不符合用于支持高并发访问的Web服务器的定义,所以需要修改Linux内核参数,使得Nginx可以拥有更高的性能. 在优化内核时,可以做的事件很多,不过,我们通常会根据业务特点来进行调整,当Nginx作为静态Web内容服务器.反向代理服

Android 优化篇

http://my.oschina.net/u/586684/blog/207844 1. 使用保守的Service 2. 当视图变为隐藏状态后释放内存: 当用户跳转到不同的应用并且你的视图不再显示时, 你应该释放应用视图所占的资源. 这时释放所占用的资源能显著的提高系统的缓存处理容量, 并且对用户的体验质量有直接的影响. 使用优化后的数据容器: 比如 SparseArray, SparseBooleanArray 和 LongSparseArray. 传统的 HashMap 在内存上的实现十分

【转】Android性能优化之布局优化篇

转自:http://blog.csdn.net/feiduclear_up/article/details/46670433 Android性能优化之布局优化篇 分类: andorid 开发2015-06-29 16:28 238人阅读 评论(0) 收藏 举报 性能布局viewStubinclude布局优化 目录(?)[-] Hierarchy View检测布局嵌套层次 显示GPU过度绘制 懒加载布局 ViewStub Android Lint 工具 怎样才能写出优秀的Android App,是

Android 优化 篇

Android应用程序窗口(Activity)的运行上下文环境(Context)的创建过程分析 1. 能用 Application  的 上下文 就用. 因为如果用 Activity 的 Context ,如果用太多的 Activity, 如果 有些资源 还在引用 Activity的context的资源,会导致 这个 Activity 没有被回收,有可能导致 oom. 2. bitmap 回收 3. Dialog 用完之后, dismiss 之后,设为 null. 4. 图片不要做内存缓存,可以

Android学习之——优化篇(2)

一.高级优化 上篇主要从初级优化的方式,本篇主要将从程序运行性能的角度出发,分析各种常用方案的不足,并给出对象池技术.基础数据类型替换法.屏蔽函数计算三种能够节省资源开销和处理器时间的优化策略. 目前普遍采用的优化方案有:     · 优化循环,通过重新组织重复的子表达式来提高循环体的运行性能     · 减少使用对象的数量来提高运行性能     · 缩减网络传输数据来缩短等待时间等 本篇学习另外三种性能优化的策略:     1. 采用对象池技术,提高对象的利用率 Java 中创建和释放对象会占

【朝花夕拾】Android性能优化篇之(一)序言及JVM篇

序言        笔者从事Anroid开发有些年头了,深知掌握Anroid性能优化方面的知识的必要性,这是一个程序员必须修炼的内功.在面试中,它是面试官的挚爱,在工作中,它是代码质量的拦路虎,其重要性可见一斑.在团队中,性能优化的工作又往往由经验丰富的老师傅来完成,可见要做好性能优化,绝不是一件容易的事情. 性能优化方面涉及的知识点比较广,有理论基础知识,也有实际操作技能,笔者将通过一系列的文章来进行整理,将主要包括Java虚拟机.内存分配.垃圾回收,android虚拟机.进程管理.内存优化.