Cesium底图切换实现

创建Cesium视图

'use client';

import { ReactElement, useEffect } from 'react';
import * as Cesium from 'cesium';
import CesiumNavigation from 'cesium-navigation-es6';
import { initRange, TOKEN } from '@/utils';
import { useAppDispatch } from '@/store';
import { setCesiumViewer } from '@/store/reducer/cesium-slice';
import 'cesium/Source/Widgets/widgets.css';
import { baseMap } from '@/components/cesium/base-map';

Cesium.Ion.defaultAccessToken = TOKEN.CESIUM;
const CreateViewer = (): ReactElement => {
  const dispatch = useAppDispatch();
  useEffect(() => {
    initMapViewer().catch((e) => console.log(e));
  }, []);
  const initMapViewer = async () => {
    // 地形配置
    const terrain = Cesium.Terrain.fromWorldTerrain({
      requestWaterMask: true,
      requestVertexNormals: true
    });

    const viewer = new Cesium.Viewer('cesium-viewer', {
      infoBox: false,
      // 设置底图
      // baseLayer: new Cesium.ImageryLayer(new Cesium.WebMapTileServiceImageryProvider({
      //   url: `http://t0.tianditu.gov.cn/img_w/wmts?tk=${TOKEN.TDT}`,
      //   layer: 'img',
      //   style: 'default',
      //   tileMatrixSetID: 'w',
      //   format: 'tiles',
      //   maximumLevel: 18
      // }), {}),
      terrain: terrain,
      shouldAnimate: true, // 设置影像图列表
      geocoder: false, // 右上角查询按钮
      shadows: false,
      terrainProviderViewModels: [], // 设置地形图列表
      animation: false, // 动画小窗口
      baseLayerPicker: false, // 图层选择器
      fullscreenButton: false, // 全屏
      vrButton: false, // vr 按钮
      homeButton: false, // home 按钮
      sceneModePicker: false, // 2D,2.5D,3D 切换
      selectionIndicator: false,
      timeline: false, // 时间轴
      navigationHelpButton: false, // 帮助按钮
      creditContainer: document.createElement('div'), // 隐藏logo
      contextOptions: {
        webgl: {
          alpha: true,
          depth: true,
          stencil: true,
          antialias: true,
          premultipliedAlpha: true,
          preserveDrawingBuffer: true, //通过canvas.toDataURL()实现截图需要将该项设置为true
          failIfMajorPerformanceCaveat: true
        },
        allowTextureFilterAnisotropic: true
      }
    });
    // 开启深度检测
    viewer.scene.globe.depthTestAgainstTerrain = true;
    // 加载范围限定为中国
    initRange(viewer, { east: 136, north: 60, south: 2, west: 74 });

    baseMap(viewer);

    //禁止双击zoom
    viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction(
      Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK
    );
    viewer.scene.postProcessStages.fxaa.enabled = false;

    // 解决贴地区块显示不全
    viewer.scene.globe.depthTestAgainstTerrain = false;

    const options = {
      // 用于在使用重置导航重置地图视图时设置默认视图控制。接受的值是Cesium.Cartographic 和Cesium.Rectangle.
      defaultResetView: Cesium.Cartographic.fromDegrees(105, 30, 12000000),
      // 罗盘
      enableCompass: true,
      // 缩放控件
      enableZoomControls: true,
      // 距离图例
      enableDistanceLegend: true,
      // 指南针外环
      enableCompassOuterRing: true
    };
    // @ts-ignore
    new CesiumNavigation(viewer, options);
    dispatch(setCesiumViewer(viewer));
  };

  return <div id={'cesium-viewer'} style={{ width: '100%', height: '100%' }} />;
};

export default CreateViewer;

设置并添加底图

import { TOKEN } from '@/utils';
import { Credit, Viewer, WebMapTileServiceImageryProvider } from 'cesium';

export const baseMap = (viewer: Viewer) => {
  //天地图影像
  let TDT_YX = new WebMapTileServiceImageryProvider({
    url: `http://{s}.tianditu.gov.cn/img_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=img&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=${TOKEN.TDT}`,
    layer: 'img',
    style: 'default',
    format: 'tiles',
    tileMatrixSetID: 'w',
    subdomains: ['t0', 't1', 't2', 't3', 't4', 't5', 't6', 't7'],
    credit: new Credit('天地图影像'),
    maximumLevel: 18
  });

  //天地图矢量
  let TDT_SL = new WebMapTileServiceImageryProvider({
    url: `http://{s}.tianditu.gov.cn/vec_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=vec&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=${TOKEN.TDT}`,
    layer: 'vec',
    style: 'default',
    format: 'tiles',
    tileMatrixSetID: 'w',
    subdomains: ['t0', 't1', 't2', 't3', 't4', 't5', 't6', 't7'],
    credit: new Credit('天地图矢量'),
    maximumLevel: 18
  });
  const ARCGIS = new WebMapTileServiceImageryProvider({
    url: 'https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/WMTS',
    layer: 'World_Imagery',
    style: 'default',
    format: 'image/jpeg',
    tileMatrixSetID: 'GoogleMapsCompatible',
    maximumLevel: 19,
    credit: new Credit('ARCGIS')
  });
  // 加载影像注记
  let TDT_ZJ = new WebMapTileServiceImageryProvider({
    url: `http://t0.tianditu.gov.cn/cia_w/wmts?tk=${TOKEN.TDT}`,
    layer: 'cia',
    style: 'default',
    tileMatrixSetID: 'w',
    format: 'tiles',
    credit: new Credit('天地注记'),
    maximumLevel: 18
  });

  viewer.imageryLayers.addImageryProvider(TDT_SL);
  viewer.imageryLayers.addImageryProvider(TDT_YX);
  viewer.imageryLayers.addImageryProvider(ARCGIS);
  viewer.imageryLayers.addImageryProvider(TDT_ZJ);
  // console.log('===viewer.imageryLayers===', viewer.imageryLayers);
};

切换底图

import { Viewer } from 'cesium';
export const toggleBaseMap = (
  viewer: Viewer,
  type: 'TDT_SL' | 'TDT_YX' | 'ARCGIS'
) => {
  switch (type) {
    case 'TDT_YX':
      viewer.imageryLayers.get(0).show = true;
      viewer.imageryLayers.get(1).show = false;
      viewer.imageryLayers.get(2).show = false;
      viewer.imageryLayers.get(3).show = false;
      break;
    case 'TDT_SL':
      viewer.imageryLayers.get(0).show = false;
      viewer.imageryLayers.get(1).show = true;
      viewer.imageryLayers.get(2).show = false;
      viewer.imageryLayers.get(3).show = false;
      break;
    case 'ARCGIS':
      viewer.imageryLayers.get(0).show = false;
      viewer.imageryLayers.get(1).show = false;
      viewer.imageryLayers.get(2).show = false;
      viewer.imageryLayers.get(3).show = true;
      break;
    default:
      break;
  }
};

调用方法

'use client';

import CreateViewer from '@/components/cesium/create-viewer';
import './index.scss';
import { Button } from 'antd';
import { useAppSelector } from '@/store';
import { toggleBaseMap } from '@/components/cesium/base-map';

const Home = () => {
  const { viewer } = useAppSelector((state) => state.cesium);
  return (
    <div className={'views-home w-screen h-screen position-relative'}>
      <main className={'views-home-main w-screen h-screen'}>
        <div className={'views-home-main-menu'}>
          <Button onClick={() => toggleBaseMap(viewer!, 'TDT_SL')}>天地图矢量</Button>
          <br/>
          <br/>
          <Button onClick={() => toggleBaseMap(viewer!, 'TDT_YX')}>天地图影像</Button>
          <br/>
          <br/>
          <Button onClick={() => toggleBaseMap(viewer!, 'ARCGIS')}>ArcGIS影像</Button>
        </div>
        <CreateViewer />
      </main>
    </div>
  );
};
export default Home;

在这里插入图片描述

结果

天地图矢量

在这里插入图片描述

天地图影像

在这里插入图片描述

ArcGIS影像

在这里插入图片描述
如果你觉得本文对你有帮助,不妨点个赞吧~~~

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用 CesiumJS 库来切换底图CesiumJS 是一个用于创建地球和地理信息可视化的开源JavaScript库。在 CesiumJS 中,你可以通过更改 Viewer 对象的 `imageryProvider` 属性来切换底图。 以下是一个示例代码,演示如何在 CesiumJS切换底图: ```javascript// 创建 Viewer 对象var viewer = new Cesium.Viewer('cesiumContainer'); // 创建不同的底图图层var imageryLayers = viewer.imageryLayers; var defaultImageryProvider = new Cesium.ArcGisMapServerImageryProvider({ url: 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer' }); var alternativeImageryProvider = new Cesium.TileMapServiceImageryProvider({ url: 'https://your-alternative-tile-map-service-url.com', maximumLevel:18}); // 设置默认底图imageryLayers.addImageryProvider(defaultImageryProvider); // 切换底图function switchBaseMap() { if (imageryLayers.length >0) { // 移除当前底图 imageryLayers.remove(imageryLayers.get(0)); } // 添加替代底图 imageryLayers.addImageryProvider(alternativeImageryProvider); } ``` 在这个示例中,我们创建了一个 Viewer 对象,并使用 `ArcGisMapServerImageryProvider` 创建了一个默认的底图。然后,我们定义了一个替代的底图 `TileMapServiceImageryProvider`。通过调用 `imageryLayers.addImageryProvider()` 方法,我们添加了默认底图。当需要切换底图时,我们可以调用 `switchBaseMap()` 函数来移除当前底图并添加替代底图。 请注意,你需要将示例中的 URL 替换为你自己的底图服务 URL。 希望这能帮助到你!如果你有任何进一步的问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值