自定义Cesium缩放控件

原文:自定义Cesium缩放控件 (wsh233.cn)

发现Cesium并没有像ol一样提供放大缩小的控件,查阅它的文档之后,找到了几个用于移动位置的api。

move

包含六个方向的move函数,分别是moveForward、moveBackward、moveRight、moveLeft、moveUp、moveDown,实现缩放需要用到前两个,来控制相机沿着视线方向移动,以下是api说明。

了解到api后,代码部分的编写就很简单,以下是js代码示例。

    function zoomInByMove(flag){
        var position = viewer.camera.positionCartographic;
        // 1表示放大,0表示缩小
        if(flag){
            viewer.camera.moveForward(position.height * 0.5)
        }
        else{
            viewer.camera.moveBackward(position.height * 0.5)
        }
    }
//绑定两个控件事件
    document.getElementById('zoomIn').addEventListener('click', function (){
        zoomInByMove(1);
    })
    document.getElementById('zoomOut').addEventListener('click', function (){
        zoomInByMove(0);
    })

zoomIn&zoomOut

看起来,这两个函数才是缩放正统,实际的效果和前面的api趋于一致。

            

                                                                                                  

flyToBoundingSphere       

在缩放的过程中,前后视图变换间没有过渡,给人一股很僵硬的感觉,为了解决整个问题,引出了第三个缩放方法,借助flyToBoundingSphere方法,以下是api说明:

                                              

我觉得这个api,最重要的概念是BoundingSphere,暂且翻译作【包围球】吧,创建它需要指定一个三维空间的点和半径长度,思路是这样的,获取视图的中心点和相机的高度,根据二者创建一个包围球,最后在移动相机的过程中修改offset参数中的Range—即相机到中心点的距离,而pitch、heading等参数使用原始数值。

                                                                                  

以下是相关的代码:

    // 获取视图中心点
    function  pickCenter() {
        var ellipsoid = viewer.camera.pickEllipsoid(new Cesium.Cartesian2(
            viewer.canvas.clientWidth / 2,
            viewer.canvas.clientHeight / 2));
        var curPosition = Cesium.Ellipsoid.WGS84.cartesianToCartographic(ellipsoid);
        var lon = curPosition.longitude * 180 / Math.PI;
        var lat = curPosition.latitude * 180 / Math.PI;
        return {
            lon: lon,
            lat: lat
        };
    }
    function  zoomByBound(flag){
        const center = pickCenter()
        var height = viewer.camera.positionCartographic.height;
        const camera = viewer.camera;
        var boundingSph = new Cesium.BoundingSphere(Cesium.Cartesian3.fromDegrees(center.lon, center.lat, 1000), height);
        var moveRate = 0;
        if(flag){
            moveRate = 0.5
        }
        else{
            moveRate = 1.5
        }
        var zoomParams = {
            duration: 0.8,
            offset: new Cesium.HeadingPitchRange(camera.heading, camera.pitch, height * moveRate)
        }
        camera.flyToBoundingSphere(boundingSph,zoomParams);
    }

    document.getElementById('zoomIn').addEventListener('click', function (){
        // zoomInByMove(1);
        zoomByBound(1)
    })
    document.getElementById('zoomOut').addEventListener('click', function (){
        // zoomInByMove(0);
        zoomByBound(0)
    })

效果:

                                                                                            

如读到这篇记录的同学有更好的实现方法、记录有错误的地方,欢迎指出。

参考: 

Camera - Cesium Documentation

  • 7
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Cesium提供了一些内置的视图控件,用于在场景中控制视角和相机的视图。以下是Cesium中常用的视图控件: 1. NavigationHelpButton(导航帮助按钮):这个控件是一个帮助按钮,可以显示一些关于场景导航的基本操作指南。点击按钮时,会弹出一个对话框,显示一些常见的导航操作,例如平移、缩放、旋转等。用户可以通过阅读这些指南来学习如何在Cesium中进行场景导航。 2. HomeButton(返回首页按钮):这个控件是一个返回首页按钮,点击它可以将场景视角返回到默认的初始位置和缩放级别。它可以帮助用户快速回到场景的初始状态,特别是在用户进行了一系列的场景导航操作后。 3. SceneModePicker(场景模式选择器):这个控件允许用户在不同的场景模式之间进行切换。Cesium支持三种场景模式:3D(默认模式,呈现3D地球)、2D(平面模式,呈现二维地图)和哥伦布视图(一种混合模式,结合了2D和3D视图)。用户可以使用场景模式选择器来切换不同的模式。 4. TimeSlider(时间滑块):这个控件用于控制场景中时间相关的数据。它可以显示一个滑块,用户可以通过拖动滑块来改变时间,从而在时间上浏览场景中的动态数据。时间滑块对于可视化时间相关数据的展示和演示非常有用。 这些视图控件可以通过Cesium的Viewer或CesiumWidget对象进行配置和添加。您可以使用相应的方法和选项来启用和自定义这些控件,以满足您的特定需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值