当前位置: 首页 > news >正文

Vue3+Cesium+vite 入门- 项目搭建

一.项目搭建

  1. 环境准备

    • 确保本地安装了 Node.js(推荐版本 v16 以上)。

    • 使用 Vue CLI 或 Vite 创建 Vue 3 项目。

  2. 创建 Vue 3 项目 使用 Vite 创建项目,因为它构建速度快且配置简单

npm init vite@latest cesium-vue-app --template vue
cd cesium-vue-app
npm install
npm install cesium

3.配置 Vite 以支持 Cesium

修改 vite.config.js 文件,添加以下代码:

import { defineConfig, loadEnv } from 'vite'
import path from 'path'
import createVitePlugins from './vite/plugins'
import cesium from 'vite-plugin-cesium'

export default defineConfig(({ mode, command }) => {
    const env = loadEnv(mode, process.cwd())
    return {
        plugins: [cesium(), ...createVitePlugins(env, command === 'build')],
        assetsInclude: ['**/*.glb'],
        resolve: {
            alias: {
                '~': path.resolve(__dirname, './'),
                '@': path.resolve(__dirname, './src')
            },
            extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue']
        },
        server: {
            port: 4200,
            host: true,
            open: false,
            cors: true,
            proxy: {
                '/api': {
                    target: 'http://127.0.0.1:3000',
                    changeOrigin: true
                }
            }
        }
    }
})

4.导入 Cesium 样式

main.js 中导入 Cesium 的样式文件:

import 'cesium/Build/Cesium/Widgets/widgets.css';

二.创建 Cesium 地球组件

1.创建地图初始化逻辑

src 下创建 cesium 文件夹,再在其中创建 map.init.jsmap.config.js 文件:

  • map.init.js

import { ref } from 'vue'
import * as Cesium from 'cesium'
import { mapOptions, tiandituAnnotationProvider } from "@/cesium/map.config.js";
const cesium_token = '注册cesium token' // 替换为你的 Cesium Token
export const map = ref(null)
export const mapInit = () => {
    Cesium.Ion.defaultAccessToken = cesium_token
    map.value = new Cesium.Viewer('cesiumContainer', mapOptions())
    map.value.imageryLayers.addImageryProvider(tiandituAnnotationProvider);
    map.value.scene.globe.depthTestAgainstTerrain = true
}
export const mapDestroy = () => {
    if (map.value) {
        map.value.destroy()
        map.value = null;
    }
}
  • map.config.js
import * as Cesium from 'cesium';
const tiandituKey = "替换为你的天地图 API Key";
const tiandituImageryProvider = new Cesium.WebMapTileServiceImageryProvider({
    url: `https://t{s}.tianditu.gov.cn/img_w/wmts?tk=${tiandituKey}`,
    layer: 'img',
    style: 'default',
    format: 'tiles',
    tileMatrixSetID: 'w',
    subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
    maximumLevel: 18
});
export const tiandituAnnotationProvider = new Cesium.WebMapTileServiceImageryProvider({
    url: `https://t{s}.tianditu.gov.cn/cia_w/wmts?tk=${tiandituKey}`,
    layer: 'cia',
    style: 'default',
    format: 'tiles',
    tileMatrixSetID: 'w',
    subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
    maximumLevel: 18
});
export const mapOptions = () => {
    return {
        infoBox: false,
        selectionIndicator: false,
        imageryProvider: tiandituImageryProvider,
        scene3DOnly: false,
        timeline: false,
        animation: false,
        geocoder: false,
        homeButton: false,
        sceneModePicker: false,
        baseLayerPicker: false,
        navigationHelpButton: false,
        fullscreenButton: false
    }
}

2.创建 CesiumMap.vue 组件

src/components 文件夹中创建 CesiumMap.vue

<template>
    <div id="cesiumContainer"></div>
</template>
<script setup>
import { onMounted, onUnmounted } from 'vue'
import { mapDestroy, mapInit } from "@/cesium/map.init.js";

onMounted(() => {
    mapInit()
})
onUnmounted(() => {
    mapDestroy()
})
</script>
<style scoped>
#cesiumContainer {
    width: 100vw;
    height: 100vh;
    overflow: hidden;
}
:deep(.cesium-viewer-bottom) {
    display: none;
}
</style>

3.在 App.vue 中引入组件

<template>
    <div id="app">
        <CesiumMap />
    </div>
</template>
<script setup>
import CesiumMap from '@/components/CesiumMap.vue';
</script>

项目运行后就能看到地球了

三、代码分析

  1. Vue 3 的响应式原理 Vue 3 使用 ProxyReflect 实现响应式。Proxy 拦截对数据的读写操作,Reflect 动态操作数据。这种方式比 Vue 2 的 Object.defineProperty 更强大,支持动态添加或删除属性。

  2. CesiumJS 的集成方式

    • 在 Vue 3 中,通过 ref 创建响应式变量。

    • 使用 onMountedonUnmounted 生命周期钩子管理 Cesium 地图的初始化和销毁。

    • 将 Cesium 的地图容器 cesiumContainer 放置在 Vue 组件的模板中。

  3. 地图配置与数据加载

    • 地图配置通过 map.config.js 定义。

    • 使用天地图作为底图,通过 WebMapTileServiceImageryProvider 加载。

四、总结

通过上述代码,我们成功将 CesiumJS 与 Vue 3 结合,创建了一个简单的 3D 地图应用。Vue 3 的组件化开发模式和响应式原理为 CesiumJS 的集成提供了便利,使得开发过程更加高效。

http://www.dtcms.com/a/108196.html

相关文章:

  • HAL库 通过USB Boot进行APP程序升级
  • window11 通过cmd命令行安装 oh my zsh 的教程
  • VMware上的windows虚拟机安装使用Docker方法
  • MySQL篇(二): 核心知识深度聚簇解析:索引、非聚簇索引、回表查询、覆盖索引、超大分页处理、索引创建原则与索引失效场景
  • TDengine 权限管理与安全配置实战(二)
  • Redhat8.10 离线安装Snipe-IT v8.0.4 版本
  • 计算机网络中科大 - 第1章 结构化笔记(详细解析)
  • PostgreSQL pg_repack 重新组织表并释放表空间
  • NumPy的应用
  • 【数据结构】图的基本概念
  • 基于Django框架的基金数据可视化平台(源码+lw+部署文档+讲解),源码可白嫖!
  • 客户机用vscode连接局域网内主机
  • springboot去读yml配置文件中的属性值
  • LLM大模型学习系列——总纲
  • 瑞数信息发布《BOTS自动化威胁报告》,揭示AI时代网络安全新挑战
  • 深入解析 Java 8 Function 接口:函数式编程的核心工具
  • react 15-16-17-18各版本的核心区别、底层原理及演进逻辑的深度解析--react17
  • Windows下部署AgentGPT
  • C/C++与JavaScript的WebAssembly编程(一)
  • RNN模型及NLP应用(5/9)——多层RNN、双向RNN、预训练
  • js防抖函数防抖无效的解决方法
  • 14.网络套接字TCP
  • 5.好事多磨 -- TCP网络连接Ⅱ
  • LabVIEW多线程
  • API vs 网页抓取:获取数据的最佳方式
  • PyTorch中.pth文件的解析及应用
  • Linux的TCP连接数到达2万,其中tcp_tw、tcp_alloc、tcp_inuse都很高,可能出现什么问题
  • Python `async` 和 `asyncio` 区别; `asyncio.Lock` 和 `threading.Lock`区别
  • pyqt SQL Server 数据库查询-优化2
  • 使用ChromaDB构建RAG知识库