Skip to content

useSwitchBaseLayer

简介

切换底图

使用示例

点我查看代码
vue
<script lang="ts" setup>
import { EPSG_3857, getBingLayer, getOSMLayer, getTianDiTuLayer, OlMap, useSwitchBaseLayer } from '@summeruse/ol'
import { NSelect } from 'naive-ui'
import { Map as OLMap } from 'ol'

const olMap = new OLMap()

const layers = {
  osm: [getOSMLayer()],
  bing: [getBingLayer({
    key: 'AtmBUmOPFg6c61ynLhIbjvrKfuXkMw1lCMTlLh9ALY47Llyetb6lgyRMitoPxKZo',
    name: 'RoadOnDemand',
  })],
  天地图卫星图: [
    getTianDiTuLayer({
      type: 'img',
      key: '8a684acb7b9d38ba08adf8035d0262ee',
      projection: EPSG_3857,
    }),
    getTianDiTuLayer({
      type: 'cia',
      key: '8a684acb7b9d38ba08adf8035d0262ee',
      projection: EPSG_3857,
    }),
  ],
}

const { visibleLayerName } = useSwitchBaseLayer({
  defaultLayerName: 'osm',
  olMap,
  layers,
})

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

<template>
  <NSelect v-model:value="visibleLayerName" class="w-200px" :options />
  <OlMap :ol-map class="w-100% h-400px" />
</template>

源代码

点我查看代码
ts
import type { Map as OLMap } from 'ol'
import type TileLayer from 'ol/layer/Tile'
import { ref, watch } from 'vue'

export function useSwitchBaseLayer(data: {
  olMap: OLMap
  defaultLayerName?: string
  layers: {
    [key: string]: TileLayer[]
  }
}) {
  const visibleLayerName = ref(data.defaultLayerName || Object.keys(data.layers)[0])
  Object.values(data.layers).forEach((list) => {
    list.forEach((layer) => {
      data.olMap.addLayer(layer)
    })
  })

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

  return { visibleLayerName }
}

Released under the ISC License.