cesium分屏对比

本文简单介绍了Cesium中的分屏对比和卷帘对比功能。分屏对比通过创建两个同步的Viewer实现,而卷帘对比则利用单个Viewer展示两个不同的地图。文章提供了相关代码示例和效果图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考地址:https://blog.youkuaiyun.com/qq_29808089/article/details/108895254

简单介绍一下:分屏对比和卷帘对比的区别(只是个人理解,不对请指正)
分屏对比:创建了左右两个地球,有两个viewer,两个viewer会同步。
卷帘对比:只有一个地球,一个viewer,只不过这个地球有两个地图。
想看卷帘对比请在我的文章中寻找

使用该段代码请将js和css换成自己的或者网上的

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <!-- <link rel="icon" href="<%= BASE_URL %>favicon.ico"> -->
    <script src="../../Build/Cesium/Cesium.js"></script>
    <!-- <link rel="stylesheet" href="Cesium/Widgets/widgets.css"> -->
</head>

<body>
    <div id="cesiumContainer" class="mapview"></div>
    <div id="cesiumContainer2" class="mapview"></div>
</body>
<style>
    @import url(../../Build/Cesium/Widgets/widgets.css);

    html,
    body {
        width: 100%;
        height: 100%;
        margin: 0;
    }

    .mapview {
        float: left;
        width: 50%;
        height: 100%;
        margin: 0;
    }
</style>
<script>
    var viewer0, viewer1
    viewer0 = new Cesium.Viewer('cesiumContainer', {
        baseLayerPicker: false,
        imageryProvider: new Cesium.ArcGisMapServerImageryProvider({
            url: 'http://map.geoq.cn/arcgis/rest/services/ChinaOnlineStreetWarm/MapServer'
        })
    });
    viewer1 = new Cesium.Viewer('cesiumContainer2', {
        baseLayerPicker: false,
        imageryProvider: new Cesium.ArcGisMapServerImageryProvider({
            url: 'http://map.geoq.cn/arcgis/rest/services/ChinaOnlineStreetWarm/MapServer'
        })
    });
    initHandler(viewer0, viewer1)

    function initHandler(viewer0, viewer1) {
        var _self = this;
        if (_self.handler && _self.handler.getInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE)) {
            return;
        }
        _self.handler = new Cesium.ScreenSpaceEventHandler(viewer0.scene.canvas);
        _self.handler1 = new Cesium.ScreenSpaceEventHandler(viewer1.scene.canvas);
        _self.handler.setInputAction(function (movement) {
            var _camerca = viewer0.camera;
            viewer1.camera.setView({
                destination: _camerca.position,
                orientation: {
                    direction: _camerca._direction,
                    up: _camerca.up,
                    heading: _camerca.heading,
                    pitch: _camerca.pitch,
                    roll: _camerca.roll
                }
            });
        }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);

        _self.handler.setInputAction(function (movement) {
            var _camerca = viewer0.camera;
            viewer1.camera.setView({
                destination: _camerca.position,
                orientation: {
                    direction: _camerca._direction,
                    up: _camerca.up,
                    heading: _camerca.heading,
                    pitch: _camerca.pitch,
                    roll: _camerca.roll
                }
            });
        }, Cesium.ScreenSpaceEventType.WHEEL);


        _self.handler1.setInputAction(function (movement) {
            var _camerca = viewer1.camera;
            viewer0.camera.setView({
                destination: _camerca.position,
                orientation: {
                    direction: _camerca._direction,
                    up: _camerca.up,
                    heading: _camerca.heading,
                    pitch: _camerca.pitch,
                    roll: _camerca.roll
                }
            });
        }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);

        _self.handler1.setInputAction(function (movement) {
            var _camerca = viewer1.camera;
            viewer0.camera.setView({
                destination: _camerca.position,
                orientation: {
                    direction: _camerca._direction,
                    up: _camerca.up,
                    heading: _camerca.heading,
                    pitch: _camerca.pitch,
                    roll: _camerca.roll
                }
            });
        }, Cesium.ScreenSpaceEventType.WHEEL);
    }

    function clearHandler() {
        var _self = this;
        if (_self.handler) {
            _self.handler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE);
            _self.handler.removeInputAction(Cesium.ScreenSpaceEventType.WHEEL);
        }
        if (_self.handler1) {
            _self.handler1.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE);
            _self.handler1.removeInputAction(Cesium.ScreenSpaceEventType.WHEEL);
        }
    }
</script>

</html>

效果图:
在这里插入图片描述

### 实现Cesium中三维模型的卷帘对比Cesium中实现三维模型的卷帘对比主要依赖于创建两个不同视角或状态下的模型实例,并通过拖动分隔线来切换显示区域。具体来说,这涉及到设置`splitDirection`属性以及处理鼠标事件以更新视图。 #### HTML结构定义 为了支持交互式的卷帘操作,在页面上需增加一个用于表示分割线的HTML元素: ```html <div id="slider"></div> ``` 此元素被定位为绝对布局并置于场景中央作为垂直方向上的分界线[^3]。 #### CSS样式配置 对于上述`<div>`标签应用特定CSS规则使其外观适合作为可拖拽的手柄: ```css #slider { position: absolute; left: 50%; top: 0px; background-color: #d3d3d3; width: 5px; height: 100%; z-index: 9999; } #slider:hover { cursor: ew-resize; } ``` 这些样式使得该条目看起来像一条细长矩形框位于屏幕中间位置,并且当鼠标悬停其上方时会改变光标的形状提示用户可以水平调整宽度。 #### JavaScript逻辑编写 接下来是核心部分——JavaScript代码负责监听用户的输入动作并将之转化为实际渲染变化。这里假设已经初始化了一个名为`viewer`的对象代表整个Cesium Viewer环境。 首先加载两个不同的3D Tiles数据集分别对应左侧和右侧要展示的内容: ```javascript const viewerLeft = new Cesium.Viewer('cesiumContainer', {}); const viewerRight = new Cesium.Viewer('cesiumContainer', {}); // 加载左半边的数据源 viewerLeft.scene.primitives.add( Cesium.createTileset({ url : 'path/to/left/tileset.json' }) ); // 加载右半边的数据源 viewerRight.scene.primitives.add( Cesium.createTileset({ url : 'path/to/right/tileset.json' }) ); ``` 接着定义滑块的位置变量及相应的DOM Event Handler函数用来控制可视范围的变化: ```javascript let splitPosition = 0.5; document.getElementById('slider').addEventListener('mousedown', function(event){ document.addEventListener('mousemove', onMouseMove, false); }); function onMouseMove(event){ const rect = viewer.canvas.getBoundingClientRect(); let mouseX = event.clientX - rect.left; // 计算新的比例值 splitPosition = (mouseX / rect.width).toFixed(2); updateSplitView(splitPosition); } function updateSplitView(position){ // 更新左右两侧相机参数保持同步视角 viewerRight.camera.setView(viewerLeft.camera.viewRectangle); // 设置裁剪平面使超过指定界限的部分不可见 viewerLeft.scene.fxaa.enabled = true; viewerLeft.scene.postProcessStages.stencilMask.executeInOrder = true; viewerLeft.scene.globe.depthTestAgainstTerrain = true; var clipPlane = new Cesium.ClipPlanex(Cesium.Cartesian4(-position, 0, 0, 0)); viewerLeft.scene.frustumNearFarScalar = [clipPlane]; viewerRight.scene.fxaa.enabled = true; viewerRight.scene.postProcessStages.stencilMask.executeInOrder = true; viewerRight.scene.globe.depthTestAgainstTerrain = true; var clipPlaneR = new Cesium.ClipPlanes([new Cesium.Plane(new Cesium.Cartographic(Math.PI * (-position), Math.PI / 2, 0))]); viewerRight.scene.clipPlanes = clipPlaneR; } ``` 以上脚本片段实现了基本的功能需求:允许用户通过点击并拖曳的方式动态修改两组地理空间对象之间的可见边界。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值