Cesium基础(一):初识三维地球可视化

850 阅读3分钟

Cesium环境搭建及初始化

  引言:当前主流GIS系统开发多采用框架集成方案,本文将以Vue3+vite工程为例,分享Cesium在现代化前端工程中的集成方案。至于TypeScript,作者已经在公司项目中开始实践,为了更流畅的编写代码,因此在此项目中没有引入TypeScript。

  • 环境版本号

      node:v18.20.0
      vue:v3.5.13
      cesium:v1.128.0
      vite:v6.2.1
    
  • 创建vue项目: 请自行查找怎么创建vue3+vite项目。

  • 集成cesium: npm i cesium@1.128.0 vite-plugin-cesium,执行此命令,等待依赖下载完成。打开vite.config.js文件。

// vite.config.js
......
// 引入cesium集成插件,不用像webpack一样中配置好多东西
import cesium from "vite-plugin-cesium";
export default defineConfig({
  plugins: [
    .....
    cesium(),//在此引入cesium集成插件
  ],
  ......
});
  • 项目初始化: 此时cesium已集成到vue项目中,在src目录下创建hooks目录,创建useCesium.js文件。
// useCesium.js
import * as cesium from "cesium"; // 引入cesium.js库
// cesium的Token,联网开发时用来请求官方的地图和地形资源时认证用,断网时,自己搭建的地形和地图资源则无所谓。
// import.meta.env.VITE_CESIUM_TOKEN:请在cesium官网注册申请自己的TOKEN,否则官方的地图资源无法加载。
cesium.Ion.defaultAccessToken = import.meta.env.VITE_CESIUM_TOKEN;
// cesium配置项
export const options = {
  infoBox: false, // 信息展示框(默认右下角弹窗)
  selectionIndicator: false, // 选择指示器(选中实体时的黄色选框)
  animation: false,   // 动画控制组件(时间轴上方播放按钮)
  baseLayerPicker: false, // 底图切换面板(包含影像/地形图切换)
  geocoder: false, // 地理编码搜索框(右上角搜索按钮)
  navigationHelpButton: false, // 导航帮助面板(问号图标操作指南)
  fullscreenButton: false, // 全屏切换按钮(右下角全屏控件)
  homeButton: false, // 复位视角按钮(默认返回初始视角)
  sceneModePicker: false,  // 场景模式切换(2D/3D/哥伦布视图切换)
  timeline: false,  // 时间轴控件(底部时间进度条)
  shadows: true, // 阴影渲染开关(影响模型/地形的光影效果)
  shouldAnimate: true, // 自动动画开关(控制时钟自动推进)
};
/**
 * cesium初始化
 * @param {HTMLElement} element 
 * @returns {viewer} viewer
 */
export const useCesium = (element) => {
  const viewer = new cesium.Viewer(element, {
    ...options,
  });
  // 去除logo
  const creditContainer = viewer.cesiumWidget.creditContainer;
  creditContainer.style.display = "none";
  //关闭大气
  viewer.scene.skyAtmosphere.show = false;
  //抗锯齿
  viewer.scene.postProcessStages.fxaa.enabled = true;
  viewer.scene.screenSpaceCameraController.enableCollisionDetection = false;
  // 删除左键双击,右键单击
  viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction(
    cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK
  );
  viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction(
    cesium.ScreenSpaceEventType.RIGHT_CLICK
  );
  return viewer;
};

views目录下创建initEarth.vue,引入useCesium.js文件。

// initEarth.vue
<script setup>
import * as cesium from "cesium";
import { onMounted } from "vue";
import { useCesium } from "@/hooks/useCesium";
onMounted(() => {
    const earth = document.querySelector("#earth");
    useCesium(earth);
});
</script>
<template>
    <div class="earth" id="earth"></div>
</template>

<style lang="scss" scoped>
.earth {
    width: 100%;
    height: 100%;
}
</style>

打开路由配置文件src/router/index.js,配置对应的路由。

// router.js
import { createRouter, createWebHistory } from "vue-router";
const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
  ......
  {
  ......
    children: [
      {
        path: "/initEarth",
        name: "初始化地球",
        component: () => import("../views/initEarth.vue"),
      }
    ],
  },
  ......
  ],
});
export default router;

找到项目入口文件main.js。引入路由文件,其余路由出口根据需要在配置一、二级路由出口即可,App.vue如下。

// main.js
......
import router from "./router"; // 引入router,并使用
import store from "./store";
const app = createApp(App);
app.use(router).use(store).use(ElementPlus);
app.mount("#app");
// App.vue
<script setup>
import { RouterView } from 'vue-router'
</script>

<template>
 <RouterView />
</template>

<style scoped></style>
  • 项目启动: 执行npm run dev命令,如下图(已做配置项处理)

初始化地球.png

  • 未处理: 如下图,未作配置项处理

捕获.PNG

  • 总结: 至此,cesium项目集成初始化完成,相比于vue2+webpack来说,vue3+vite的项目工程cesium更方便集成,如果文章有不对的地方欢迎在下方留言指出,也感谢其余cesium大佬分享的博客,在作者工作中帮了不少大忙。
    目前作者正在整理在2023年毕业到现在工作中学习使用cesium的一些技术文档,后续还有,敬请期待!
  • 其他:
    turf: v7.2.0 <地理空间分析库,处理各种地图算法> https://fenxianglu.cn/turfjs/
    lodash: v4.17.21 <Lodash 是一个一致性、模块化、高性能的 JavaScript 实用工具库。> https://www.lodashjs.com/