Cesium.js--》探秘Cesium背后的3D模型魔力—加载纽约模型

今天简单实现一个Cesium.js的小Demo,加强自己对Cesium知识的掌握与学习,先简单对这个开源库进行一个简单的介绍吧!

Cesium 是一个开源的地理空间可视化引擎,用于创建基于 Web 的三维地球应用程序。它允许开发人员在网页上呈现高度可视化的地球数据,包括地形、卫星影像、建筑物、地理信息系统 (GIS) 数据等。其提供了强大的 JavaScript 库和 API,使开发人员可以轻松地构建交互式、高性能的地球应用。

总的来说,Cesium 是一个强大的工具,可以帮助开发者构建高度交互和可视化的地球应用,适用于各种领域,包括地理信息系统、虚拟旅游、航空航天等。接下来开始正式的学习!

目录

项目搭建

添加纽约建筑模型

划分城市区域

设置地图标记

设置模型运动轨迹


项目搭建

本案例还是借助框架书写cesium项目,借用vite构建工具搭建vue项目,vite这个构建工具如果有不了解的朋友,可以参考我之前对其讲解的文章:vite脚手架的搭建与使用。搭建完成之后,用编辑器打开该项目,在终端执行 npm i 安装一下依赖即可。

接下来简单的介绍一下Cesium,该开源库在vite官网社区插件中已经给出了相关的链接,如下:

社区插件链接中提供了许多vite工具集成的插件,并提供了相关插件的链接,cesium如下:

我们点击该 链接 ,就跳转到cesium相关介绍的github页面,这里提供了该插件的下载命令以及相关的配置使用介绍,下载命令如下,直接复制即可:

npm i cesium vite-plugin-cesium vite -D

根据官网的介绍,我们需要在vite.config.js中进行相应的代码配置,如下:

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
// 导入cesium插件
import cesium from 'vite-plugin-cesium';

export default defineConfig({
  plugins: [vue(), cesium()], // 调用cesium插件
})

配置完成之后,我们回到App根组件,然后我们引入cesium的全局对象进行测试,如下:

<template>
  <div id="cesiumContainer"></div>
</template>

<script setup>
import { ref, onMounted } from 'vue'
import * as Cesium from 'cesium';


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

});
</script>

<style scoped lang="scss">
#cesiumContainer {
  width: 100%;
  height: 100vh;
  overflow: hidden;
}
</style>

运行我们的项目,打开浏览器就可以看到我们下面的一个地球样式,我们也可以对其进行相关操作

当然我们也可以查看 https://cesium.com/  查阅相关Cesium相关的知识:

通过翻阅 Cesium相关API进行查看相应的使用    提供了相应的解释:

我们对代码进行如下修改,可以查看到相应的地形地貌:

onMounted(() => {
  let custom = new Cesium.ArcGisMapServerImageryProvider({
    url: 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer'
  });
  const viewer = new Cesium.Viewer('cesiumContainer', { 
    infoBox: false, // 关闭信息窗口
    imageryProvider: custom, // 自定义图层
    terrain: Cesium.Terrain.fromWorldTerrain(), // 开启地形
  });
});

当然我们也可以设置一开始聚焦的相机位置:

onMounted(() => {
  let custom = new Cesium.ArcGisMapServerImageryProvider({
    url: 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer'
  });
  const viewer = new Cesium.Viewer('cesiumContainer', { 
    infoBox: false, // 关闭信息窗口
    imageryProvider: custom, // 自定义图层
    terrain: Cesium.Terrain.fromWorldTerrain(), // 开启地形
  });
  viewer.camera.setView({
    destination: Cesium.Cartesian3.fromDegrees(116.2317, 39.5427, 200), // 坐标
    orientation: {
      heading: Cesium.Math.toRadians(90), // 方向
      pitch: Cesium.Math.toRadians(25), // 倾斜
    }
  })
});

定位的坐标方向,画面还是挺壮观的。(我爱说实话!)

添加纽约建筑模型

根据上文我们了解到的cesium的基本操作,接下来我们拿纽约这个地方进行举例,首先我们先掌握如何加载模型,我们打开 cesium官网 ,进行一个简单的注册,该官网和github联动的,和github关联一下即可,注册完毕会进入我们这一个控制台,如下:

因为纽约模型,cesium官网是提供的,我们点击Asset Depot选择相应的模型添加到My Assets:

选择我们相应添加的模型,复制代码到我们的项目即可,非常方便:

我们在场景加载的时候相机直接定位到纽约的位置,然后加载纽约的模型,如下:

onMounted(async () => {
  let custom = new Cesium.ArcGisMapServerImageryProvider({
    url: 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer'
  });
  const viewer = new Cesium.Viewer('cesiumContainer', { 
    infoBox: false, // 关闭信息窗口
    imageryProvider: custom, // 自定义图层
    terrain: Cesium.Terrain.fromWorldTerrain(), // 开启地形
  });
  viewer.camera.setView({
    destination:new Cesium.Cartesian3(1332761, -4662399, 4137888),
    orientation:{
      heading: 0.60,
      pitch: -0.66
    }
  })
  // 加载3DTiles纽约数据
  let city = viewer.scene.primitives.add( await Cesium.Cesium3DTileset.fromIonAssetId(2275207));
});

最终达到的效果如下,画面还不错(我爱说实话!)

划分城市区域

接下来我们通过GeoJSON来划分城市区域,GeoJSON(JavaScript Object Notation, 简称JSON)是一种对各种地理数据结构进行编码的格式,基于Javascript对象表示法的地理空间信息数据交换格式,可以表示几何、特征或者特征集合。

接下来我们调用GeoJson文件加载纽约区域的领域边界:

// 调用 GeoJson 文件加载邻域边界
let neighborhoodsPromise = Cesium.GeoJsonDataSource.load('/public/assets/SampleData/sampleNeighborhoods.geojson');

接下来将加载的地理数据(如街区或区域)添加到 Cesium 地球查看器(viewer)中,并对这些数据进行着色调整,并确保它们贴在地图表面上。

// 贴在地图表面
neighborhoodsPromise.then((dataSource) => {
  // 将数据添加到查看器
  viewer.dataSources.add(dataSource);
  // 把数据进行着色的调整以及放到地图的表面
  // 拿到区域的实例  Get the array of entities
  let neighborhoodsEntities = dataSource.entities.values;
  for (let i = 0; i < neighborhoodsEntities.length; i++) {
    let entity = neighborhoodsEntities[i];
    // 判断存不存在相应的图形 
    if (Cesium.defined(entity.polygon)) {
      entity.name = entity.properties.neighborhood;
      // 设置多边形颜色
      entity.polygon.material = Cesium.Color.fromRandom({
        red: 0.1, // 随机颜色
        maximumGreen: 0.5, // 最大绿色
        minimumBlue: 0.5, // 最小蓝色
        alpha: 0.6 // 透明度
      });
      // 设置地形着色
      entity.polygon.classificationType = Cesium.ClassificationType.TERRAIN;
      // 设置位置 贴到多边形最底下
      let polyPositions = entity.polygon.hierarchy.getValue(Cesium.JulianDate.now()).positions;
      entity.position = Cesium.Ellipsoid.WGS84.scaleToGeocentricSurface(
        Cesium.BoundingSphere.fromPoints(polyPositions).center,
      );
    }
  }
})

加载地理数据并在地图上显示,同时对加载的多边形进行着色调整,并确保它们贴在地球表面上,并为每个多边形添加标签。

// 生成标签
entity.label = {
  text: entity.name,
  showBackground: true,
  scale: 0.6,
  horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
  verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
  // 设置显示的距离范围
  distanceDisplayCondition: new Cesium.DistanceDisplayCondition(10, 8000),
  // 禁用的距离
  disableDepthTestDistance: 100
}

最终呈现的效果如下所示:

然后我们也可以通过鼠标点击某个标签进行区域的锁定,然后滑动鼠标进行详细查看:

设置地图标记

接下来通过KML文件进行图标标记,KML文件是谷歌公司创建的一种地标性文件,用于记录某一地点、或连续地点的时间、经度、纬度、海拔等地理信息数据,供GE等有关软件使用。

let kmlOptions = {
    camera : viewer.scene.camera,
    canvas : viewer.scene.canvas,
    // 如果我们想要将几何特征(多边形、线串和线性环)固定在地面上,则为 true。
    clampToGround : true
};
let geocachePromise = Cesium.KmlDataSource.load('/public/assets/SampleData/sampleGeocacheLocations.kml', kmlOptions);

接下来将 geocache 广告牌实体添加到场景中并为其设置样式:

geocachePromise.then(function(dataSource) {
    // 将新数据作为实体添加到查看器
    viewer.dataSources.add(dataSource);

    // 获取实体数组
    var geocacheEntities = dataSource.entities.values;

    for (var i = 0; i < geocacheEntities.length; i++) {
        var entity = geocacheEntities[i];
        if (Cesium.defined(entity.billboard)) {
            // 调整垂直原点,使图钉位于地形上
            entity.billboard.verticalOrigin = Cesium.VerticalOrigin.BOTTOM;
            entity.billboard.image = '/public/assets/tagpark.png'
            // 禁用标签以减少混乱
            entity.label = undefined;
            // 添加距离显示条件
            entity.billboard.distanceDisplayCondition = new Cesium.DistanceDisplayCondition(10.0, 20000.0);
            // 以度为单位计算纬度和经度
            var cartographicPosition = Cesium.Cartographic.fromCartesian(entity.position.getValue(Cesium.JulianDate.now()));
            var latitude = Cesium.Math.toDegrees(cartographicPosition.latitude);
            var longitude = Cesium.Math.toDegrees(cartographicPosition.longitude);
            // 修改描述
            var description = '<table class="cesium-infoBox-defaultTable cesium-infoBox-defaultTable-lighter"><tbody>' +
                '<tr><th>' + "Longitude" + '</th><td>' + longitude.toFixed(5) + '</td></tr>' +
                '<tr><th>' + "Latitude" + '</th><td>' + latitude.toFixed(5) + '</td></tr>' +
                '<tr><th>' + "实时人流" + '</th><td>' + Math.floor(Math.random()*20000)  + '</td></tr>' +
                '<tr><th>' + "安全等级" + '</th><td>' + Math.floor(Math.random()*5)  + '</td></tr>' +
                '</tbody></table>';
            entity.description = description;
        }
    }
});

最终呈现的效果如下所示,感觉还不错!(我爱说实话)

设置模型运动轨迹

接下来我们实现一个3D模型沿着地图上我们设置的轨迹进行运动,这里需要加载一个czml文件,该文件是一种用于描述三维场景的文本格式,通常与Cesium.js一起使用。它允许开发者以一种结构化的方式描述地球上的实体、图形、动画和其他地理空间信息,从而创建动态的、交互式的地理可视化应用程序。具体代码如下:

// 从czml文件加载模型运动路径
var dronePromise = Cesium.CzmlDataSource.load('/public/assets/SampleData/sampleFlight.czml');

// 模型实体
var drone;
dronePromise.then(function(dataSource){
  viewer.dataSources.add(dataSource);
  drone = dataSource.entities.getById('Aircraft/Aircraft1');
  drone.model = {
    // uri:'/public/assets/SampleData/Models/CesiumDrone.gltf', // 飞机模型
    uri:'/public/assets/SampleData/Models/ferrari2.gltf', // 汽车模型
    minimumPixelSize:128, // 最小像素大小
    maximumScale:1000, // 最大比例
    silhouetteColor:Cesium.Color.WHITE, // 轮廓颜色
    silhouetteSize:2 // 轮廓大小
  }

  drone.orientation = new Cesium.VelocityOrientationProperty(drone.position); // 运行姿态
  drone.viewFrom = new Cesium.Cartesian3(0,-30,30) // 运行视角
  viewer.clock.shouldAnimate = true; // 自动播放
})

最终达到的效果如下:

CZML文件可以手动编写,也可以由各种地理信息系统(GIS)工具或数据源生成。它使用JSON格式,因此易于阅读和编辑。Cesium.js库能够解析和渲染CZML文件,从而在Web浏览器中呈现出动态的地理可视化效果,如下可以看到czml对路径的绘制:

ok,效果完成了,喜欢的朋友点个赞收藏一下吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/541342.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

暴雨孙辉:做好服务器,但更要辟出技术落地之道

稳扎稳打一直是暴雨的风格&#xff0c;这在被访者孙辉的身上尽显。作为暴雨&#xff08;武汉暴雨信息发展有限公司&#xff09;中国区销售及市场副总裁&#xff0c;在谈及公司的技术发展与市场推广走势之时&#xff0c;孙辉沉稳、敏锐且逻辑清晰。 因在服务器领域起步很早&…

C#创建圆形窗体的方法:创建特殊窗体

目录 一、涉及到的知识点 1.OnPaint方法 2.将窗体设置为透明 &#xff08;1&#xff09;Form1的BackColor SystemColors.Control &#xff08;2&#xff09; Form1的背景色是某种颜色&#xff0c;比如BackColor SystemColors.White &#xff08;3&#xff09;加载资源…

TensorRT中的INT 8 优化

INT8 中的稀疏性&#xff1a;加速的训练工作流程和NVIDIA TensorRT 最佳实践 文章目录 INT8 中的稀疏性&#xff1a;加速的训练工作流程和NVIDIA TensorRT 最佳实践结构稀疏量化在 TensorRT 中部署稀疏量化模型的工作流程案例研究&#xff1a;ResNet-34要求第 1 步&#xff1a;…

简单工厂模式大解析:让代码创造更高效、更智能!

个人主页: danci_ &#x1f525;系列专栏&#xff1a;《设计模式》《MYSQL应用》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 &#x1f680; 转载自热榜文章&#xff1a;探索设计模式的魅力&#xff1a;简单工厂模式 简单工厂模式&#x…

传输层协议——UDP/TCP协议

目录 端口号 端口号范围 pidof UDP协议 UDP协议格式 UDP特点 UDP缓冲区 UDP的注意事项 基于UDP的应用层协议 TCP协议 TCP协议格式 序号与确认序号 窗口大小 6个标记位 紧急指针 确认应答机制 连接管理机制 三次握手 四次挥手 超时重传机制 流量控制 滑动…

java使用ShutdownHook优雅地停止服务

在Java程序中可以通过添加关闭钩子&#xff0c;实现在程序退出时关闭资源、平滑退出的功能。 使用Runtime.addShutdownHook(Thread hook)方法&#xff0c;可以注册一个JVM关闭的钩子&#xff0c;这个钩子可 这通常用于确保在应用程序退出时能够执行一些清理工作&#xff0c;比…

KVM + GFS 分布式存储

目录 一、案例分析 1.1、案例概述 1.2、案例前置知识点 1&#xff09;Glusterfs 简介 2&#xff09;Glusterfs 特点 1.3、案例环境 1&#xff09;案例环境 2&#xff09;案例需求 3&#xff09;案例实现思路 二、案例实施 2.1、安装部署 KVM 虚拟化平台 1&…

【Web】DASCTF 2023 0X401七月暑期挑战赛题解

目录 EzFlask MyPicDisk ez_cms ez_py 让俺看看401web题 EzFlask 进来直接给了源码 import uuidfrom flask import Flask, request, session from secret import black_list import jsonapp Flask(__name__) app.secret_key str(uuid.uuid4())def check(data):for i i…

亚远景科技-ASPICE 4.0-HWE硬件过程的范围 The Technical Scope of HW process

ASPICE 4.0中的HWE process是电气和电子硬件的技术范畴&#xff0c;涵盖了硬件工程中的需求分析、设计和验证活动&#xff0c;但不包括以下活动&#xff1a; 1. 系统级工程过程。既不包括机电一体MECHATRONIC&#xff0c;也不包括ECU特定电子控制单元的开发。 2. 硬件采购过程…

叉车载货出入库AI检测算法介绍及应用

随着物流行业的快速发展&#xff0c;叉车作为物流运输的重要设备&#xff0c;其安全性和效率性越来越受到人们的关注。然而&#xff0c;在实际操作中&#xff0c;由于人为因素和操作环境的复杂性&#xff0c;叉车事故时有发生&#xff0c;给企业和个人带来了巨大的损失。为了提…

部署Kafka集群图文详细步骤

1 集群规划 共三台虚拟机同处overlay网段&#xff0c;每台虚拟机部署一套kafka和zookeeper&#xff0c;kafka_manager安装其中一台虚拟机上即可。 HostnameIP addrPortListenerzk1docker-swarm分配2183:2181zk2docker-swarm分配2184:2181zk3docker-swarm分配2185:2181k1docke…

word从零基础到高手【办公】

第1课 - word基础操作快速入门第2课 - 让你效率10倍提升的快捷操作第3课 - word排版快速入门第4课 - 排版实战案例讲解第5课 - 搞定论文排版全过程第6课 - 让你的word更强大的神技第7课 - 提高工作效率必备的批量操作 资料截图如下: 发送: "word办公" 获取提取码

基于ssm的土家风景文化管理平台(java源码+文档)

项目简介 土家风景文化管理平台实现了以下功能&#xff1a; 土家风景文化管理平台的主要使用者分为管理员&#xff1a;管理员使用本平台涉到的功能主要有&#xff1a;首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;景点分类管理&#xff0c;热门景点管理&#xf…

海康4G摄像机国标注册失败,接入国标28181视频监控平台失败的问题分析、排查、解决

目录 一、问题现象 &#xff08;一&#xff09;背景 &#xff08;二&#xff09;在平台端&#xff0c;设备显示在线&#xff0c;通道不能传到平台端 &#xff08;二&#xff09;直接把通道接入进来&#xff0c;查看是否&#xff0c;显示请求超时 二、问题分析 &#xff0…

IntelliJ IDE 插件开发 | (九)实现 Unicode 字符折叠预览

系列文章 本系列文章已收录到专栏&#xff0c;交流群号&#xff1a;689220994&#xff0c;也可点击链接加入。 前言 在上一篇文章中我们介绍了如何实现 i18n 的方式&#xff0c;其中提到官方建议我们在编写语言文件时将 ASCII 码范围外的字符都使用 Unicode 编码进行表示&am…

【vue3-pbstar-books】大学生前端期末作业(vue3、element-plus、ts、pinia、vite、json-server)

一、项目要求 二、项目介绍 vue3-pbstar-books是一个图书主题的pc端网站&#xff0c;该项目有首页、全部书籍页、书籍分类页、书籍详情页和关于页五个页面。该方案结合了 Vue3、Element-Plus、TypeScript、Pinia 和 Vite 等先进技术&#xff0c;实现高效的页面布局、状态管理和…

基于ssm的校园短期闲置资源置换平台(java项目+文档+源码)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的校园短期闲置资源置换平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 校园短期闲置资源置换…

软考 - 系统架构设计师 - 面向对象架构设计案例

问题1&#xff1a; 解决该题&#xff0c;用例和参与者要一起进行分析&#xff0c;首先看到用例 U1 和 U2 是 U3 的扩展&#xff0c;分析用例列表中的用例&#xff0c;可以分析出 U1 和 U2 是Underpaid transaction 和 Record lllegal use&#xff0c;顺序可以颠倒&#xff0c;…

Unity绘制地图

首先在项目/Assets文件夹下创建一个Tiles文件夹 在层级下点击鼠标右键选择2D对象选择瓦片地图创建Tilemap。 选择地图素材 如果素材需要裁剪&#xff0c;在检查器Sprite模式选择多个&#xff0c;点击Sprite Editor,选择切 &#xff0c;选择类型Grid By Cell Count&#xff0c;…

Windows server SMB服务 文件夹访问缓慢 解决方法

Windows server用了很久&#xff0c;一直有个问题没有解决&#xff0c;就是用手机访问SMB时&#xff0c;文件夹列出速度非常慢&#xff0c;今天去翻阅了一下官方文档&#xff0c;找到了解决办法。 更改注册表SMB服务的工作进程数 HKLM\System\CurrentControlSet\Control\Sessi…