Cesium 加载瓦片地图-天地图

55 阅读3分钟

demo:

<template>

    <div id="cesiumContainer" style="width: 100vw; height: 100vh"></div>

</template>

  

<script setup>

  
  

// 设置 Cesium 访问 token(可选,用于 Bing 影像等)

const defaultAccessToken =

    "eyJhbGciOiJIUzI1NiIsxxxx1M2MyLTQ2OGEtOWY2Ny1jYWY3YTQwZWMwYmYiLCJpZCI6MTE3NDpYXQiOjE2NzYwOTYzNzd9.eSlnFruvV5Kk0xnGjFjJ3xAtYGvnKcKIEspCtinBmBY";

  

Cesium.Ion.defaultAccessToken = defaultAccessToken // 可留空或申请免费 token

  

import { onMounted, onUnmounted } from 'vue'

  

let viewer = null

const TDU_Key = '4b6b5fbxxxxx64e8d005fd09dae6'

const baseUrl = "http://t{s}.tianditu.com";

// 天地图矢量

let tiandiVec = new Cesium.UrlTemplateImageryProvider({

    subdomains: ["0", "1", "2", "3", "4", "5", "6", "7"],  // 实现子域(Subdomain)负载均衡,提升瓦片加载速度

    url: baseUrl + "/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk=" + TDU_Key,

    minimumLevel: 1, //最小层级  设置可加载的最小瓦片层级

    maximumLevel: 18, //最大层级 设置可加载的最大瓦片层级

});

  

// 天地图标注

let tiandiCva = new Cesium.UrlTemplateImageryProvider({

    subdomains: ["0", "1", "2", "3", "4", "5", "6", "7"],

    url: baseUrl + "/DataServer?T=cva_w&x={x}&y={y}&l={z}&tk=" + TDU_Key,

    minimumLevel: 1, //最小层级

    maximumLevel: 18, //最大层级

});

  
  

onMounted(() => {

    // 初始化 Viewer

    viewer = new Cesium.Viewer('cesiumContainer', {

        animation: false,  // 隐藏默认组件

        baseLayerPicker: false, // 隐藏默认组件

        fullscreenButton: false, // 隐藏默认组件

        geocoder: false,// 隐藏默认组件-位置搜索组件

        homeButton: false,// 隐藏默认组件

        infoBox: false,

        sceneModePicker: false,

        selectionIndicator: false,

        timeline: false,

        navigationHelpButton: false,

        sceneMode: Cesium.SceneMode.SCENE2D,

        imageryProvider: false, // 禁用了默认的bing 地图

    });

  
  

    viewer.scene.backgroundColor = Cesium.Color.WHITE

    viewer.imageryLayers.addImageryProvider(tiandiVec);

    viewer.imageryLayers.addImageryProvider(tiandiCva);

  
  
  
  

    // 设置缩放限制(对应天地图 level 3 ~ level 16)

    const MIN_HEIGHT = 8000000;   // 最小高度(最大缩小程度)→ 对应低 zoom level

    const MAX_HEIGHT = 1000;      // 最大高度(最大放大程度)→ 对应高 zoom level

  

    // 监听相机变化

    viewer.camera.changed.addEventListener(() => {

        const height = viewer.camera.positionCartographic.height;

  

        console.log('height',height)

  

        if (height < MAX_HEIGHT) {

            // 防止过度放大(高度太低)

            viewer.camera.setView({

                destination: Cesium.Cartesian3.fromRadians(

                    viewer.camera.positionCartographic.longitude,

                    viewer.camera.positionCartographic.latitude,

                    MAX_HEIGHT

                )

            });

        } else if (height > MIN_HEIGHT) {

            // 防止过度缩小(高度太高)

            viewer.camera.setView({

                destination: Cesium.Cartesian3.fromRadians(

                    viewer.camera.positionCartographic.longitude,

                    viewer.camera.positionCartographic.latitude,

                    MIN_HEIGHT

                )

            });

        }

    });

  
  
  
  
  

    // 设置相机位置,确保视角定位到中国范围内

    viewer.camera.setView({

        destination: Cesium.Cartesian3.fromDegrees(116.4, 39.9, 1000000), // 经度,纬度,高度(米)- 这里以北京为例

        orientation: {

            heading: 0.0,

            pitch: -1.5, // 在2D模式下,这个角度有助于正确显示

            roll: 0.0

        }

    });

})

  

onUnmounted(() => {

    if (viewer) {

        viewer.destroy()

    }

})

</script>

  

<style>

/* 确保容器有尺寸 */

#cesiumContainer {

    width: 100%;

    height: 100%;

}

  

.cesium-viewer {

    width: 100%;

    height: 100%;

}

</style>

地图加载地址:

export const TDU_Key = "4b6b5fb266xxx005fd09dae6"; // 天地图key
//在线天地图影像服务地址(墨卡托投影)
export const TDT_IMG_W =
  "http://{s}.tianditu.gov.cn/img_w/wmts?service=wmts&request=GetTile&version=1.0.0" +
  "&LAYER=img&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}" +
  "&style=default&format=tiles&tk=" +
  TDU_Key;
//在线天地图矢量地图服务(墨卡托投影)
export const TDT_VEC_W =
  "http://{s}.tianditu.gov.cn/vec_w/wmts?service=wmts&request=GetTile&version=1.0.0" +
  "&LAYER=vec&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}" +
  "&style=default&format=tiles&tk=" +
  TDU_Key;
//在线天地图影像中文标记服务(墨卡托投影)
export const TDT_CIA_W =
  "http://{s}.tianditu.gov.cn/cia_w/wmts?service=wmts&request=GetTile&version=1.0.0" +
  "&LAYER=cia&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}" +
  "&style=default.jpg&tk=" +
  TDU_Key;
//在线天地图矢量中文标记服务(墨卡托投影)
export const TDT_CVA_W =
  "http://{s}.tianditu.gov.cn/cva_w/wmts?service=wmts&request=GetTile&version=1.0.0" +
  "&LAYER=cva&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}" +
  "&style=default.jpg&tk=" +
  TDU_Key;
export function getProviderViewModels() {
  const baseUrl = "http://t{s}.tianditu.com";
  //天地图矢量
  let tiandiVec = new Cesium.UrlTemplateImageryProvider({
    subdomains: ["0", "1", "2", "3", "4", "5", "6", "7"],
    url: baseUrl + "/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk=" + TDU_Key,
    minimumLevel: 0, //最小层级
    maximumLevel: 18, //最大层级
  });
  //天地图影像
  let tiandiImg = new Cesium.UrlTemplateImageryProvider({
    subdomains: ["0", "1", "2", "3", "4", "5", "6", "7"],
    url: baseUrl + "/DataServer?T=img_w&x={x}&y={y}&l={z}&tk=" + TDU_Key,
    minimumLevel: 0, //最小层级
    maximumLevel: 18, //最大层级
  });
  //天地图标注
  let tiandiCva = new Cesium.UrlTemplateImageryProvider({
    subdomains: ["0", "1", "2", "3", "4", "5", "6", "7"],
    url: baseUrl + "/DataServer?T=cva_w&x={x}&y={y}&l={z}&tk=" + TDU_Key,
    minimumLevel: 0, //最小层级
    maximumLevel: 18, //最大层级
  });
  let tiandiVecModel = new Cesium.ProviderViewModel({
    name: "天地图",
    category: "国内地图资源",
    iconUrl: Cesium.buildModuleUrl(
      "./Images/ImageryProviders/openStreetMap.png"
    ),
    tooltip: "WMTS 地图服务",
    creationFunction: function () {
      return [tiandiVec, tiandiCva];
    },
  });
  let tiandiImgModel = new Cesium.ProviderViewModel({
    name: "天地图影像",
    category: "国内地图资源",
    iconUrl: Cesium.buildModuleUrl(
      "./Images/ImageryProviders/esriWorldImagery.png"
    ),
    tooltip: "WMTS 影像服务",
    creationFunction: function () {
      return [tiandiImg, tiandiCva];
    },
  });
  return [tiandiVecModel, tiandiImgModel];
}