Cesium【卷帘】、图层对比。

本文介绍了如何在Cesium中实现地图卷帘效果,通过添加两个高德地图影像层并设置SplitDirection属性,分别置于左右两侧。同时,详细展示了使用ScreenSpaceEventHandler监听滑动事件来动态调整卷帘位置。此外,还演示了如何加载3D Tileset,并调整其卷帘方向,提供了一种3D场景交互的新方式。

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

运用API .splitDirection

在这里插入图片描述
在这里插入图片描述

// 添加图层
const { Viewer } = window
const viewer:Cesium.Viewer = Viewer
const layer1 = new Cesium.UrlTemplateImageryProvider({
	url: "http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}",
	minimumLevel: 1,
	maximumLevel: 18,
});
const layer2 = new Cesium.UrlTemplateImageryProvider({
	url: "https://webst02.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}",
	minimumLevel: 1,
	maximumLevel: 18,
 });
  • 两个影像均来自高德地图
const layers = viewer.imageryLayers;
const earthAtRight = layers.addImageryProvider(layer1);
const earthAtLeft = layers.addImageryProvider(layer2);
  • 将影像添加到cesium图层中
earthAtLeft.splitDirection = Cesium.SplitDirection.LEFT;
earthAtRight.splitDirection = Cesium.SplitDirection.RIGHT;
  • 设置影像位于左边 或者右边
const init = (viewer: Cesium.Viewer) => {
  if(handler){
    handler.destroy()
    handler = null
  }
  const slider = document.getElementById("slider");
  if (slider) {
    const dom: HTMLCanvasElement = <HTMLCanvasElement>slider;
    if (dom.parentElement) {
      handler = new Cesium.ScreenSpaceEventHandler(dom);
      viewer.scene.splitPosition =
        dom.offsetLeft / dom.parentElement.offsetWidth;
      let moveActive = false;
      function move(movement: any) {
        if (!moveActive) {
          return;
        }
        const relativeOffset = movement.endPosition.x;
        if (dom.parentElement) {
          const splitPosition =
            (dom.offsetLeft + relativeOffset) / dom.parentElement?.offsetWidth;
          dom.style.left = `${100.0 * splitPosition}%`;
          viewer.scene.splitPosition = splitPosition; // 设置卷帘左右分区范围(0-1)之间
        }
      }
      handler.setInputAction(function () {
        moveActive = true;
      }, Cesium.ScreenSpaceEventType.LEFT_DOWN);
      handler.setInputAction(function () {
        moveActive = true;
      }, Cesium.ScreenSpaceEventType.PINCH_START);

      handler.setInputAction(move, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
      handler.setInputAction(move, Cesium.ScreenSpaceEventType.PINCH_MOVE);

      handler.setInputAction(function () {
        moveActive = false;
      }, Cesium.ScreenSpaceEventType.LEFT_UP);
      handler.setInputAction(function () {
        moveActive = false;
      }, Cesium.ScreenSpaceEventType.PINCH_END);
    }
  }
};
  • 3Dtileset卷帘
const { Viewer } = window
  const viewer:Cesium.Viewer = Viewer
 const  tileset = viewer.scene.primitives.add(
    new Cesium.Cesium3DTileset({
      // url: './titles/tileset.json'
      url: "./titles/dyt/tileset.json",
      maximumScreenSpaceError: 0.8, //空间误差
      maximumMemoryUsage: 100, //最大内容
    })
  ) as Cesium.Cesium3DTileset;
  viewer.zoomTo(tileset);
  tileset.readyPromise.then((tile)=> {
     viewer.scene.camera.flyToBoundingSphere(tile.boundingSphere);
  })
  tileset.splitDirection = Cesium.SplitDirection.RIGHT;
  • 初始化 在HTML中添加个dom元素id值为slider样式为
#slider {
  position: absolute;
  left: 50%;
  top: 0px;
  background-color: #d3d3d3;
  width: 5px;
  height: 100%;
  z-index: 9999;
}

#slider:hover {
  cursor: ew-resize;
}
<think>好的,我现在要回答用户关于Cesium中Polygon的splitDirection属性实现卷帘对比效果的问题。首先,我需要确认自己对splitDirection的理解是否正确。根据Cesium文档,splitDirection是用于控制多边形在特定方向上的分割,通常用于卷帘对比,比如左右或上下滑动显示不同图层。 接下来,我应该解释splitDirection的基本概念和用途。需要说明它是一个Property,可以动态设置,接受的值包括LEFT、RIGHT、NONE等,分别代表左右分割或不分。可能还需要提到如何与其它属性如material结合使用,来展示不同材质在分割区域的效果。 然后,用户可能需要具体的代码示例来演示如何创建这样的效果。我应该提供一个简单的示例,包括创建两个多边形,一个设置splitDirection为LEFT,另一个为RIGHT,并分别赋予不同的材质,比如半透明的蓝色和红色。同时,说明如何通过Slider控件动态调整splitDirection的数值,实现交互式的卷帘效果。 还需要注意一些常见问题,比如splitDirection的取值范围和兼容性,确保用户知道哪些版本支持该属性,以及如何处理可能的错误。此外,可能还需要提到性能优化,比如避免过于频繁的更新,以保持流畅的交互体验。 最后,总结一下splitDirection在卷帘对比中的应用场景和优势,强调其动态调整和交互性强的特点,帮助用户全面理解该属性的用途和实现方式。</think>好的,关于Cesium中`Polygon`的`splitDirection`属性实现卷帘对比效果,以下是逐步解析: --- ### 一、核心概念 **splitDirection** 是Cesium多边形(`PolygonGraphics`)的视觉分割属性,用于控制多边形沿**水平或垂直方向的分割显示**,常用于实现类似“卷帘对比”的图层叠加效果。 --- ### 二、属性参数 - **允许值**(`Number`类型): - `Cesium.SplitDirection.LEFT` (0):仅显示左侧/上半部分 - `Cesium.SplitDirection.RIGHT` (1):仅显示右侧/下半部分 - `Cesium.SplitDirection.NONE` (-1):完全显示(默认) --- ### 三、实现卷帘对比的步骤 #### 1. 创建基础场景 ```javascript const viewer = new Cesium.Viewer('cesiumContainer', { terrainProvider: Cesium.createWorldTerrain() }); ``` #### 2. 添加两个叠加的Polygon图层 ```javascript // 底层多边形(完整显示) const polygon1 = viewer.entities.add({ polygon: { hierarchy: Cesium.Cartesian3.fromDegreesArray([...坐标数组...]), material: Cesium.Color.BLUE.withAlpha(0.5), splitDirection: Cesium.SplitDirection.RIGHT // 初始显示右侧 } }); // 顶层多边形(可滑动部分) const polygon2 = viewer.entities.add({ polygon: { hierarchy: Cesium.Cartesian3.fromDegreesArray([...坐标数组...]), material: Cesium.Color.RED.withAlpha(0.5), splitDirection: Cesium.SplitDirection.LEFT // 初始显示左侧 } }); ``` #### 3. 绑定滑动控件 ```html <input type="range" id="slider" min="0" max="100" value="50"> ``` ```javascript const slider = document.getElementById('slider'); slider.addEventListener('input', (e) => { const ratio = e.target.value / 100; // 动态计算分割线位置 const splitPosition = Cesium.Math.lerp(-1, 1, ratio); // 更新两个多边形的splitDirection polygon1.polygon.splitDirection = new Cesium.ConstantProperty( splitPosition > 0 ? Cesium.SplitDirection.RIGHT : Cesium.SplitDirection.NONE ); polygon2.polygon.splitDirection = new Cesium.ConstantProperty( splitPosition < 0 ? Cesium.SplitDirection.LEFT : Cesium.SplitDirection.NONE ); }); ``` --- ### 四、关键效果原理 - **动态分割线**:通过`lerp`函数在[-1, 1]区间插值,控制分割比例 - **视觉叠加**:两个半透明多边形通过不同`splitDirection`显示局部区域 - **交互响应**:滑动条实时更新分割位置,形成“拖动对比”效果 --- ### 五、注意事项 1. **坐标系对齐**:确保两个多边形使用完全相同的坐标范围 2. **材质透明度**:建议使用`withAlpha(0.5)`保证叠加区域可见性 3. **性能优化**:复杂多边形建议开启`asynchronous: true`异步加载 --- ### 六、扩展应用 可结合`ClippingPlane`实现更复杂的三维裁剪效果: ```javascript entity.polygon.clippingPlanes = new Cesium.ClippingPlaneCollection({ planes : [new Cesium.ClippingPlane(new Cesium.Cartesian3(1, 0, 0), 0)] }); ``` 通过调整`splitDirection`与`clippingPlanes`的组合,可创建多维度对比分析工具。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值