Cesium 坐标系的转换,空间数据加载 粒子系统加载

news2024/10/10 12:19:52

在vue中引入Cesium.js

官网下载好的Cesium文件放入vue项目中

index.html中引入,在js文件即可智能提示,或者下载依赖包也可

<script src="./Cesium/Cesium.js"></script>
 <link rel="stylesheet" href="./Cesium/Widgets/widgets.css">

资源token获取

let token = '你注册后得到的token'
    Cesium.Ion.defaultAccessToken = token

00 Cesium中重要的四个类

  • Viewer查看器类 展示三维地球的视窗还包含一些基础控件new Cesium.Viewer('box',options)

  • Scene 场景类 非常重要是所有3d图形对象容器,可以对基础地理环境进行设置,场景交互鼠标事件 相机事件,也可以在图层上绘制几何体点 线 面

  • Entity 实体类 是primitive api封装而来 ,主要用于加载实体模型 几何图形对其进行样式设置 动效修改等

  • DataSourceCollection 数据源集合类,支持加载矢量数据集和外部文件的调用 CzmlDataSource KmlDataSource GeoJsonDataSource这三种方式

01初始化3D地图

 /* let viewer = new Cesium.Viewer('box', {
      baseLayerPicker: false,  // 影像切换,隐藏默认地球
      animation: false,  //是否显示动画控件
      timeline: false, //是否显示时间线控件
      infoBox: false, //是否显示点击要素之后显示的信息
      geocoder: false, //是否显示地名查找控件
      navigationHelpButton: false, //是否显示帮助信息控件
      terrainProvider: new Cesium.CesiumTerrainProvider({   // 加载地形信息
        url: 'https://www.supermapol.com/realspace/services/3D-stk_terrain/rest/realspace/datas/info/data/path',
        requestVertexNormals: true
      }),
    }) */

    // viewer.scene.globe.show = false // 隐藏地图
    // viewer.scene.camera.setView({ // 相机移动到这个位置
    //   destination:Cesium.Cartesian3.fromDegrees(116.39,39.9,1500) // 转换为笛卡尔空间直角坐标系
    // })

    /*

02 坐标系间的转换

  • wgs84经纬度坐标系(没有实际的类)

  • wgs84弧度坐标系(Cartographic)

  • 笛卡尔空间直角坐标系(Cartesian3)

  • 平面坐标系(Cartesian2)

  • 4d笛卡尔坐标系(Cartesian4) 这个不常用

这里的场景坐标包含了地形 倾斜 模型的坐标

这里是地球表面的wgs84坐标 包含地形 不包含模型,倾斜摄影表面

这里是参考椭球表面的wgs84坐标 不包含地形 模型,倾斜摄影表面

03加载Geojson数据

viewer.dataSources.add(
      Cesium.GeoJsonDataSource.load(
        "./river.json"
      )
    )
    viewer.scene.camera.setView({
      destination:Cesium.Cartesian3.fromDegrees(126.529,43.819,1500000)
    }) 

04相机操作

笛卡尔 x轴是视口上下,Y轴是视口左右,z轴是视口翻滚

  • setView 通过定义相机飞行的目的地坐标和视线方向将视角直接到目的地

  • flyto

  • lookAt 不会改变其位置.用于锁定某个场景视角

  • viewBoundingSphere 模型定点漫游多角度观测

// const position = Cesium.Cartesian3.fromDegrees(116.39, 39.9, 400)
   /*
    viewer.camera.setView({
      destination: position,// 目的地
      orientation: { // 视口方向
        heading: Cesium.Math.toRadians(0),//控制视口左右旋转,也就是沿Y轴旋转,0时为正北方向
        pitch: Cesium.Math.toRadians(-90), // 控制视口上下旋转,也就是沿X轴旋转,-90时为俯视地面
        roll: 0 // 控制视口翻转角度,也就是沿Z轴旋转,0时为不翻转
      }
    }) */
    /* viewer.camera.flyTo({
      destination: position,// 目的地
      orientation: { // 视口方向
        heading: Cesium.Math.toRadians(0),//控制视口左右旋转,也就是沿Y轴旋转,0时为正北方向
        pitch: Cesium.Math.toRadians(-90), // 控制视口上下旋转,也就是沿X轴旋转,-90时为俯视地面
        roll: 0 // 控制视口翻转角度,也就是沿Z轴旋转,0时为不翻转
      },
      duration:5 // 5s 飞行过程
    }) */
    /*
    // lookAt案例
    const center = Cesium.Cartesian3.fromDegrees(116.39, 39.91)
    const heading = Cesium.Math.toRadians(50)
    const pitch = Cesium.Math.toRadians(-90)
    const range = 2500
    viewer.camera.lookAt(center, new Cesium.HeadingPitchRange(heading, pitch, range)) */

    /*
    // viewBoundingSphere案例  加载一个模型飞机
    const orientation = Cesium.Transforms.headingPitchRollQuaternion(position, new Cesium.HeadingPitchRange(-90, 0, 0)) //模型的朝向
    var entity = viewer.entities.add({
      position: position,
      orientation, //飞机的朝向和翻滚状态
      model: { // 模型的信息
        uri: '',
        minimumPixelSize: 100,
        maximumScale: 10000,
        show: true
      }
    })
    // new Cesium.BoundingSphere(position,20) 位置,视口与物体的距离
    viewer.camera.viewBoundingSphere(new Cesium.BoundingSphere(position, 20), new Cesium.HeadingPitchRange(0, 0, 0))
     */

05加载地图(图层),地形(山脉)

 */
   /*  var esri = new Cesium.ArcGisMapServerImageryProvider({ //acrgis服务地图
      url: "https://server.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer"
    })
    let viewer = new Cesium.Viewer('box', {
      baseLayerPicker: false,  // 影像切换,隐藏默认地球,否则会影响新地图加载
      imageryProvider: esri,
      terrainProvider: new Cesium.CesiumTerrainProvider({ // 加载地形
      url: Cesium.IonResource.fromAssetId(1),
      requestVertexNormals:true, // 光照效果
      requestWaterMask: true //水面流动效果
      })
    }) */
    /* const layer = viewer.imageryLayers.addImageryProvider( // 加载资源仓库地图
      new Cesium.IonImageryProvider({ assetId: 3812 })
    ); */

06加载建筑物三维模型(也先需加载地形和地图)

/* const tileset = viewer.scene.primitives.add(
      new Cesium.Cesium3DTileset({
        url: Cesium.IonResource.fromAssetId(96188),
      })
    );
    // 相机信息
    viewer.camera.setView({
      destination: Cesium.Cartesian3.fromDegrees(121.49, 31.23, 3000), // 陆家嘴的位置
      orientation: {
        heading: 0,
        pitch: -90,
        roll: 0
      }
    })
    // 改变建筑物的颜色
    tileset.style = new Cesium.Cesium3DTileStyle({
      color: "color('blue',0.5)",
      show: true
    }) */

    // 加载资源仓库中的    New York City 3D Buildings 有高度 也可以选择建筑物的属性
    /* const tileset = viewer.scene.primitives.add(
      new Cesium.Cesium3DTileset({
        url: Cesium.IonResource.fromAssetId(75343),
      })
    );

    tileset.style = new Cesium.Cesium3DTileStyle({
      color: {
      conditions: [
        ["${Height} >=200", "color('#004FFF', 0.5)"],
        ["${Height} >=100", "color('#33BB66', 0.5)"],
        ["${Height} >=50", "color('#0099AA', 0.5)"],
        ["${Height} >=25", "color('#004FFF', 0.5)"],
        ["${Height} >=10", "color('#FF8833', 0.5)"],
        ["${Height} >=5", "color('#FFAA22', 0.5)"],
        ["true", "color('#FFFF00', 0.5)"],
        ],
      },
      show: '${Height} >=0 '
    })
    viewer.camera.setView({
      destination: Cesium.Cartesian3.fromDegrees(-73.87, 40.83, 3000), // 陆家嘴的位置
      orientation: {
        heading: 0,
        pitch: -90,
        roll: 0
      }
    }) */

07空间数据加载

cesium中主要是珊格数据(地形和地图数据)和矢量数据(含几何体的加载,模型,标签等)

空间数据管理: 修改某个几何图形的样式,或移除等 entities.add entities.remove

/* let viewer = new Cesium.Viewer('box')
    let position = Cesium.Cartesian3.fromDegrees(116.39, 39.91,0)
    viewer.camera.setView({
      destination: position,
    }) */
    // 画点
    /*
    const entity = viewer.entities.add({
      position,
      point: {
        pixelSize:100,
        color: new Cesium.Color(0,1,0,1)
      }
    }) */
    // 画线
    /* const entity = viewer.entities.add({
      polyline: {
        show: true,
        positions: new Cesium.Cartesian3.fromDegreesArray([116.39, 39.91, 116.40, 39.91]),
        width: 5,
        material:new Cesium.Color(0,1,0,1) // 材质
      }
    })
    viewer.camera.setView({
      destination: position,
    }) */
    // 画面
  /*   const entity = viewer.entities.add({
      position,
      plane: {
        plane: new Cesium.Plane(Cesium.Cartesian3.UNIT_Z, 0.0), // 沿着z轴平铺
        dimensions: new Cesium.Cartesian2(400,300), // 大小
        material:   Cesium.Color.RED.withAlpha(0.5), // 材质
        outline:true, // 轮廓线
        outlineColor: Cesium.Color.BLACK

      }
    }) */
    // label 标签
    /* const entity = viewer.entities.add({
      position,
      label: {
        text:'12312',
        font: "50px Helvetica",
        fillColor: Cesium.Color.BLUE
      }
    }) */
    // 绘制多边形
    /* const redPolygon = viewer.entities.add({
      id: 'redid',
      polygon: {
        hierarchy:Cesium.Cartesian3.fromDegreesArray([116.39, 39.91, 116.39, 39.915,116.395, 39.91]),
        material: Cesium.Color.RED
      }
    })
    const yellowPolygon = viewer.entities.add({
      polygon: {
        hierarchy:Cesium.Cartesian3.fromDegreesArray([116.37, 39.90, 116.37, 39.91,116.375, 39.92]), //坐标有问题
        material: Cesium.Color.YELLOW,
        extrudedHeight:200 //垂直方向拉伸,绘制的是多边形可以使用如果是平面则不可使用
      }
    })
    viewer.entities.remove(redPolygon)
    viewer.entities.getById('redid').polygon.material = Cesium.Color.YELLOW //修改某个几何体样式
 */

08 鼠标交互,数据查询

  • scene.pick 返回窗口位置基元对象

  • viewer.scene.drillPick 返回窗口位置所有对象的列表

  • viewer.scene.globe.pick 给定光线和地形的交点

  • Cesium.ScreenSpaceEventType.MIDDLE_CLICK鼠标中键点击 Cesium.ScreenSpaceEventType.MOUSE_MOVE鼠标移入 Cesium.ScreenSpaceEventType.RIGHT_CLICK鼠标右键

/* const redPolygon = viewer.entities.add({
    id: 'redid',
      polygon: {
        hierarchy: Cesium.Cartesian3.fromDegreesArray([116.39, 39.91, 116.39, 39.915, 116.395, 39.91]),
        material: '/bing_maps_credit.png',
        extrudedHeight: 200
      },
      description: `<div>description......</div>` //弹窗显示
    })
    var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas) // 获取所有创建的模型
    handler.setInputAction(function (event) {
      var pick = viewer.scene.pick(event.position)
      alert('点击了')
      // if (Cesium.defined(pick) && (pick.id.id = 'redid')) {
      //   alert('点击了')
      // }
    }, Cesium.ScreenSpaceEventType.LEFT_CLICK) // 鼠标点击事件 */

09 加载3DTiles

3DTiles文件格式为.json 三维模型瓦片数据结构(分层 分块)格式有:b3dm格式的瓦片集(用于加载批量模型),pnts格式加载点云数据模型,cmpt格式允许内嵌多个其他类型的瓦片

 //加载倾斜摄影
/* let viewer = new Cesium.Viewer('box')
  var tileset = new Cesium.Cesium3DTileset({
    //相对路径,我这里是放的根目录
    url: './data1/tileset.json',
    maximumScreenSpaceError:2 // 最大的屏幕空间误差 数值越低效果越好
  });
  //添加到球体上
  viewer.scene.primitives.add(tileset);
  //定位过去
  viewer.zoomTo(tileset); */

  /*

10 加载3D .gltf 模型

模型定点漫游

 let viewer = new Cesium.Viewer('box')
    var scene = viewer.scene

    var hpr = new Cesium.HeadingPitchRoll(
      Cesium.Math.toRadians(45), // 设置这个属性即可(顺时针旋转的角度值)
      Cesium.Math.toRadians(0),
      Cesium.Math.toRadians(0)
    );  // 设置方向角
    var origin = Cesium.Cartesian3.fromDegrees(117.70901, 38.781056, 0);   // 设置位置
    var modelMatrix = Cesium.Transforms.headingPitchRollToFixedFrame(
      Cesium.Cartesian3.fromDegrees(117.70901, 38.781056, 1000),
      hpr
    );
    var model = scene.primitives.add(new Cesium.Model.fromGltf({
      url: './xyj.gltf', //gltf文件的URL
      modelMatrix: modelMatrix,
      color: new Cesium.Color(0, 0.9, 0.8, 0.5),  // 设置模型的颜色以及透明度
      scale: 1000.0     //放大倍数
    }))
    viewer.camera.viewBoundingSphere(new Cesium.BoundingSphere(origin, 20), new Cesium.HeadingPitchRange(0, 0, 0))

11 添加粒子系统 添加.glb 3D模型

let viewer = new Cesium.Viewer('box',{
    shouldAnimate: true, //这个属性加上 粒子系统才能显示出来

  })
  const position = Cesium.Cartesian3.fromDegrees(116.39,39.91,0)
  var entity = viewer.entities.add({
    position,
    orientation: Cesium.Transforms.headingPitchRollQuaternion(position, new Cesium.HeadingPitchRoll(-90, 0, 0)),
    model: {
      uri: './Cesium_Air.glb',
      minimumPixelSize:100,
      maximumScale: 10000,
      show:true
    }
  })
  viewer.camera.viewBoundingSphere(new Cesium.BoundingSphere(position, 200), new Cesium.HeadingPitchRange(0, 0, 10))
  viewer.scene.primitives.add(new Cesium.ParticleSystem({
    image: './fire.png',
    imageSize: new Cesium.Cartesian2(20,20),
    startScale: 1.0, // 初始大小
    endScale: 4.0,
    particleLife:1.0, // 粒子存在时间 数值越大火焰越高
    speed: 5.0, // 粒子发射速度
    emitter: new Cesium.CircleEmitter(0.5), // 发射器
    emissionRate: 5.0, // 每s粒子发射的数量
    modelMatrix: entity.computeModelMatrix(viewer.clock.startTime,new Cesium.Matrix4()), // 位置绑定
    lifetime: 16.0 // 默认永久运行
  }))

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

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

相关文章

若依配置教程(六)Excel导入功能实现

若依官网导入实现流程 文章目录一、前端index.vue中1.在所需模块的index.vue中的< script >< /script >中增加如下代码&#xff1a;2.在< template >< /template >中添加导入按钮事件&#xff1a;3.添加导入前端代码&#xff1a;二、在模块文件夹(ruoy…

数学建模学习笔记(17)灰色预测模型和神经网络

文章目录灰色预测模型相关基本概念GM(1,1)模型的使用步骤GM(1,1)模型的拓展模型GM(1,1)模型的注意事项BP神经网络预测模型的注意事项灰色预测模型 相关基本概念 系统的分类&#xff1a; 白色系统&#xff1a;系统的信息是完全明确的。灰色系统&#xff1a;系统的部分信息已知…

readelf指令使用

一、指令说明readelf命令&#xff0c;一般用于查看ELF格式的文件信息&#xff0c;常见的文件如在Linux上的可执行文件&#xff0c;动态库(*.so)或者静态库(*.a) 等包含ELF格式的文件。以下命令的使用是基于android编译出来的so文件上面去运行。readelf常用命令语法&#xff1a;…

视网膜电图特征可以检测成人的抑郁状态和治疗反应:一种机器学习方法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 视网膜电图特征可以检测成人的抑郁状态和治疗反应&#xff1a;一种机器学习方法摘要1. 引言2. 方法和材料2.1 人口与伦理声明2.2 入选标准、临床和生物学评估2.3 实验方案2.4…

浅析代理IP与VPS

在跨境行业的热浪期&#xff0c;出海早已成为了企业发展的新趋势。像跨境电商&#xff0c;新媒体&#xff0c;旅游等行业都在开拓海外市场&#xff0c;越来越多的企业产生了匿名浏览互联网&#xff0c;隐藏真实IP的需求。能满足用户这一需求的方法有很多种&#xff0c;代理IP与…

H264/AVC 句法和语义--重要的字段、带截图

一 SPS、PPS句法和语义 宽高在SPS里。 profile_idc&#xff1a;baseline、main、high。 level_idc&#xff1a;值越大&#xff0c;最大宏块处理速率等值越大。 m_ptParam.i_level_idc 21; //X264编码参数 chroma_format_idc&#xff1a;1表示采样格式为4:2:0。 frame_mbs_onl…

C++ 树进阶系列之平衡二叉查找树( AVL)的自平衡算法

1. 前言 树的深度与性能的关系。 在二叉排序树上进行查找时&#xff0c;其时间复杂度理论上接近二分算法的时间复杂度O(logn)。 但是&#xff0c;这里有一个问题&#xff0c;如果数列中的数字顺序不一样时&#xff0c;构建出来的二叉排序树的深度会有差异性&#xff0c;对最…

【Unity VR开发】结合VRTK4.0:抛物线

模块化开发&#xff08;抛物线&#xff09;&#xff1a; 当我们用久了一个固定的东西之后就不想去追求新的东西&#xff0c;其实这是一种懒惰&#xff0c;每个人都应该明白&#xff0c;每一天&#xff0c;这个时间都在发生着变化&#xff0c;不管是人、事、物&#xff0c;而我…

[Android开发练习3] 四季图的切换

前言 本题主要涉及到使用帧式布局&#xff0c;以及如何为组件设置点击的事件响应&#xff0c;包括获取事件源&#xff0c;设置事件监听器&#xff0c;在Activity文件中书写一般的业务逻辑代码。 文章目录 布局代码 text3_season.xml&#xff08;layout&#xff09; style.xm…

私有云OpenStack学习笔记1

私有云&#xff1a;自己组建私有云系统。 私有云系统有哪些呢&#xff1f; OpenStack、CloudStack、Eucalyptus、vCloud Director四大主流云平台。 云计算有极大的潜力提高效率&#xff0c;显著地节约成本&#xff0c;实现可升级的基础设施和高性能以及安全的数据存储。 Ope…

秋招备战——Java基础知识

垃圾回收&#xff0c;JVM常用参数 将内存中不再被使用的对象进行回收&#xff0c;GC中用于回收的方法称为收集器&#xff0c;由于GC需要消耗一些资源和时间&#xff0c;Java在对对象的生命周期特征进行分析后&#xff0c;按照新生代、老年代的方式来对对象进行收集&#xff0c…

2023情人节送另一半什么好?四款适合送女友的数码好物分享

2023年情人节快到了&#xff0c;一个关于浪漫、惊喜并且充满爱意的节日&#xff0c;不少人都在烦恼送另一半什么好。而数码产品在日常生活中也是必不可少的存在&#xff0c;在此&#xff0c;我给大家整理了四款适合送女友的数码好物&#xff0c;一起来看看吧。 一、蓝牙耳机&a…

操作系统权限提升(四)之系统错误配置-Tusted Service Paths提权

系列文章 操作系统权限提升(一)之操作系统权限介绍 操作系统权限提升(二)之常见提权的环境介绍 操作系统权限提升(三)之Windows系统内核溢出漏洞提权 注&#xff1a;阅读本编文章前&#xff0c;请先阅读系列文章&#xff0c;以免造成看不懂的情况&#xff01;&#xff01;&am…

这18张 Python 数据科学速查表,让你的代码能力飞起来

数据科学是利用科学方法、流程、算法和系统从数据中提取价值的跨学科领域。数据科学家综合利用一系列技能&#xff08;包括统计学、计算机科学和业务知识&#xff09;来分析从网络、智能手机、客户、传感器和其他来源收集的数据。 目前在主流的数据科学领域一般有三大生态&…

深入详解 二次移动平均法python

什么是 二次移动平均法 二次移动平均法&#xff0c;也称为指数加权移动平均法&#xff0c;是一种用于平滑时间序列数据的算法。 文章目录二次移动平均法逻辑Python代码实现第二种实现二次移动平均法的方式第三种卷积实现二次移动平均法二次移动平均法的应用场景二次移动平均法逻…

Linux监控之prometheus学习

目录 需要学习以及掌握的知识 第一步&#xff1a;安装准备 1、安装nginx 2、安装prometheus 2_1、解压&#xff1a;prometheus-2.0.0.linux-amd64.tar.gz 2_2、移动到安装目录 2_3、将Prometheus配置为系统服务 2_4、重新加载系统文件&#xff0c;使prometheus.service文…

Linux字符设备、块设备的区别

一、字符设备 字符设备就是在对某设备进行操作时&#xff0c;该设备的读取以字节为单位进行。字符设备的操作是通过linux系统直接调用驱动程序完成的&#xff0c;在驱动程序的上一层并没用文件系统。因此字符设备的特点如下&#xff1a; 1、以字节流的方式进行读写、一个字节一…

亚马逊上线优惠券推荐功能,如何选品成为重中之重?

随着全球数字经济的进一步发展以及中国数字化基础设施的完善&#xff0c;众多中国品牌选择出海掘金道路。虽然全球经济格局的不确定因素在增多&#xff0c;但是总体上各国消费潜力在逐步释放&#xff0c;我国外贸行业也在不断迭代优化&#xff0c;尤其是出口跨境电商行业&#…

Python 基础语法介绍(二)

文章目录一、概述二、函数1&#xff09;函数定义2&#xff09;函数调用3&#xff09;函数传参1、形式参数和实际参数2、关键字参数3、参数默认值4、可变参数4&#xff09;函数返回值1、语法结构2、多值返回5&#xff09;变量作用域1、局部变量2、全局变量【1】在主程序中定义全…

金融风控12

社交网络分析与金融反欺诈 设备指纹 一般是基于某些设备信息&#xff0c;通过一些设备指纹算法将这些信息组合&#xff0c;通过特定hsah算法得到一个ID值&#xff0c;作为该设备唯一标识符 常见元素有&#xff1a; - sim卡信息 - wifi信息 - 硬盘信息 - 内存信息 - 屏幕…