Skip to content

useSwitchBaseLayer

简介

切换底图

使用示例

点我查看代码
vue
<script lang="ts" setup>
import { createCesiumViewer, getTianDiTuLayer, useSwitchBaseLayer } from '@summeruse/cesium'
import { NSelect } from 'naive-ui'
import { shallowRef } from 'vue'

const container = shallowRef<HTMLDivElement>()
const { viewer } = createCesiumViewer(container)

const key = '8a684acb7b9d38ba08adf8035d0262ee'

const layers = {
  影像: [getTianDiTuLayer({
    type: 'img',
    key,
  }), getTianDiTuLayer({
    type: 'cia',
    key,
  })],
  矢量: [getTianDiTuLayer({
    type: 'vec',
    key,
  }), getTianDiTuLayer({
    type: 'cta',
    key,
  })],
  地形: [getTianDiTuLayer({
    type: 'ter',
    key,
  }), getTianDiTuLayer({
    type: 'cva',
    key,
  })],
}

const options = Object.keys(layers).map(key => ({
  value: key,
  label: key,
}))

const { visibleLayerName } = useSwitchBaseLayer({
  viewer,
  layers,
})
</script>

<template>
  <NSelect v-model:value="visibleLayerName" :options />
  <div ref="container" class="w-100% h-300px" />
</template>

源代码

点我查看代码
ts
import type { ImageryLayer, Viewer } from 'cesium'
import { ref, watch } from 'vue'

export function useSwitchBaseLayer(data: {
  viewer: Viewer
  defaultLayerName?: string
  layers: {
    [key: string]: ImageryLayer[]
  }
}) {
  const visibleLayerName = ref(data.defaultLayerName || Object.keys(data.layers)[0])
  Object.values(data.layers).forEach((list) => {
    list.forEach((layer) => {
      data.viewer.imageryLayers.add(layer)
    })
  })

  watch(
    visibleLayerName,
    () => {
      Object.entries(data.layers).forEach(([name, list]) => {
        const visible = name === visibleLayerName.value
        list.forEach((layer) => {
          layer.show = visible
        })
      })
    },
    {
      immediate: true,
    },
  )

  return { visibleLayerName }
}

Released under the ISC License.