Cesium部分区域显示(反向 遮罩)

请在有前端基础下阅读

先上效果图(通州区的数据DataV.GeoAtlas地理小工具系列 可以在这网站上选取下载GEOJSON)

上代码
 

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>通州区显示</title>
    <!-- Cesium 样式文件 -->
    <link href="https://cdn.jsdelivr.net/npm/cesium@1.108/Build/Cesium/Widgets/widgets.css" rel="stylesheet">
    <!-- Cesium JS 文件 -->
    <script src="https://cdn.jsdelivr.net/npm/cesium@1.108/Build/Cesium/Cesium.js"></script>
    <!-- <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/cesium/1.103.0/Widgets/widgets.css">
    <script src="https://cdn.bootcdn.net/ajax/libs/cesium/1.103.0/Cesium.js"></script> -->
    <style>
        body,
        html {
            margin: 0;
            padding: 0;
            width: 100%;
            height: 100%;
            overflow: hidden;
        }

        #cesiumContainer {
            width: 100%;
            height: 100vh;
        }
    </style>
</head>

<body>
    <div id="cesiumContainer"></div>

    <script type="module">
        import Hook from './hook.js';

        Cesium.Ion.defaultAccessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiIwN2QwOTJhOS02Y2VmLTQ5YzItOWIzMC1jYmEwMTY3ODY3MjQiLCJpZCI6MjE0Njk2LCJpYXQiOjE3MTU1NzYwNDR9.fMKXCDKhWbcr74wQlgbzZzG_0_217taC98egroDcRlk'
        // 初始化 Cesium Viewer
        const viewer = new Cesium.Viewer('cesiumContainer', {
            // 基础配置
            shouldAnimate: false, // 启用动画
            baseLayerPicker: false, // 基础图层选择器
            geocoder: false, // 地址搜索框
            homeButton: false, // 主页按钮
            infoBox: false, // 信息框
            timeline: false, // 时间轴
            navigationHelpButton: false, // 导航帮助按钮
            sceneModePicker: false, // 场景模式选择器(2D/3D)
            fullscreenButton: false, // 全屏按钮
            animation: false, // 动画控件
            selectionIndicator: false, // 选择指示器
            vrButton: false, // VR 按钮
            imageryProvider: false,
            sceneMode: Cesium.SceneMode.SCENE2D,
        });
        const MapHook = new Hook(viewer);
        MapHook.init()

    </script>
</body>

</html>

反向遮罩class代码

export default class Hook {
  constructor(viewer) {
    this.viewer = viewer;
  }
  init() {
    const viewer = this.viewer;
    // 隐藏版权信息
    viewer._cesiumWidget._creditContainer.style.display = 'none';

    // 添加自定义的图层
    const tdtLayer = 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: 3,
      maximumLevel: 18,
    });
    viewer.imageryLayers.addImageryProvider(tdtLayer);
    viewer.camera.setView({
      destination: Cesium.Cartesian3.fromDegrees(116.75735, 39.85946, 135000.0), // 设置位置
    });

    // 添加自定义的图层;
    const dataSources = Cesium.GeoJsonDataSource.load('../data/通州区.json', {
      fill: Cesium.Color.WHITE.withAlpha(0.05), //多边形填充颜色
      strokeWidth: 3,
      stroke: Cesium.Color.RED,
    });
    dataSources.then((dataSource) => {
      viewer.dataSources.add(dataSource);
      this.createReverseMask(dataSource);
    });
  }

  createReverseMask(dataSource) {
    const viewer = this.viewer;
    // 获取通州区的多边形坐标
    const entities = dataSource.entities.values;
    const positionArray = [];

    // 提取所有多边形的坐标
    for (let i = 0; i < entities.length; i++) {
      const entity = entities[i];
      if (entity.polygon) {
        // 处理Polygon实体
        if (entity.polygon.hierarchy.getValue()) {
          const hierarchy = entity.polygon.hierarchy.getValue();
          if (hierarchy.positions) {
            // 简单多边形
            positionArray.push(hierarchy.positions);
          } else if (hierarchy.children) {
            // 带有洞的多边形或MultiPolygon
            for (let j = 0; j < hierarchy.children.length; j++) {
              positionArray.push(hierarchy.children[j].positions);
            }
          }
        }
      }
    }

    let polygonEntity = new Cesium.Entity({
      polygon: {
        hierarchy: {
          // 添加外部区域为1/4半圆,设置为180会报错
          positions: Cesium.Cartesian3.fromDegreesArray([0, 0, 0, 90, 179, 90, 179, 0]),
          // 中心挖空的“洞”
          holes: [
            {
              positions: positionArray[0],
            },
          ],
        },
        material: Cesium.Color.ALICEBLUE.withAlpha(0.8),
      },
    });

    viewer.entities.add(polygonEntity);
  }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值