Vite项目如何配置CesiumJS

CCesium 是一个跨平台、跨浏览器的展示三维地球和地图的 javascript 库。

Cesium 使用WebGL 来进行硬件加速图形,使用时不需要任何插件支持,但是浏览器必须支持WebGL;

目标

1、vite项目配置Cesium。

2、使用Cesium实现如下简单效果。

vite项目配置Cesium

1、引入Cesium的css文件

在main.ts中导入Cesium所需要的css文件,如下所示:

这里和导入其它组件库类似,比如导入ant-design的时候,同样需要导入css文件。

2、引入Cesium的静态文件

这四个文件是在项目打包的时候,需要导入到打包后的文件。

  • node_modules/cesium/Build/Cesium/Workers
  • node_modules/cesium/Build/Cesium/ThirdParty
  • node_modules/cesium/Build/Cesium/Assets
  • node_modules/cesium/Build/Cesium/Widgets

为了实现复制文件的目的,在vite中需要使用vite-plugin-static-copy插件。

2.1 按照vite-plugin-static-copy插件

pnpm add vite-plugin-static-copy -D

2.2 在vite.config.ts里边配置

  1. Ion配置(可选)

当项目中需要使用Ion的实现,需要配置accesstoken, accesstoken可以在Cesium官网申请。

申请完accesstoken以后,可以在src/main.ts里边安装如下配置。

至此开发环境配置全部完成。

  1. 项目打包报错

开发环境下没有问题,但是在执行打包的时候,会报如下错误:Unable to determine Cesium base URL automatically。

这个问题网上很多解决办法,很多说在vite中配置define,或者在index.html里边配置window.CESIUM_BASE_URL = '/cesiumStatic',但是都无法解决该问题。

最后发现是vite的版本问题,只要把vite的版本从4升级到5就可以了。

开发

js 复制代码
<template>
  <div class="box">
    <div id="cesiumContainer"></div>
  </div>
</template>

<script setup>
import * as Cesium from "cesium";
import { onMounted } from "vue";
  const cameraPositions = [
    { lon: 116.29421699792147, lat: 40.04092779976567, height: 20},
    { lon: 116.29431669792257, lat: 40.04092879976477, height: 20},
    { lon: 116.29411609792367, lat: 40.04082979976387, height: 20}
    // 添加更多摄像头位置...
  ];
onMounted(() => {
  const viewer = new Cesium.Viewer('cesiumContainer', {
    infoBox: false,
    shouldAnimate: true,
    sceneMode: Cesium.SceneMode.SCENE3D,
    timeline: false,
    animation: false,
    fullscreenButton: false,
    geocoder: false,
    homeButton: false,
    sceneModePicker: false,
    scene3DOnly: false,
    selectionIndicator: false,
    navigationHelpButton: false,
    shadows: false,
  });

  viewer._cesiumWidget._creditContainer.style.display = "none";
  viewer.scene.fxaa = false;
  viewer.scene.postProcessStages.fxaa.enabled = true;

  if (Cesium.FeatureDetection.supportsImageRenderingPixelated()) {
    viewer.resolutionScale = window.devicePixelRatio;
  }

  viewer.scene.globe.show = true;
  // viewer.scene.screenSpaceCameraController.enableInputs = false; // 禁用鼠标控制

  // 将三维球定位到中国
    viewer.camera.setView({
      // fromDegrees()方法,将经纬度和高程转换为世界坐标
      destination: Cesium.Cartesian3.fromDegrees(116.29967988095092, 40.0401389753888, 1000.0),
      orientation: {
        heading: 6.283185307179586,
        // 视角
        pitch: -1.5686521559334161,
        roll: 0,
      }
    });
    // 将相机视角定位到指定位置
  viewer.scene.camera.setView({
    destination: Cesium.Cartesian3.fromDegrees(
      116.29421699792147,
      40.04092779976567,
      100
    ),
    orientation: {
      heading : Cesium.Math.toRadians(0),
      pitch : Cesium.Math.toRadians(-90),
      roll : 0.0
    }
  });
  // let entity = null;
  cameraPositions.forEach((position, index) => {
    const entity = viewer.entities.add({
    position: Cesium.Cartesian3.fromDegrees(position.lon, position.lat, position.height),
    viewFrom: new Cesium.Cartesian3(0, 0, 0),
    point: {
      pixelSize: 10,
      color: Cesium.Color.BLUE,
    },
  });
});
  // console.log(12211,entity)
  // viewer.trackedEntity = entity;

});

</script>

<style scoped>
.box {
  width: 8rem;
  height: 8rem;
}
#cesiumContainer {
  width: 100%;
  height: 100%;
}
</style>

End;

相关推荐
子非鱼3734 分钟前
JS树形结构与列表结构之间的相互转换
前端
嘉小华5 分钟前
大白话讲解 Android LayoutInflater
前端
加18 分钟前
95%代码AI生成,是的你没听错...…
前端·ai编程
小赵学鸿蒙8 分钟前
如何使用第三方库中的picker_utils (API12) PickerUtil类
前端
3Katrina10 分钟前
深入理解 JavaScript 中的柯里化
前端·javascript
BillKu12 分钟前
Vue3 axios 请求设置 signal 信号属性,以便 abort 取消请求
前端·javascript·vue.js
憨憨是条狗22 分钟前
ArcGIS API for JavaScript 中的数据聚合功能深度解析
前端
lyc23333322 分钟前
鸿蒙Next断点适配:跨设备布局的黄金法则
前端
南囝coding1 小时前
《独立开发工具 • 半月刊》 第 012 期
前端·后端
Jack魏1 小时前
React学习001-创建 React 应用
前端·学习·react.js