cesium,各种影像的卷帘效果实现

sweeties~  今天一起学习cesium的卷帘效果哦^^

实现的是简单的HTML页面在线显示

1、CDN引入

<script src='https://cdn.bootcdn.net/ajax/libs/cesium/1.98.1/Cesium.js'></script>
  <link href='https://cdn.bootcdn.net/ajax/libs/cesium/1.98.1/Widgets/widgets.css' rel='stylesheet'>

2、样式和显示区域

<style>
      #slider {
        position: absolute;
        left: 50%;
        top: 0px;
        background-color: #d3d3d3;
        width: 5px;
        height: 100%;
        z-index: 9999;
      }
      #slider:hover {
        cursor: ew-resize;
      }
  </style>
</head>
<body>
  <div id="cesiumContainer" class="fullSize">
    <div id="slider"></div>
  </div>
</body>

3、设置容器

        第一步仍然是设置最基础的容器~ 控件显示自行改动哦

  const viewer = new Cesium.Viewer("cesiumContainer", {
    fullscreenButton: false,
    baseLayerPicker: false,
    selectionIndicator: false,
    sceneModePicker: false,
    navigationHelpButton: false,
    homeButton: false,
    animation: false, // 时间控制器
    geocoder: false,
    timeline: false, //时间线
    infoBox: false,
    scene3DOnly: false,
    vrButton: false,
    shouldAnimate: true,
    navigationInstructionsInitiallyVisible: false,
      baseLayerPicker: false,
      infoBox: false,
      imageryProvider: new Cesium.ArcGisMapServerImageryProvider({
        url:"https://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer",
      }),
    });

5、卷帘图层

最重要的一步来喽!设置与初始影像不一样的卷帘影像

imageryProvider:提供要在地球表面上显示的图像。它描述了一个接口,并不直接实例化。

 /************直接使用cesium提供的影像************
    new Cesium.IonImageryProvider({
        assetId: 3812 
        accessToken:"你申请的accessToken"
      })**/
    /**********其他卷帘图层样式************************

 imageryProvider: new Cesium.ArcGisMapServerImageryProvider({

  url:"https://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer",

      }),

ArcGisMapServerImageryProvider可更改为:

    1、ArcGisMapServerImageryProvider:支持ArcGIS Online和Server的相关服务
    2、BingMapsImageryProvider:Bing地图影像,可以指定mapStyle,详见BingMapsStyle类
    3、createOpenStreetMapImageryProvider:OSM影像服务,根据不同的url选择不同的风格
    4、createTileMapServiceImageryProvider:看文档是根据MapTiler规范,貌似是可以自己下载瓦片,发布服务,类似ArcGIS影像服务的过程
    5、GoogleEarthImageryProvider:企业级服务,没有用过
    6、ImageryProvider:基类,所有的影像服务最终都基于此类,如果你需要扩展新的Provider也会继承该类
    7、MapboxImageryProvider:Mapbox影像服务,根据mapId指定地图风格
    8、SingleTileImageryProvider:单张图片的影像服务,适合离线数据或对影像数据要求并不高的场景下
    9、UrlTemplateImageryProvider:指定url的format模版,方便用户实现自己的Provider,比如国内的高德,腾讯等影像服务,url都是一个固定的规范,都可以通过该Provider轻松实现。而OSM也是通过该类实现的。
    10、WebMapServiceImageryProvider:符合WMS规范的影像服务都可以通过该类封装,指定具体参数实现
    11、WebMapTileServiceImageryProvider:服务WMTS1.0.0规范的影像服务,都可以通过该类实现,比如国内的天地图
    12、TileCoordinatesImageryProvider:渲染每一个瓦片的围,方便调试
    13、GridImageryProvider:渲染每一个瓦片内部的格网,了解每个瓦片的精细度******/

//设置卷帘图层
const layers = viewer.imageryLayers;
const earthAtOver = layers.addImageryProvider(
  new Cesium.ArcGisMapServerImageryProvider({ 
    url:"https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer"
  })
);
earthAtOver.splitDirection = Cesium.SplitDirection.LEFT; // 只显示在滑动条的左侧,需要右侧显示改为"RIGHT"即可

6、对分割条的操作

// 将滑块的位置与分割位置同步
const slider = document.getElementById("slider");
viewer.scene.splitPosition =//确定分割点位置
  slider.offsetLeft / slider.parentElement.offsetWidth;//占据父级容器的比例

const handler = new Cesium.ScreenSpaceEventHandler(slider);//处理用户输入事件。可以添加自定义功能以在用户输入时执行;参数为任意元素

let moveActive = false;

function move(movement) {
  if (!moveActive) {
    return;
  }
//捕获滑动停止的位置
  const relativeOffset = movement.endPosition.x;
  const splitPosition =
    (slider.offsetLeft + relativeOffset) /
    slider.parentElement.offsetWidth;
  slider.style.left = `${100.0 * splitPosition}%`;
  viewer.scene.splitPosition = splitPosition;
}

//对分割条的操作
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);

实现效果

讲解引用https://www.cnblogs.com/zhoulujun/p/13057836.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值