Cesium 地图滤镜教程
2026/6/23 4:34:57 网站建设 项目流程

地图滤镜 ·Map Filter· ▶ 在线运行案例

  • 案例合集:三维可视化功能案例(threehub.cn)
  • 开源仓库github地址:https://github.com/z2586300277/three-cesium-examples
  • 400个案例代码:网盘链接

你将学到什么

  • Scene / Camera / Renderer 标准渲染管线搭建
  • 案例完整源码结构与可复用初始化模板

效果说明

本案例演示地图滤镜效果:基于 WebGL 实现「地图滤镜」可视化效果,附完整可运行源码。建议先打开文首在线案例查看动态画面,再对照下方源码逐步理解。

核心概念

  • Viewer封装地球、相机、图层;可关闭 animation/timeline 等 UI 精简界面。
  • ImageryLayer叠加 XYZ/WMTS/ArcGIS 等底图,imageryLayers.add/remove管理。

实现步骤

  • 初始化Cesium.Viewer与底图图层
  • 添加 Entity / Primitive / DataSource 等业务对象
  • 按需camera.flyTo定位视角
  • 代码要点

    import * as Cesium from 'cesium'

    const box = document.getElementById('box')

    const viewer = new Cesium.Viewer(box, {

    animation: false,//是否创建动画小器件,左下角仪表

    baseLayerPicker: false,//是否显示图层选择器,右上角图层选择按钮

    fullscreenButton: false,//是否显示全屏按钮,右下角全屏选择按钮

    geocoder: false,//是否显示geocoder小器件,右上角查询按钮

    homeButton: false,//是否显示Home按钮,右上角home按钮

    sceneMode: Cesium.SceneMode.SCENE3D,//初始场景模式

    sceneModePicker: false,//是否显示3D/2D选择器,右上角按钮

    navigationHelpButton: false,//是否显示右上角的帮助按钮

    selectionIndicator: false,//是否显示选取指示器组件

    timeline: false,//是否显示时间轴

    infoBox: false,//是否显示信息框

    scene3DOnly: true,//如果设置为true,则所有几何图形以3D模式绘制以节约GPU资源

    orderIndependentTranslucency: false, //是否启用无序透明

    contextOptions: { webgl: { alpha: true } },

    skyBox: new Cesium.SkyBox({ show: false }),

    baseLayer: false, // 不显示默认图层

    })

    viewer.imageryLayers.addImageryProvider(

    new Cesium.UrlTemplateImageryProvider({

    url: 'https://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=2&style=8&x={x}&y={y}&z={z}',

    maximumLevel: 18

    })

    )

    setViewerTheme(viewer) // 设置主题

    function setViewerTheme(viewer, options = {}) {

    const baseLayer = viewer.imageryLayers.get(0)

    if (!baseLayer) return

    baseLayer.brightness = options.brightness ?? 0.6

    baseLayer.contrast = options.contrast ?? 1.8

    baseLayer.gamma = options.gamma ?? 0.3

    baseLayer.hue = options.hue ?? 1

    baseLayer.saturation = options.saturation || 0

    const baseFragShader = (viewer.scene.globe)._surfaceShaderSet.baseFragmentShaderSource.sources

    for (let i = 0; i < baseFragShader.length; i++) {

    const strS = 'color = czm_saturation(color, textureSaturation);\n#endif\n'

    let strT = 'color = czm_saturation(color, textureSaturation);\n#endif\n'

    if (!options.invertColor) {

    strT +=color.r = 1.0 - color.r; color.g = 1.0 - color.g; color.b = 1.0 - color.b;}

    strT +=color.r = color.r * ${options.filterRGB_R ?? 100}.0/255.0; color.g = color.g * ${options.filterRGB_G ?? 138}.0/255.0; color.b = color.b * ${options.filterRGB_B ?? 230}.0/255.0;

    baseFragShader[i] = baseFragShader[i].replace(strS, strT)

    }

    viewer.scene.requestRender();

    }

    完整源码:GitHub

    小结

    • 本文提供地图滤镜完整 Cesium.js 源码与在线 Demo,建议先运行案例再改 uniform/参数做二次实验
    • 更多 Cesium.js 实战案例见 three-cesium-examples 合集 与 GitHub 开源仓库

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询