Cesium基础(三):图层设置

973 阅读4分钟

cesium图层设置

  引言:前面两篇文章介绍了cesium初始化及地形加载,这篇文章主要介绍cesium的图层管理,具体内容包括图层切换与实时调整图层显示效果。至于cesium图层是什么样的,可以去查cesium瓦片图。作者这里就不介绍了,有时间出一篇关于地形和瓦片图私有化部署的文章。

cesium图层切换

  实现思路:cesium在初始化完成后,返回的是viewer实例viewer实例有一个imageryLayers属性,具体API是Cesium.ImageryLayerCollection(),以数组的形式包含了当前加载所有地图信息,所以通过此属性直接拿到是一个地图资源的集合。通过向这个集合中添加地图实例,再实现单独控制每个地图的显隐。具体实现如下:

// layerChange.vue
<script setup>
import * as cesium from "cesium";
import { onMounted } from 'vue';
import { useCesium } from "@/hooks/useCesium";
let viewer = null
// 街道卫星图
const map1 = new cesium.UrlTemplateImageryProvider({
    url: '///data.mars3d.cn/tile/img/{z}/{x}/{y}.jpg'
})

// 高德矢量图
const map2 = new cesium.UrlTemplateImageryProvider({
    url: 'https://webrd04.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}'
})

// 单张图片
const map3 = new cesium.SingleTileImageryProvider({
    url: '/public/image/layers/world_b.jpg',
    tileWidth: 256,
    tileHeight: 256
})
// 图层切换,通过单个layer的show来切换图层
const changeLayer = (value) => {
    viewer.imageryLayers._layers.forEach((layer, index) => {
        index === value ? layer.show = true : layer.show = false
    })
}
onMounted(() => {
    const earth = document.querySelector("#earth");
    viewer = useCesium(earth);
    viewer.imageryLayers.addImageryProvider(map1)
    viewer.imageryLayers.addImageryProvider(map2)
    viewer.imageryLayers.addImageryProvider(map3)
    console.log(viewer.imageryLayers);
    viewer.imageryLayers._layers.forEach((layer, index) => {
        index === 0 ? layer.show = true : layer.show = false
    })
})


</script>

<template>
    <div class="content">
        <div class="earth" id="earth"></div>
        <div class="ribbon">
            <div class="flex js-left mb10">
                <el-button type="primary" size="small" @click="changeLayer(0)">卫星图层</el-button>
                <el-button type="primary" size="small" @click="changeLayer(1)">街道卫星图层</el-button>
                <el-button type="primary" size="small" @click="changeLayer(2)">街道图层</el-button>
                <el-button type="primary" size="small" @click="changeLayer(3)">底图设置</el-button>
            </div>
        </div>
    </div>

</template>

<style lang="scss" scoped>
.content {
    width: 100%;
    height: 100%;
    position: relative;

    .earth {
        width: 100%;
        height: 100%;
    }

    .ribbon {
        width: 200px;
        position: absolute;
        left: 10px;
        top: 10px;
        z-index: 99;
    }
}
</style>
API使用:

   1. Cesium.UrlTemplateImageryProvider: 通过使用指定的 URL 模板请求图块来提供影像。具体解释为:是 Cesium 中用于加载自定义瓦片地图服务的核心类。它通过 URL 模板机制实现对各种标准(如 TMS、WMTS 等)或非标准瓦片服务的支持。返回一个影像提供者实例。官方API

// 简单用法
new Cesium.UrlTemplateImageryProvider({
  url: 'http://example.com/{z}/{x}/{y}.jpg'
});

   2.cesium.SingleTileImageryProvider(): 提供单个顶级影像图块。假定该单张图像采用地理投影(即 WGS84 / EPSG:4326),并且将使用地理分块方案进行渲染。具体解释为:是 Cesium 中用于加载单张静态图片作为全局影像图层的类。与瓦片地图服务不同,它通过单张图片覆盖整个指定区域,适用于小范围或不需要动态切片的场景。官方API

// 简单用法
const map3 = new cesium.SingleTileImageryProvider({
    url: '图片途径',
    tileWidth: 256, // 图块的宽度,以像素为单位。
    tileHeight: 256, // 图块的高度,以像素为单位。
})

   3.addImageryProvider(): 使用给定的影像提供者创建一个新图层,并将其添加到图层集合中。具体解释为: 是 Cesium 中用于向地球添加影像图层的核心方法,属于ImageryLayerCollection类。返回ImageryLayer对象,用于控制该图层的显示属性。

// 简单用法
 const layer = viewer.imageryLayers.addImageryProvider(map1)
 layer.alpha = 0.5;       // 透明度(0-1)
 layer.brightness = 1.2;  // 亮度调整
 layer.show = false;       // 显隐控制

cesium图层调整

   实现思路:图层调整是针对某一特定图层来调整图层的亮度、对比度、饱和度、色调和伽马值。主要应用于遥感影像的色彩校正,地理数据可视化等。ImageryLayer是cesium中影像图层的核心类,其实例主要用来调整图层的显示,比如上方说的亮度、透明度、裁剪等效果。那么通过监听数据变化来实时更新ImageryLayer实例中属性的值,从而实现对某一图层的显示效果进行调整。具体实现如下:

// layerAdjust.vue
<script setup>
import { onMounted, ref } from 'vue';
import { useCesium } from "@/hooks/useCesium";
let viewer = null
let imageryLayers = null
const sliders = ref([
    { name: 'brightness', value: 1, title: '图层亮度' },
    { name: 'contrast', value: 1, title: '图层反差' },
    { name: 'saturation', value: 1, title: '图层饱和度' },
    { name: 'hue', value: 0, title: '图层伽马' },
    { name: 'gamma', value: 1, title: '图层色调' },
])
// 设置影像图层参数的订阅逻辑
const updateLayerParameter = (item) => {
    if (imageryLayers.length > 0) {
        const layer = imageryLayers.get(0);
        layer[item.name] = item.value;
    }
};
const reset = () => {
    sliders.value.forEach((item, index) => {
        index === 3 ? item.value = 0 : item.value = 1
        updateLayerParameter(item)
    })
}
onMounted(() => {
    const earth = document.querySelector("#earth");
    viewer = useCesium(earth);
    imageryLayers = viewer.imageryLayers
})
</script>

<template>
    <div class="content">
        <div class="earth" id="earth"></div>
        <div class="ribbon">
            <div class="flex js-left mb10">
                <el-button type="primary" size="small" @click="reset">色调重置</el-button>
            </div>
            <div class="slider-demo-block">
                <div class="flex ai-center js-between mr20" v-for="(item, index) in sliders" :key="index">
                    <span class="demonstration">
                        {{ item.title }}:
                    </span>
                    <el-slider class="f1" @input="updateLayerParameter(item)" :max="3" :step="0.01" v-model="item.value"
                        size="small" />
                </div>
            </div>
        </div>
    </div>
</template>

<style lang="scss" scoped>
.content {
    width: 100%;
    height: 100%;
    position: relative;

    .earth {
        width: 100%;
        height: 100%;
    }
    .ribbon {
        width: 200px;
        position: absolute;
        left: 10px;
        top: 10px;
        z-index: 99;
    }
}
.slider-demo-block {
    width: 100%;
    display: flex;
    justify-content: left;
    align-items: center;
    flex-wrap: wrap;
}
.slider-demo-block .el-slider {
    margin-top: 0;
    margin-left: 10px;
}
.el-slider {
    width: 180px;
}
.demonstration {
    font-size: 12px;
    color: #daf9ff;
    text-overflow: ellipsis;
    text-align: left;
    white-space: nowrap;
    width: 70px;
}
</style>

效果图:

   1. 图层切换

result.png    2. 图层调整

2.png

总结

   至此,cesium的初始化、地形的加载、地图的切换调整功能都已完成。这篇文章主要实现了对地图资源的切换,其实还有其他的功能,比如图层的叠加、反选遮罩等功能亟待实现,后续再更新。下一篇聊聊地图和地形资源的私有化部署,敬请期待!(觉得对你有帮助的话请点赞+收藏,有问题下方留言。)