加载中…
个人资料
cumtzheNo1
cumtzheNo1
  • 博客等级:
  • 博客积分:0
  • 博客访问:6,876
  • 关注人气:35
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Cesium学习笔记-工具篇01-Tooltip-entity方式

(2018-07-21 17:08:53)
标签:

cesium

tooltip

分类: Cesium
在前面博客我们一起学习了cesium基础接口,从本篇开始,我们学习cesium一些常用工具编写。一些工具是基于现成的开源项目改编,一些是自己造车轮。今天我们学习最基础的一个工具:tooltip。
tooltip实现方式主要分两种:entity和div。
entity:基于cesium提供的entity接口
优点:显示灵活,无鼠标悬浮上面丢失焦点的bug
缺点:遮挡问题
div:基于悬浮的div控件
优点:无遮挡问题
缺点:有鼠标悬浮上面丢失焦点的bug
今天介绍基于entity方式,我们封装TooltipCesium对象:
var TooltipCesium = (function () {
    var isInit = false;
    var viewer;
    var labelEntity;

    function _() { };

    _.initTool = function (_viewer) {
        if (isInit) { return; }
        viewer = _viewer;
        labelEntity = viewer.entities.add({
            position: Cesium.Cartesian3.fromDegrees(0, 0),
            label: {
                text: '提示',
                font: '15px sans-serif',
                pixelOffset: new Cesium.Cartesian2(8, 8),//y大小根据行数和字体大小改变
                horizontalOrigin: Cesium.HorizontalOrigin.LEFT,
                showBackground: true,
                backgroundColor: new Cesium.Color(0.165, 0.165, 0.165, 1.0)
            }
        });
        labelEntity.show = false;
        isInit = true;
    }

    _.setVisible = function (visible) {
        if (!isInit) { return; }
        labelEntity.show = visible ? true : false;
    };

   
    _.showAt = function (position, message) {
        if (!isInit) { return; }
        if (position && message) {
            labelEntity.show = true;
            var cartesian = viewer.camera.pickEllipsoid(position, viewer.scene.globe.ellipsoid);// 
            if (cartesian) {
                labelEntity.position = cartesian;
                labelEntity.show = true;
                labelEntity.label.text = message;
            } else {
                labelEntity.show = false;
            }
        }
    };

   
    _.showAtCartesian = function (cartesian, message) {
        if (!isInit) { return; }
        if (cartesian && message) {
            labelEntity.show = true;
            labelEntity.position = cartesian;
            labelEntity.show = true;
            labelEntity.label.text = message;
        }
    };
    return _;
})();
此工具使用前需要init,传入Cesium.Viewer对象。提供:
setVisible-控制显隐
showAt-显示屏幕坐标
showAtCartesian-显示的世界坐标
基于前面的学习笔记Cesium学习笔记12--鼠标事件我们写了测试示例:
 var esri = new Cesium.ArcGisMapServerImageryProvider({
            url: 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer',
            enablePickFeatures: false
        });

        var viewer = new Cesium.Viewer('cesiumContainer', {
            imageryProvider: esri,
            contextOptions: {
                webgl: {
                    alpha: true
                }
            },
            creditContainer: "creditContainer",
            selectionIndicator: false,
            animation: false,  
            baseLayerPicker: false, 
            geocoder: false, 
            timeline: false, 
            sceneModePicker: true, 
            navigationHelpButton: false, 
            infoBox: false, 
            fullscreenButton: true
        });

        viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);
        viewer.camera.setView({
            destination: Cesium.Cartesian3.fromDegrees(110.20, 34.55, 3000000)
        });
        var scene = viewer.scene;
        var handler = new Cesium.ScreenSpaceEventHandler(scene.canvas);
        var ellipsoid = scene.globe.ellipsoid; 
        var cartesian = null;

        TooltipCesium.initTool(viewer);

        //一 鼠标MOUSE_MOVE
        handler.setInputAction(function (movement) {
            cartesian = viewer.camera.pickEllipsoid(movement.endPosition, ellipsoid);
            if (cartesian) {
                TooltipCesium.showAt(movement.endPosition, 'MOUSE_MOVE');
            } else {
                TooltipCesium.setVisible(false);
            }
        }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);

        //二 LEFT_CLICK
        handler.setInputAction(function (movement) {
            cartesian = viewer.camera.pickEllipsoid(movement.position, ellipsoid);
            if (cartesian) {
                TooltipCesium.showAt(movement.position, 'LEFT_CLICK');
            } else {
                TooltipCesium.setVisible(false);
            }
        }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

        //三 LEFT_DOUBLE_CLICK
        handler.setInputAction(function (movement) {
            cartesian = viewer.camera.pickEllipsoid(movement.position, ellipsoid);
            if (cartesian) {
                TooltipCesium.showAt(movement.position, 'LEFT_DOUBLE_CLICK');
            } else {
                TooltipCesium.setVisible(false);
            }
        }, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);

        //四 LEFT_DOWN
        handler.setInputAction(function (movement) {
            cartesian = viewer.camera.pickEllipsoid(movement.position, ellipsoid);
            if (cartesian) {
                TooltipCesium.showAt(movement.position, 'LEFT_DOWN');
            } else {
                TooltipCesium.setVisible(false);
            }
        }, Cesium.ScreenSpaceEventType.LEFT_DOWN);

        //五 LEFT_UP
        handler.setInputAction(function (movement) {
            cartesian = viewer.camera.pickEllipsoid(movement.position, ellipsoid);
            if (cartesian) {
                TooltipCesium.showAt(movement.position, 'LEFT_UP');
            } else {
                TooltipCesium.setVisible(false);
            }
        }, Cesium.ScreenSpaceEventType.LEFT_UP);
 最终效果:


我的学习公众号也开通,感兴趣的小伙伴们可以加关注:giserYZ2SS,代码交流小伙伴在公众号发消息,我会一一回复的。

http://s14/small/006pZnPwzy7q1bYCcFvad&690

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有