《面向三维GIS的Cesium开发与应用》读书笔记

简介: 《面向三维GIS的Cesium开发与应用》读书笔记

内容来源于李军、赵学胜、李晶编著的《面向三维GIS的Cesium开发与应用》,以下为读书笔记,仅供学习

可以参考读书笔记的内容进行入门和了解cesium,更详细的学习内容请看官网:https://cesium.com/learn/cesiumjs-learn/

书中有些代码应该是旧版本的,有些错误,我根据官网地址进行了纠正。

1.开源GIS三维可视化平台

  • Cesium
  • Three.js
  • MapBox
  • Echarts
  • DECK GL
  • MapTalks
  • World Wind
  • OpenSceneGraph

2.开发实践

(1)安装 cesium

  • npm

    npm install cesium
    
  • CDN

    <script src="https://cesium.com/downloads/cesiumjs/releases/1.105/Build/Cesium/Cesium.js"></script>
    <link
    href="https://cesium.com/downloads/cesiumjs/releases/1.105/Build/Cesium/Widgets/widgets.css"
    rel="stylesheet"
    />
    

(2)简单示例

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <script src="./node_modules/cesium/Build/Cesium/Cesium.js"></script>
  <link href="./node_modules/cesium/Build/Cesium/Widgets/widgets.css" rel="stylesheet">
</head>
<body>
  <div id="cesiumContainer"></div>
  <script>
  const viewer = new Cesium.Viewer('cesiumContainer');
    viewer.camera.setView({
    
    
    //广州大学城上方
      destination : Cesium.Cartesian3.fromDegrees(113.392987,23.051086, 10000),
      orientation: {
    
    
    heading: Cesium.Math.toRadians(0),
    pitch: Cesium.Math.toRadians(-90),
    roll: 0.0
  }
    });
  </script>
 </div>
</body>
</html>

image.png
滚动鼠标滚轮放缩,就可以看到一个完整的地球

image.png

注意:Cesium默认使用的是Bing地图,

(3)Viewer 地图展示窗口

new Cesium.Viewer('cesiumContainer', options);

options 设置空间和基础图层属性
对应官方 API 地址:https://cesium.com/learn/cesiumjs/ref-doc/Viewer.html

3.Cesium 坐标系统

  1. 屏幕坐标系,二维笛卡尔坐标系(Cartesian2)
  2. 笛卡尔空间指教坐标系(Cartesian3)
  3. WGS-84 地理坐标:x 经度 lng 向东为正,向西为负,y 纬度 lat 向北为正,向南为负,z 高度 height,弧度坐标值

Cesium 坐标转换

  1. 角度与弧度转换

Cesium.Math 官方 API 地址:https://cesium.com/learn/cesiumjs/ref-doc/Math.html

var radians = Cesium.Math.toRadians(degrees);
var degrees = Cesium.Math.toDegrees(radians);
  1. 经纬度坐标转笛卡尔空间指教坐标系

Cartesian3 官方 API 地址:https://cesium.com/learn/cesiumjs/ref-doc/Cartesian3.html

var c3 = Cesium.Cartesian3.fromDegrees(lng, lat, height);
var coordinates = [lng, lat, lng, lat];
var c3 = Cesium.Cartesian3.fromDegreesArray(coordinates);
var coordinates = [lng, lat, h, lng, lat, h];
var c3 = Cesium.Cartesian3.fromDegreesArrayHeights(coordinates);
  • 通过椭球体转换
    Ellipsoid官方 API 地址: https://cesium.com/learn/cesiumjs/ref-doc/Ellipsoid.html

Cartographic官方 API 地址:https://cesium.com/learn/cesiumjs/ref-doc/Cartographic.html

var ellipsoid84 = Cesium.Ellipsoid.WGS84;
var position = Cesium.Cartographic.fromDegrees(lng, lat, height);
var c3 = ellipsoid84.cartographicToCartesian(position);
var c3s = ellipsoid84.cartographicArrayToCartesianArray([pos1, pos2, pos3]);
  1. 笛卡尔空间坐标转经纬度坐标
var cartographoc = Cesium.Cartographic.fromCartesian(cartesian3);
//椭球体转换
var cartographoc = Cesium.Ellipsoid.WGS84.cartesianToCartographic(cartesian3);

var cartographocs = Cesium.Ellipsoid.WGS84.cartographicArrayToCartesianArray([c1, c2, c3]);
  1. 屏幕坐标转笛卡尔空间坐标
//屏幕坐标转场景空间指教坐标,包含地形,倾斜摄影测量模型等三维模型的坐标
var cartesian3 = viewer.scene.pickPosition(cartesian2);
//屏幕坐标转地表笛卡尔空间坐标,包含地形,不包含倾斜摄影测量等三维模型的坐标
var cartesian3 = viewer.scene.globe.pick(viewer.camera.getPickRay(cartesian2), viewer.scene);
//屏幕坐标转椭球面笛卡尔空间坐标,不包含地形、倾斜摄影测量等三维模型的坐标
var cartesian3 = viewer.camera.pickEllipsoid(center, viewer.scene.globe.ellipsoid)

5.笛卡尔空间坐标转屏幕坐标

var c2 = Cesium.SceneTransforms.wgs84ToWindowCoordinates(cartesian3);

4. Cesium 相机系统

Camera官方API地址:https://cesium.com/learn/cesiumjs/ref-doc/Camera.html

(1)鼠标和触摸事件与摄像头交互

  • 左点击并拖动:移动整个地图
  • 右点击并拖动:放缩相机
  • 滚轮:放缩相机
  • 点击滚轮并拖动:围绕地球表面的点旋转相机

(2)相机的方位和位置

1.右手笛卡尔坐标系

  • yaw:围绕 y 轴旋转,偏航角,水平旋转
  • pitch:围绕 x 轴旋转,俯仰角,上下旋转
  • roll:围绕 z 轴旋转,翻滚角,左右旋转

2.Cesium 相机

与右手笛卡尔坐标系相同,用 heading 替换 yaw

  • heading:偏航角,默认 0
  • pitch:俯仰角,默认-90
  • roll:翻滚角,默认 0

另一种是DirectionUp,两个都是Cartesian3类型

  • direction
  • up

3.设置视角
```js
var position = Cesium.Cartesian3.fromDegrees(lng, lat, height);
viewer.camera.setView({
destination: position,//飞行目标点
orientation: {
heading: Cesium.Math.toRadians(0),
pitch: Cesium.Math.toRadians(-90),
roll: 0.0
}
});

> 4.切换视角
```js
viewer.camera.flyTo({
  destination: position,//飞行目标点
  orientation: {
    heading: Cesium.Math.toRadians(0),
    pitch: Cesium.Math.toRadians(-90),
    roll: 0.0
  },
  duration:5//持续时间
});

5.看向某个点

 lookAt(target,offset)//两个参数都是Cartesian3
  • target:目标位置
  • offset:在以目标为中心的局部东-北向上参考系中距目标的偏移。
    (1)使用笛卡尔坐标偏移
    ```js

const center = Cesium.Cartesian3.fromDegrees(-98.0, 40.0);
viewer.camera.lookAt(center, new Cesium.Cartesian3(0.0, -4790000.0, 3930000.0));

(2)使用偏航角俯仰角范围偏移
```js
const center = Cesium.Cartesian3.fromDegrees(-72.0, 40.0);
const heading = Cesium.Math.toRadians(50.0);
const pitch = Cesium.Math.toRadians(-20.0);
const range = 5000.0;
viewer.camera.lookAt(center, new Cesium.HeadingPitchRange(heading, pitch, range));

相关资料

相关文章
|
10月前
|
敏捷开发 存储 SQL
数据密集型应用系统设计(读书笔记)第一天
数据密集型应用系统设计(读书笔记)第一天
66 0
|
11月前
|
存储 SQL 缓存
读书笔记《数据密集型应用系统设计》- 数据存储与检索
《数据密集型应用系统设计》是一本很好的介绍数据密集类系统设计原理的纲要性书籍,笔者再次阅读下,记录一些读书笔记,也写一些自己的思考穿插其中,以做备忘。
113 0
|
存储 分布式计算 安全
【读书笔记】大数据原理与应用:分布式文件系统HDFS
【读书笔记】大数据原理与应用:分布式文件系统HDFS
126 0
【读书笔记】大数据原理与应用:分布式文件系统HDFS
|
存储 运维 监控
读书笔记之数据密集型应用的可维护性
前面两篇文章分别介绍了可靠性和可扩展性,本篇文章将介绍了第三个特性:可维护性。
|
Java 数据库 算法
《Akka应用模式:分布式应用程序设计实践指南》读书笔记9
性能   这也是一个比较大的问题,因为性能不一定是Akka本身的问题,还可能是你代码写的有问题。   优化的第一步就是找出性能的瓶颈,隔离出应用程序里面比较耗时的部分,然后尝试对其优化,减少需要耗费的时间成本。
1637 0
|
缓存 运维 数据库
《Akka应用模式:分布式应用程序设计实践指南》读书笔记8
可用性   简单点来说就是系统能否正常使用。如果系统能够及时响应一个请求,则认为是可用的;如果响应时间过长或者根本不响应,则是不可用的。系统在停机或超载时是不可用的。一般用系统正常运行时长的百分比来计量系统的可用性,例如常常用N个9表示系统的可用性。
1884 0
|
存储 缓存 NoSQL
《Akka应用模式:分布式应用程序设计实践指南》读书笔记6
一致性和可扩展性   一致性是系统内比较复杂的属性,它会随着系统的变化而变化。简单来说,一致性就是数据保持一致,在分布式系统中,可以理解为多个节点中数据的值是一致的。一旦系统具有并行性(分布式只是并行的一种表现),保持一致性就变得困难了,毕竟需要协调全局状态。
1368 0
|
运维 Java
《Akka应用模式:分布式应用程序设计实践指南》读书笔记7
容错   容错绝对是分布式系统最难搞定的事儿,至少我这样认为,因为意外总是会发生。   处理故障在许多方面意味着要放弃全局一致性。Akka是基于不粗要调用方负责处理故障的想法而建立的。它主张由发生故障的actor负责处理问题,在actor不能处理的情况下,会向其“监督者”寻求帮助。
1708 0
|
设计模式 Java API
《Akka应用模式:分布式应用程序设计实践指南》读书笔记2
Akka简介   Akka是什么:“Akka是在JVM上构建高并发、分布式、弹性消息驱动应用的开源工具包”。弹性意味着要积极响应失败情况,从失败中恢复的能力。   其实Akka的定义很符合响应式领域模型,这个模型有几个基本特征:   1、弹性。
2174 0
|
Web App开发
嵌入式实时操作系统uc/os-ii 原理及应用 读书笔记
对任务就绪表的操作理解: 将优先级别为prio的任务置为就绪状态,可使用如下代码 OSRdyGrp |= OSMapTbl[prio >>3];//将prio任务所在的组状态置为1,表示该组有任务就绪。
839 0