5、Cesium学习之切割图层

1、实例

var viewer = new Cesium.Viewer("cesiumContainer", {
//加载arcgis影像图层
  imageryProvider: new Cesium.ArcGisMapServerImageryProvider({
    url:
      "https://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer",
  }),
  //禁用底图切换
  baseLayerPicker: false,
  //禁用标注框
  infoBox: false,
});
//获取影像图层集合
var layers = viewer.imageryLayers;
//在影像图层集合中添加Cesium的在线影像图层
var earthAtNight = layers.addImageryProvider(
  new Cesium.IonImageryProvider({ assetId: 3812 })
);
//相对于场景#imagerySplitPosition显示imagerlayer的方向
//ImagerySplitDirection是枚举类型,三个值:LEFT,NONE,RIGHT
//LEFT:在场景的左侧显示imagerlayer#imagersplitposition
//NONE:总是显示影像图层
//RIGHT:在场景的右侧显示影像图层
earthAtNight.splitDirection = Cesium.ImagerySplitDirection.LEFT; // Only show to the left of the slider.

// Sync the position of the slider with the split position
var slider = document.getElementById("slider");
//imagerySplitPostion
//获取或设置图像拆分器在视口中的位置。有效值介于0.0和1.0之间
viewer.scene.imagerySplitPosition =
  slider.offsetLeft / slider.parentElement.offsetWidth;
//new Cesium.ScreenSpaceEventHandler(element)
//处理用户输入事件。可以添加自定义函数,以便在用户输入时执行。
//参数名称element,类型:HTMLCanvasElement,默认值document,将要添加此事件的html的canvas元素
var handler = new Cesium.ScreenSpaceEventHandler(slider);

var moveActive = false;

function move(movement) {
  if (!moveActive) {
    return;
  }

  var relativeOffset = movement.endPosition.x;
  //split元素的位置
  var splitPosition =
    (slider.offsetLeft + relativeOffset) /
    slider.parentElement.offsetWidth;
  slider.style.left = 100.0 * splitPosition + "%";
  viewer.scene.imagerySplitPosition = splitPosition;
}

handler.setInputAction(function () {
  moveActive = true;
}, Cesium.ScreenSpaceEventType.LEFT_DOWN);
handler.setInputAction(function () {
  moveActive = true;
}, Cesium.ScreenSpaceEventType.PINCH_START);
//setInputAction(action, type, modifier)
//设置要在输入事件上执行的函数,
//action:函数类型,发生输入事件时要执行的函数
//type:Number类型,输入事件的ScreenSpaceEventType
//modifier:Number类型,可选参数,类型事件发生时保持的KeyboardEventModifier键。
handler.setInputAction(move, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
handler.setInputAction(move, Cesium.ScreenSpaceEventType.PINCH_MOVE);
//ScreenSpaceEventType 
//此枚举类型用于对鼠标事件进行分类:向下、向上、单击、双击、移动和移动按钮时按住按钮
//LEFT_DOWN	Number	鼠标左键按下事件
//LEFT_UP	Number	鼠标左键抬起事件
//LEFT_CLICK	Number	表示鼠标左键单击事件
//LEFT_DOUBLE_CLICK	Number	表示鼠标左键双击事件
//RIGHT_DOWN	Number	鼠标右键按下事件
//RIGHT_UP	Number	鼠标右键抬起事件
//RIGHT_CLICK	Number	表示鼠标右键单击事件.
//MIDDLE_DOWN	Number	表示鼠标中键按下事件
//MIDDLE_UP	Number	表示鼠标中键抬起事件
//MIDDLE_CLICK	Number	表示鼠标中键单击事件
//MOUSE_MOVE	Number	表示鼠标移动事件
//WHEEL	Number	表示鼠标滚轮事件
//PINCH_START	Number	表示触摸表面上两个手指事件的开始(移动端)
//PINCH_END	Number	表示触摸表面上两个手指事件的结束(移动端)
//PINCH_MOVE	表示触摸表面上两个手指移动的事件(移动端).
handler.setInputAction(function () {
  moveActive = false;
}, Cesium.ScreenSpaceEventType.LEFT_UP);
handler.setInputAction(function () {
  moveActive = false;
}, Cesium.ScreenSpaceEventType.PINCH_END);


2、截图

在这里插入图片描述
3、亲测

<!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">
    <title>Document</title>
    <script src="https://cesium.com/downloads/cesiumjs/releases/1.79.1/Build/Cesium/Cesium.js"></script>
    <link href="https://cesium.com/downloads/cesiumjs/releases/1.79.1/Build/Cesium/Widgets/widgets.css"
        rel="stylesheet">
    <style>
        html,
        body,
        #container {
            margin: 0;
            padding: 0;
            height: 100%;
        }

        .slide {
            z-index: 2000;
            height: 100%;
            background-color: grey;
            width: 5px;
            position: absolute;
            left: 50%;
        }

        .slide:hover {
            cursor: ew-resize;
        }
    </style>
</head>

<body>
    <div id="container">
        <div class="slide" id="slide" style=""></div>
    </div>
</body>
<script>
    let viewer = new Cesium.Viewer('container', {
        imageryProvider: new Cesium.ArcGisMapServerImageryProvider({
            url: "https://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer",
        }),
        baseLayerPicker: false,
        infoBox: false
    })
    let layers = viewer.imageryLayers
    //分屏的另一个地图
    let earthAtNight = layers.addImageryProvider(
        new Cesium.IonImageryProvider({
            assetId: 3812
        })
    )
    //设置分屏地图在容器中的位置
    earthAtNight.splitDirection = Cesium.ImagerySplitDirection.LEFT
    //给元素添加事件
    let handler = new Cesium.ScreenSpaceEventHandler(document.getElementsByClassName('slide')[0])

    let moveActive = false
    handler.setInputAction(() => {
        moveActive = true
    }, Cesium.ScreenSpaceEventType.LEFT_DOWN)
    handler.setInputAction(() => {
        moveActive = true
    }, Cesium.ScreenSpaceEventType.PINCH_START)
    handler.setInputAction(() => {
        moveActive = false
    }, Cesium.ScreenSpaceEventType.LEFT_UP)
    //绑定事件,第一个参数是所绑定的函数,第二个参数是事件名称
    handler.setInputAction(() => {
        moveActive = false
    }, Cesium.ScreenSpaceEventType.PINCH_END)
    let slider = document.getElementById('slide')
    viewer.scene.imagerySplitPosition =
        slider.offsetLeft / slider.parentElement.offsetWidth;

    function move(e) {
        if (moveActive) {
            var relativeOffset = e.endPosition.x;
            var splitPosition =
                (slider.offsetLeft + relativeOffset) /
                slider.parentElement.offsetWidth;
            slider.style.left = 100.0 * splitPosition + "%";
            viewer.scene.imagerySplitPosition = splitPosition;
        }

    }
    handler.setInputAction(move, Cesium.ScreenSpaceEventType.MOUSE_MOVE)
    handler.setInputAction(move, Cesium.ScreenSpaceEventType.PINCH_MOVE)
</script>


</html>
Cesium是一个开源的地球可视化引擎,高德地图是中国主要的地图服务提供商。在Cesium中使用高德地图图层时,可能会出现一些偏移的问题。 这种偏移问题主要是由于不同地图服务提供商使用了自己的坐标系统或投影方式,导致不同地图之间存在一定的地理坐标偏移。在使用高德地图图层时,也会遇到类似的偏移情况。 为了解决这个问题,可以尝试以下两种方法来进行偏移修正。 第一种方法是手动修正。在Cesium中,我们可以通过手动调整图层的位置,使其与其他图层或实际地图上的特定位置对齐。调整的方法可以根据实际情况选择,在代码中设置图层的位置坐标。 第二种方法是使用坐标转换库。可以使用一些开源的坐标转换库,如Proj4js、Coordinate Transformations for Cesium等,将高德地图的坐标转换到与Cesium相同的坐标系或投影系统。通过使用这些坐标转换库,可以将高德地图的坐标进行转换,以解决偏移问题。 需要注意的是,每个地图服务提供商可能会采用不同的坐标系统、投影方式或坐标转换方法。因此,在使用高德地图图层时,需要根据实际情况选择适合的坐标转换方法,并进行相应的调整。 总之,在Cesium中使用高德地图图层时存在一定的偏移问题,可以通过手动修正或使用坐标转换库来解决。根据实际情况选择适合的方法,进行相应的调整,以实现准确的地图显示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值