cesium学习记录05-加载数据

news2024/7/4 5:49:43

1. 矢量数据:

1.1. GeoJSON
定义:

一个基于JSON的地理数据格式,Cesium支持GeoJSON的直接加载。

例子:

加载一个简易故宫建筑的GeoJSON数据。
在这里插入图片描述

代码:
 /**
   * 添加故宫geojson数据
   */
  AddGuGong() {
    var viewer = this.viewer;
    Cesium.GeoJsonDataSource.load("../static/geojson/故宫.geojson").then(
      function(data) {
        viewer.dataSources.add(data);
        const entities = data.entities.values;
        for (let i = 0; i < entities.length; i++) {
          let entity = entities[i];
          var height = entity.properties.height._value;
          entity.polygon.heightReference =
            Cesium.HeightReference.CLAMP_TO_GROUND;
          entity.polygon.outline = false;
          // 将高度拉伸至高度属性值
          entity.polygon.extrudedHeight = height != null ? height : 5;
        }
      }
    );
  },
1.2. KML/KMZ
定义:

KML (keyhole markup language)是以XML语言为基础开发的一种文件格式,用来描述和存储地理信息数据(点、线、面、图片等),是纯粹的xml文本格式, KMZ是Google Earth默认的输出文件格式,是一个经过ZIP格式压缩过的KML文件。

例子:

添加山东省边界kml数据。
在这里插入图片描述

代码:
 /**
   * 添加山东省边界kml数据
   */
  AddKml() {
    var viewer = this.viewer;
    viewer.dataSources
      .add(Cesium.KmlDataSource.load("../static/山东省边界.kml"))
      .then(function(dataSource) {});
  },
1.3. CZML (Cesium Language)
定义:CZML是Cesium的JSON格式,用于描述时间动态的图形场景。
例子:添加卫星轨迹czml数据。

在这里插入图片描述

代码:
 /**
   * 添加卫星轨迹czml数据
   */
   AddCzml() {
    var viewer = this.viewer;
    viewer.dataSources
      .add(Cesium.CzmlDataSource.load("../static/卫星轨迹.czml"))
      .then(function(dataSource) {});
  },

2. 影像服务:

2.1. WMS (Web Map Service)
定义:

Cesium可以直接加载和显示WMS服务提供的图层。

例子:

加载三国州郡地图WMS服务。
在这里插入图片描述

代码:
/**
   * 向当前视图添加geoserver发布的WMS服务(多个图层)
   */
  AddGeoserverService: function() {
    let viewer = this.viewer;
    let _this = this;
    const layerConfigs = [
      {
        layers: "sanmap:州界面"
      },
      {
        layers: "sanmap:河流湖泊面"
      },
      {
        layers: "sanmap:河流线"
      },
      {
        layers: "sanmap:郡治点"
      }
    ];
    layerConfigs.forEach(config => {
      const wmsImageryProvider = new Cesium.WebMapServiceImageryProvider({
        url: "http://******/geoserver/sanmap/wms",
        layers: config.layers,
        parameters: {
          transparent: true,
          format: "image/png",
          srs: "EPSG:4326"
        }
      });
      viewer.imageryLayers.addImageryProvider(wmsImageryProvider);
    });
  },
2.2. WMTS (Web Map Tile Service)
定义:

Cesium可以直接加载和显示WMTS服务提供的预渲染瓦片图层。

例子:

加载天地图WMTS地图服务。
在这里插入图片描述

代码:
/**
   * 加载天地图wmts服务
   */
  AddWmts(){
    let _this = this;
    let viewer = _this.viewer;
    //天地图token
    let token = window.tiandituToken;
    //加载在线天地图
    let obj=({
      url: "http://t0.tianditu.com/cia_w/wmts?tk=" + token,
      label: "天地图影像",
      loadType: "WebMapTileServiceImageryProvider",
      layer: "cia",
      style: "default",
      tileMatrixSetID: "w",
      format: "tiles",
      maximumLevel: 18
    });
    var wmtsImageryProvider = new Cesium.WebMapTileServiceImageryProvider(obj);
    viewer.imageryLayers.addImageryProvider(wmtsImageryProvider);
  },
2.3.TMS /XYZ(Tile Map Service)
定义:

用于加载地图瓦片,Cesium支持这种服务,尤其是加载卫星影像和其他地图底图。

例子:

加载一个OpenStreetMap的XYZ格式瓦片图层作为地球的底图。
在这里插入图片描述

代码:
   /**
   * 加载XYZ瓦片服务
   */
  AddXyz(){
    let _this=this
    let viewer=_this.viewer
    var osmProvider = new Cesium.UrlTemplateImageryProvider({
      url: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png'
  });
  viewer.imageryLayers.addImageryProvider(osmProvider);
  },
2.4.TMS、XYZ与WMTS的不同:
(1)TMS (Tile Map Service):

它是由OSGeo组织提出的开放标准。
定义了如何访问和组织地图瓦片。
在TMS中,瓦片的y坐标是从下至上递增的,这意味着当你向北移动时,y值会增加。

(2)XYZ:

这不是一个正式的标准或规范,但它已经成为了事实上的标准,被许多现代Web地图服务采用,如Google Maps、OpenStreetMap等。
与TMS相反,瓦片的y坐标是从上至下递增的。
在实际应用中,XYZ通常被认为是更直观和简单的,因为它更符合Web浏览器的坐标系统(其中y坐标从上至下递增)。

(3)WMTS (Web Map Tile Service):

它是由Open Geospatial Consortium (OGC) 提出的标准。
是一个比TMS更复杂、更完整的服务规范,它包括了不仅仅是如何访问瓦片,还有如何描述服务、如何列出可用的瓦片集等。
WMTS支持多种“瓦片矩阵集”,这些矩阵集中的一种就是TMS格式。因此,可以说TMS是WMTS的一个子集或一个选项。

(4)关系总结:

TMS 和 XYZ 主要的区别在于瓦片的y坐标如何增加:在TMS中从下至上,而在XYZ中从上至下。
WMTS 是一个比TMS更广泛、更完整的标准。WMTS支持多种瓦片编址方案,其中TMS是其中之一。XYZ格式并不是WMTS的正式部分,但由于它的普遍性,很多WMTS实现也支持XYZ格式作为非正式的扩展。
从实际应用的角度看,XYZ格式已经被广大Web开发者接受并广泛使用,尽管它并没有像TMS和WMTS那样的正式规范背书。

2.5.WMTS与WMS的关系:
数据提供方式:

WMS (Web Map Service): WMS按请求提供地图图像。当用户或客户端发送一个包含地理范围、图像大小等参数的请求时,WMS会生成一个对应的地图图像并返回。这意味着每次你浏览或缩放地图时,WMS都需要动态渲染一个新的图像。

WMTS: 与WMS不同,WMTS提供预渲染的地图瓦片。这些瓦片是按照特定的规模和范围提前渲染的,当用户请求时,只需要选择和提供相应的瓦片,而不需要每次都进行渲染。

性能:

由于WMTS使用预渲染的瓦片,其性能通常优于WMS,尤其是在高并发的情况下。预渲染的瓦片可以在CDN或缓存中存储,从而进一步提高数据的提取速度。
灵活性:
WMS由于是按需渲染的,因此可以提供更高的灵活性,如动态样式、过滤特定的数据等。然而,这种灵活性通常以性能为代价。
WMTS由于是预渲染的,灵活性较低,但是在需要快速提供地图内容的情境中,其性能表现优越。

应用场景:

WMS: 当你需要根据用户的需求动态生成地图内容,或者需要特定的样式和数据过滤时,WMS可能是更好的选择。

WMTS: 当你需要为大量用户快速提供地图内容,尤其是常用的地图层时,WMTS是更好的选择。

总的来说,WMTS是WMS的一个补充。在选择使用哪种服务时,应根据应用的需求、预期的用户量以及性能需求来进行决策。

3. 地形服务:

3.1.CesiumTerrainProvider
描述:

这是Cesium为了处理高精度的全球地形数据而创建的API。地形数据切片使用quantized-mesh v1.0格式,它允许高效的流式传输和渲染。

特点:

除了地形高度外,这种地形还支持实时的太阳光照效果和真实的水体渲染效果。

如何调用:

使用Cesium中的CesiumTerrainProvider API可以很容易地调用并加载这种地形数据。
在这里插入图片描述

代码:
 // 加载地形数据
   //viewer.terrainProvider = Cesium.createWorldTerrain();
    // viewer.terrainProvider = Cesium.createWorldTerrain({
    //   requestVertexNormals: true,
    //   requestWaterMask: true
    // });
    // 或
    const terrainProvider = new Cesium.CesiumTerrainProvider({
      url: Cesium.IonResource.fromAssetId(1), //这使用了Cesium Ion的默认全球地形
      requestWaterMask: true, //请求水体效果所需要的海岸线数据
      requestVertexNormals: true //请求地形照明数据
    });
    viewer.terrainProvider = terrainProvider;

    //地形夸张
    viewer.scene.globe.terrainExaggeration = 1.3;

4. 三维数据:

4.1. glTF (GL Transmission Format)/glb
定义:

是3D模型的一种格式,Cesium使用这种格式来优化3D模型的加载和渲染。

不同:

glTF: 这是 glTF 的标准格式,使用JSON格式表示3D内容,并且通常以 .gltf 为扩展名。与此相关的资源(如纹理和二进制网格数据)通常存储在与主 gltf 文件分开的文件中。
glb: 这是 glTF 的二进制格式,通常以 .glb 为扩展名。所有相关的资源(如纹理、着色器、网格等)都嵌入到单一的二进制文件中,使其更容易传输。

例子:

添加飞机glb模型(键盘控制移动)
在这里插入图片描述

代码:
/**
   * 添加glb模型(键盘控制移动)
   * @param {Number} x 经度
   * @param {Number} y 纬度
   * @param {Number} z 高度
   */
  AddCesiumglb(x, y, z) {
    var viewer = this.viewer;
    let url = "../static/Cesium_Air.glb";
    // 模型姿态变化
    let headingPitchRoll = new Cesium.HeadingPitchRoll();
    // 模型初始位置
    let position2 = new Cesium.Cartesian3.fromDegrees(x, y, z);
    // 局部变换坐标系
    let fixedFrameTransform = Cesium.Transforms.localFrameToFixedFrameGenerator(
      "north",
      "west"
    );
    // 每次操作姿态变化为5°
    let deltaRadians = Cesium.Math.toRadians(5.0);
    // 速度
    let speed = 10;
    // 速度向量
    let speedVector = new Cesium.Cartesian3();

    // 添加实体
    // 使用primitive方式加载模型
    const modelEntity = viewer.scene.primitives.add(
      Cesium.Model.fromGltf({
        url: url,
        scale: 20.0,
        modelMatrix: Cesium.Transforms.headingPitchRollToFixedFrame(
          position2,
          headingPitchRoll,
          Cesium.Ellipsoid.WGS84,
          fixedFrameTransform
        ),
        minimumPixelSize: 12,
        maximumScale: 200
      })
    );
    // 添加键盘监听事件
    document.addEventListener("keydown", function(e) {
      switch (e.keyCode) {
        // 抬头
        case 38:
          headingPitchRoll.pitch += deltaRadians;
          // 判断是否超过2π范围
          if (headingPitchRoll.pitch > Cesium.Math.TWO_PI) {
            headingPitchRoll.pitch -= Cesium.Math.TWO_PI;
          }
          console.log("抬头:pitch+");
          break;

        // 低头
        case 40:
          headingPitchRoll.pitch -= deltaRadians;
          if (headingPitchRoll.pitch < -Cesium.Math.TWO_PI) {
            headingPitchRoll.pitch += Cesium.Math.TWO_PI;
          }
          console.log("低头:pitch-");

          break;

        // 左转
        case 37:
          headingPitchRoll.heading -= deltaRadians;
          // 判断是否超过2π范围
          if (headingPitchRoll.heading < -Cesium.Math.TWO_PI) {
            headingPitchRoll.heading += Cesium.Math.TWO_PI;
          }
          console.log("左转:heading+");
          break;

        // 右转
        case 39:
          headingPitchRoll.heading += deltaRadians;
          // 判断是否超过2π范围
          if (headingPitchRoll.heading > Cesium.Math.TWO_PI) {
            headingPitchRoll.heading -= Cesium.Math.TWO_PI;
          }
          console.log("右转:heading-");
          break;

        // 顺时针
        case 96:
          headingPitchRoll.roll += deltaRadians;
          // 判断是否超过2π范围
          if (headingPitchRoll.roll > Cesium.Math.TWO_PI) {
            headingPitchRoll.roll -= Cesium.Math.TWO_PI;
          }
          console.log("顺时针翻滚:roll+");
          break;

        // 逆时针
        case 110:
          headingPitchRoll.roll -= deltaRadians;
          // 判断是否超过2π范围
          if (headingPitchRoll.roll < -Cesium.Math.TWO_PI) {
            headingPitchRoll.roll += Cesium.Math.TWO_PI;
          }
          console.log("逆时针翻滚:roll-");
          break;

        // 加速
        case 187:
          speed += 10;
          speed = Math.min(speed, 10000);
          console.log("加速:" + speed);
          break;
        // 减速
        case 189:
          speed -= 10;
          speed = Math.max(speed, 100);
          console.log("减速:" + speed);
          break;

        default:
          break;
      }
    });

    // 渲染更新前阶段添加监听
    viewer.scene.preUpdate.addEventListener(() => {
      if (window.fly) {
        speedVector = Cesium.Cartesian3.multiplyByScalar(
          Cesium.Cartesian3.UNIT_X,
          speed / 10,
          speedVector
        );
        position2 = Cesium.Matrix4.multiplyByPoint(
          modelEntity.modelMatrix,
          speedVector,
          position2
        );
        // 更新模型姿态与位置
        Cesium.Transforms.headingPitchRollToFixedFrame(
          position2,
          headingPitchRoll,
          Cesium.Ellipsoid.WGS84,
          fixedFrameTransform,
          modelEntity.modelMatrix
        );
        // 俯视跟随
        viewer.camera.lookAt(position2, new Cesium.Cartesian3(0, 0, 2000));
        // 第一视角跟随
        //viewer.camera.lookAt(position2, new Cesium.HeadingPitchRange(headingPitchRoll.heading, headingPitchRoll.pitch, 2000))
      }
    });
  },
4.2.3D Tiles
定义:

这是Cesium推出的一个规范,用于流式传输和加载大型3D数据集。

例子:

加载大雁塔3D建筑模型。
在这里插入图片描述

代码:
/**
   * 添加大雁塔模型
   */
  Add3DTileset(){
    let _this=this
    let viewer = _this.viewer;
  let tileSetModel = new Cesium.Cesium3DTileset({
    url: "./static/3DT/dayanta/tileset.json"
  });
  
  tileSetModel.readyPromise.then( tileset=> {
    console.log("加载完成")
    viewer.scene.primitives.add(tileset);
    viewer.zoomTo(tileset, new Cesium.HeadingPitchRange(0.5, -0.2, tileset.boundingSphere.radius * 1.0));
  }).catch(function (error) {
    console.log(error);
  });
  },

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于百度语音识别API智能语音识别和字幕推荐系统——深度学习算法应用(含全部工程源码)+测试数据集

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 翻译3. 格式转换4. 音频切割5. 语音识别6. 文本切割7. main函数 系统测试工程源代码下载其它资料下载 前言 本项目基于百度语音识别API&#xff0c;结合了语音识别、视频转换音频识别以及语句停顿…

从数据仓库到数据结构:数据架构的演变之路

在上个世纪&#xff0c;从电子商务巨头到医疗服务机构和政府部门&#xff0c;数据已成为每家组织的生命线。有效地收集和管理这些数据可以为组织提供宝贵的洞察力&#xff0c;以帮助决策&#xff0c;然而这是一项艰巨的任务。 尽管数据很重要&#xff0c;但CIOinsight声称&…

【C++】AVL树模拟实现插入功能

AVL树模拟实现插入 前言正式开始树节点树insert旋转左单旋右单旋左右双旋右左双旋 用旋转来平衡树测试 前言 本篇主要介绍AVL树的插入功能。其中就包含了最重要的旋转。 通过旋转来使得树平衡&#xff0c;是学习AVL树的一个重点&#xff0c;也是也是一个难点。 正式开始 先…

虹科方案 | 汽车总线协议转换解决方案

汽车总线&#xff1a; 汽车总线是一种用于在车辆电子系统中传输数据和控制信息的通信系统。它允许不同的电子控制单元&#xff08;ECU&#xff09;在车辆中相互通信&#xff0c;协调各个系统的操作&#xff0c;以实现功能的集成和协同工作。 在现代汽车中&#xff0c;综合通信…

提高办案效率:公检系统引入自动校对技术

引入自动校对技术到公检系统中可以有效提高办案效率。自动校对技术结合公检系统的特点&#xff0c;可以在以下方面提高办案效率&#xff1a; 1.节省时间&#xff1a;自动校对技术可以快速检测和修正法律文书中的语法、拼写和标点符号等错误。与手动校对相比&#xff0c;自动校对…

dfs+回溯做题笔记

题目链接&#xff1a;t矩阵中的路径_牛客题霸_牛客网 参考代码&#xff1a; import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param matrix char字符型二维数组 * param …

虹科方案 | 汽车总线协议转换解决方案(二)

上期说到&#xff0c;虹科的PCAN-LIN网关在CAN、LIN总线转换方面有显著的作用&#xff0c;尤其是为BMS电池通信的测试提供了优秀的解决方案。假如您感兴趣&#xff0c;可以点击文末相关链接进行回顾&#xff01; 而今天&#xff0c;虹科将继续给大家带来Router系列在各个领域的…

个推消息推送专项运营提升方案,基于AIGC实现推送文案智能生成

个推消息推送专项运营提升方案自今年3月份发布以来&#xff0c;已应用于游戏社交、影音资讯、电商购物等多个行业。现个推消息推送专项运营提升方案又实现了推送策略的智能化和推送流程的自动化&#xff0c;助力APP进一步提升消息推送的效率和效果。 丰富推送策略组合&#xf…

Tomcat10.1源码安装与部署

安装JDK 1、下载jdk17 [rootmysql80 ~]# wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz[rootmysql80 ~]# ll -h jdk-17_linux-x64_bin.tar.gz -rw-r--r--. 1 root root 174M Mar 18 03:53 jdk-17_linux-x64_bin.tar.gz2、安装目录[rootmysql8…

第三方电容笔怎么样?apple pencil的平替笔

在当今世界&#xff0c;高科技已经成为推动电子产品迅速发展的重要动力。无论是工作&#xff0c;还是学习&#xff0c;iPad平板都很方便。iPad平板电脑将会和我们的生活联系在一起&#xff0c;不管是现在还是未来。iPad配上一支简单的电容笔&#xff0c;不仅提高了工作效率&…

数据库管理-第九十七期 以一当十的数据库路线(20230810)

第九十七期 以一当十的数据库路线&#xff08;20230810&#xff09; 距离上一期已经过去了整整9天了&#xff0c;相较于前几个月的“生产队的驴”&#xff0c;确实慢了很多&#xff0c;归根结底有几点&#xff1a;一是19c OCM的相关内容暂时告一段落&#xff0c;少了一半内容&…

从NPM注册中心获取包

目录 1、搜索和选择要下载的包 1.1 为什么使用 1.2 工作原理 1、质量 2、维护 3、受欢迎程度 4、名气 1.1、开始搜索包 2、在本地安装下载和安装软件包 2.1 安装未限定作用域的包 2.2 安装有作用域的公共包 2.3 安装私有包 2.4 测试包安装 2.5 已安装的软件包版本…

LeetCode算法递归类—两两交换链表中的节点

目录 24. 两两交换链表中的节点 题解&#xff1a; 代码&#xff1a; 运行结果&#xff1a;​编辑 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节…

线程池工作原理深入解析

目录 1. 线程正常的生命周期 2. 为什么要用线程池&#xff1f; 3. 线程池的核心原理 4. 怎样创建线程池&#xff1f; 5.线程池的代码实现 6. ThreadPoolExecutor 源码分析 7. ThreadPoolExecutor 工作原理展示&#xff08;重点&#xff09; 1. 线程正常的生命周期 我们知…

Pyinstaller 打包 django 项目如何将命令行参数加入?

起因 Pyinstaller 打包 django 项目&#xff0c;打包成 manage.exe 后用命令行 cmd manage.exe runserver 0.0.0.0:8001 --noreload 来运行感觉很不方便。 希望能够直接把命令行参数也打包进去&#xff0c;直接运行 exe 。我走了些弯路&#xff0c;但最终实现了。 弯路 我看…

Linux —— 基础I/O

一&#xff0c;背景介绍 狭义的文件存放在磁盘上&#xff0c;广义上在Linux下一切皆文件&#xff1b;磁盘上的文件一般为永久存储的外设&#xff0c;本质上对文件的操作&#xff0c;即为对外设的输入和输出&#xff08;简称I/O&#xff09;&#xff1b;空文件并不是不占磁盘文件…

Xamarin.Android实现手写板的功能

目录 1、背景说明2、实现效果3、代码实现3.1 整体思路3.2 核心绘画类-PaintView.cs3.3 对话框类-WritePadDialog.cs3.4 前端实现类-MainActivity3.5 布局文件3.5.1 write_pad.xml3.5.2 activity_main布局文件 4、知识总结5、代码下载6、参考资料 1、背景说明 在实际使用过程中…

【动态规划刷题 6】 买卖股票的最佳时机含冷冻期 买卖股票的最佳时机含手续费

买卖股票的最佳时机含冷冻期 链接: 买卖股票的最佳时机含冷冻期 给定一个整数数组prices&#xff0c;其中第 prices[i] 表示第 i 天的股票价格 。​ 设计一个算法计算出最大利润。在满足以下约束条件下&#xff0c;你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票…

【赠书活动|第四期《互联网广告系统:架构、算法与智能化》】

文章目录 内容简介作者简介读者对象大咖推荐抽奖方式 广告平台的建设和完善是一项长期工程。例如&#xff0c;谷歌早于2003年通过收购Applied Semantics开展Google AdSense 项目&#xff0c;而直到20年后的今天&#xff0c;谷歌展示广告平台仍在持续创新和提升。广告平台是负有…

2024软考系统架构设计师论文写作要点

一、写作注意事项 系统架构设计师的论文题目对于考生来说&#xff0c;是相对较难的题目。一方面&#xff0c;考生需要掌握论文题目中的系统架构设计的专业知识;另一方面&#xff0c;论文的撰写需要结合考生自身的项目经历。因此&#xff0c;如何将自己的项目经历和专业知识有机…