迈向三维:vue3+Cesium.js三维WebGIS项目实战

本文档详细介绍了使用Vue3和Cesium.js构建三维WebGIS项目的步骤,涵盖Cesium的基础知识、项目搭建、坐标转换、相机系统、地图与地形加载、空间数据管理和交互等内容,旨在为前端开发者提供一个立体交互的GIS学习路径。
摘要由CSDN通过智能技术生成

写在前面:随着市场对数字孪生的需求日益增多,对于前端从业者的能力从对框架vue、react的要求,逐步扩展到2D、3D空间的交互,为用户提供更紧密的立体交互。近年来前端对GIS的需求日益增多。本文将记录WebGIS的学习之旅,从实战项目入门,挖掘Cesium.js API,并逐步丰富项目。

目录

 一、WebGIS简介

CesiumJS简介

 CesiumJS源代码

 二、项目快速搭建

 使用vite快速搭建vue3+typeScript

 安装Cesium插件

配置vite.config.js

清空style.css

在App.vue里面进行全局导入

运行程序

三、认识Cesium四大类

查看器类Viewer

场景类Scene

实体类​编辑Entity

数据源集合类DataSourceCollection

四、Cesium的坐标与转换

 1.WGS84经纬度坐标系-没有实际的对象

 2.WGS84弧度坐标系(Cartographic)

构造函数法

静态函数法

3.笛卡尔空间直角坐标系(Cartesian3)*重要

4.平面坐标系(Cartesian2)

5.4D笛卡尔坐标系(Cartesian4)-用的较少

坐标系相互转换

WGS84转笛卡尔空间直角坐标系

 笛卡尔空间直角坐标系转WGS84

平面坐标系转场景WGS84坐标

屏幕坐标转地表坐标

 屏幕坐标转椭球面坐标

 五、重要Cesium相机系统

 1.setView方法

 2.flyTo方法

3. lookAt方法

 4.viewBoundingSphere方法

 六、Cesium地图和地形加载

注册Cesium Ion

加载公路地图数据

 加载地形数据

 添加建筑体

 七、Cesium空间数据加载

几何体——点加载

几何体——线加载

 几何体——面加载

 几何体——3D模型加载

 文字——标签加载

 八、Cesium空间数据管理

添加我的博客立牌

entity增删改

add新增

 remove移除

 getById获取当个实体

 removeAll移除全部

九、Cesium鼠标交互

案例-鼠标左击弹出消息

 十、三维数据格式3DTiles

 十一、Cesium时间系统

十二、Cesium粒子系统


 一、WebGIS简介

WebGIS(Web地理信息系统)是指利用 Web 技术来构建和展示地理信息系统(GIS),使用户可以通过 Web 浏览器访问、查询、分析和可视化地理空间数据。WebGIS 通常结合地图服务、地理信息数据库、前端地图库和相关的数据处理技术,为用户提供交互式的地图浏览和空间数据分析功能。 

CesiumJS简介

Cesium是使用JavaScript开发的基于WebGL的,实现三维地球和地图可视化的JS库。支持海量的三维模型数据、影像数据,地形数据,矢量数据等丰富的地理数据加载。在智慧城市、交通、规划、城市管理、地形仿真领域有着非常广泛的应用。Cesium为三维的GIS提供了一个高效的数据可视化平台。

Viewer - Cesium Documentation

CesiumJS是目前最流行的三维数字地球渲染引擎,不仅可以在网页端高效运行,而且可以借助虚幻引擎在CS端渲染出和游戏一样的高质量效果。

Cesium支持3D、2D、2.5D形式的地图展示,可以自行绘制图形,高亮区域。

 CesiumJS源代码

访问官网

Downloads – Cesium

 二、项目快速搭建

快速搭建一个下面的Cesium.js官方示例

 使用vite快速搭建vue3+typeScript

使用下面命令创建vue项目

npm create vite@latest
  • 设置项目名称
  • 选择使用vue
  • 选择是否使用typescript+vue 

 安装Cesium插件

npm i cesium vite-plugin-cesium vite -D

配置vite.config.js

vite.config.js中配置如下:

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import cesium from 'vite-plugin-cesium';
 
 
export default defineConfig({
  plugins: [vue(),cesium()]
});

清空style.css

在App.vue里面进行全局导入

需要id为cesiumContainer的div挂载后再执行Cesium的代码,给html、body加样式屏幕撑满。

注意:viewer实例的创建必须在onMounted之后进行,确保元素已经挂载到页面上,保证地图的顺利渲染

<template>
  <div id="cesiumContainer"></div>
</template>
 
<script setup>
import * as Cesium from 'cesium';
import { onMounted } from 'vue';
onMounted(() => {
  const viewer = new Cesium.Viewer('cesiumContainer',{
      infoBox: false, // 禁用沙箱,解决控制台报错
    });
});
</script>
 
<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
}
html,body,#cesiumContainer{
  width: 100%;
  height: 100%;
  padding: 0;
  margin: 0;
  overflow: hidden;
}
</style>

这段代码中的cesiumContainer是用作Cesium Viewer(查看器)的挂载点。在WebGL渲染中,无论是二维还是三维图像,都需要一个容器来承载渲染的内容。在这里,<div id="cesiumContainer"></div> 元素就是用来承载Cesium Viewer所渲染的内容。

当你创建一个Cesium Viewer实例时,你需要指定一个DOM元素作为其容器,Cesium会将渲染的内容放置在这个DOM元素中。

通过new Cesium.Viewer('cesiumContainer', {...}),将Cesium Viewer挂载到id为cesiumContainer的div元素上,从而实现了Cesium渲染的效果。

其实无论是二维还是三维图像渲染,都需要一个挂载点来显示渲染的内容,而在这里cesiumContainer就充当了这样的作用。原理都是相同的哈~

运行程序

npm run dev

即可得到上面示例的gif效果

 页面涉及的空间如下,所有的空间都可以关闭

    geocoder: 位置查找工具
    baseLayerPicker: 图层选择器(地形影像服务)
    homeButton: 视角返回初始位置
    fullscreenButton: 全屏
    animation: 左下角仪表盘(动画器件)

    timeline: 底部时间线
    sceneModePicker: 选择视角的模式(球体、平铺、斜视平铺)
    navigationHelpButton: 导航帮助按钮
    infoBox: 信息框控件
    navigationInstructionsInitiallyVisible: 导航说明初始可见
    shouldAnimate: 动画
    requestWaterMask: 请求水面罩
    requestVertexNormals: 请求顶点法线

三、认识Cesium四大类

查看器类Viewer

Viewer是三维数据展示的主要窗口,此外还包含了一些基础控件。在定义Viewer对象的同时需要设定基础部件、图层等的初始化状态。

 用法示例:

接收两个参数,第一个参数指定地图主窗口div的id;第二个参数options是Viewer的可选设置参数。包含图层、地形、时间系统等参数;种类多样。

  const viewer = new Cesium.Viewer('cesiumContainer',{
      infoBox: false, 
    });

 第二个参数接收的对象表示页面可关闭的控件,控件参数解释见上,代码示例

Viewer类,关闭左下角仪表盘及底部时间线

<script setup lang="ts">
import * as Cesium from 'cesium';
import { onMounted,ref} from 'vue';
const viewer = ref();
onMounted(() => {
   viewer.value = new Cesium.Viewer('cesiumContainer', {
    infoBox: false, // 禁用沙箱,解决控制台报错
    animation: false,//关闭左下角仪表盘(动画器件)
    timeline:false,//底部时间线
   });

});

 效果展示:红色圈出的部分是隐藏的控件

场景类Scene

在Cesium中Scene是非常重要的类,是所有3D图像对象的容器,是在Viewer内部隐式创建的。用于基础地理环境设置

 代码示例:隐藏地球

<script setup lang="ts">
import * as Cesium from 'cesium';
import { onMounted,ref} from 'vue';
const viewer = ref();
onMounted(() => {
   viewer.value = new Cesium.Viewer('cesiumContainer', {
    infoBox: false, // 禁用沙箱,解决控制台报错
    animation: false,//关闭左下角仪表盘(动画器件)
    timeline:false,//底部时间线
   });
  viewer.value.scene.globe.show = false;

});

 scene可以对场景进行交互:如鼠标事件、相机事件;可以通过scene控制相机对视口进行切换;

代码示例:

  viewer.value.scene.camera.setView({
    destination:Cesium.Cartesian3.fromDegrees(116.39,39.9,1500)
  })

 此外scene还可以修改地球的图层 样式或地形数据,更可以在图层上绘制几何体,点、线、面

实体类Entity

Entity是由Primitive封装而来,Entity并不属于Scene。

相比较而言,Entity封装程度高,构造简单,使用便捷,使得开发者专注于数据的呈现,而不必担心底层的可视化机制。它还提供了用于构建复杂的、时间动态可视化的结构。

Entity在使用中主要用于加载实体模型,几何图形;对其进行样式设置,动效修改等

 代码示例:

增加一个尺寸为100像素的绿色圆点,先设置当前圆点的位置。fromDegrees内的三个参数分别是经度、维度和高度;给圆点设置大小,pixelSize,在设置颜色;将摄像头设置在圆点处,使得我们可以观测到。

<script setup lang="ts">
import * as Cesium from 'cesium';
import { onMounted,ref} from 'vue';
const viewer = ref();
onMounted(() => {
   viewer.value = new Cesium.Viewer('cesiumContainer', {
    infoBox: false, // 禁用沙箱,解决控制台报错
    animation: false,//关闭左下角仪表盘(动画器件)
    timeline:false,//底部时间线
   });
  const entity = viewer.value.entities.add({
    position: Cesium.Cartesian3.fromDegrees(116.39, 39.91, 400),
    point: {
      pixelSize: 100,
      color: new Cesium.Color(0,1,0,1)
    }
  })
  viewer.value.trackedEntity = entity;
});

</script>

 效果展示

数据源集合类DataSourceCollection

在GIS开发中加载矢量数据是必不可少的功能。在Cesium加载以下几种格式的数据可实现矢量数据的加载和存取。

DataSourceCollection是Cesium中加载矢量数据的主要方式之一;最大特点是支持加载矢量数据集合外部文件的调用。主要有三种调用方法:

CzmlDataSource   加载czml格式

KmlDataSource    加载kml格式

GeoJsonDataSource   加载GeoJSON格式

缺少数据源,暂时用代码表示

  viewer.value.dataSource.add(
    Cesium.GeoJsonDataSource.load("../../**.topojson")
  )

四、Cesium的坐标与转换

Cesium是具有真实地理坐标的三维球体,而用户是通过二维屏幕与Cesium进行操作。我们将三维模型绘制在三维球体上就需要地理坐标和屏幕坐标之间做转换。接下来介绍Cesium的五种坐标系,及坐标系直接的相互转换

 1.WGS84经纬度坐标系-没有实际的对象

 简单点就是下面介绍的,WGS84是一种坐标系统,用于GPS全球定位系统使用。快把你初中高中的地理知识拿出来回忆回忆

  • 24
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三月的一天

你的鼓励将是我前进的动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值