Cesium坐标系

Cesium中常用的坐标有两种WGS84地理坐标系和笛卡尔空间坐标系,我们平时常用的以经纬度来指明一个地点就是用的WGS84坐标,笛卡尔空间坐标系常用来做一些空间位置变换如平移旋转缩放等等。其中,WGS84地理坐标系包括WGS84经纬度坐标系(没有实际的对象)和WGS84弧度坐标系(Cartographic);笛卡尔空间坐标系包括笛卡尔空间直角坐标系(Cartesian3)、平面坐标系(Cartesian2),4D笛卡尔坐标系(Cartesian4)。

WGS84坐标系(Cartographic)

World Geodetic System 1984,是为GPS全球定位 系统使用而建立的坐标系统,坐标原点为地球质心,其地心空间直角坐标系的Z轴指向BIH (国际时间服务机构) 1984.0定义的协议地球极(CTP)方向,X轴指向BIH 1984.0的零子午面和CTP赤道的交点,Y轴与Z轴、X轴垂直构成右手坐标系。我们平常手机上的指南针显示的经纬度就是这个坐标系下当前的坐标,进度范围[-180, 180]纬度范围[-90, 90]。

Cesium目前支持两种坐标系WGS84和WebMercator,但是在Cesium中没有 实际的对象来描述WGS84坐标,都是以弧度的方式来进行运用的也就是Cartographic类: new Cesium.Cartographic(longitude, latitude, height),这里的参数也叫longitude、latitude, 就是经度和纬度,计算方法:弧度= π/180x经纬度角度。

笛卡尔空间坐标系(Cartesian3)

直角坐标系也可以推广至三维空间与高维空间 (higher dimension)。在原本的二维直角坐标系,再添加一个垂直于x-轴,y-轴的坐标轴,称为z-轴。假若,这三个坐标轴满足右手定则,则可得到三维的直角坐标系。这z-轴与x-轴,y-轴相互正交于原点。在三维空间的任何一点P,可以用直角坐标(x,y,z)来表达其位置

平面坐标系(Cartesian2) 


平面坐标系也就是平面直角坐标系,是一一个二维笛卡尔坐标系,与Cartesian3相比少 了-一个z的分量, new Cesium.Cartesian2(x, y)。Cartesian2经常用来描述屏幕坐标系,如鼠标在电脑屏幕上的点击位置,返回的就是Cartesian2, 返回了鼠标点击位置的xy像素点分量。

 4D笛卡尔坐标系(Cartesian4)

在《web GL编程指南》中有描述:

(按照矩阵运算规则:依次用各行*各列)新的X=1*x+Tx*1;新的Y=y+Ty;新的Z=z+Tz; 最后的的一行任然为1不改变。 加入没有红框中的那一行的话运算就不成立

所以可以理解为Cartesian4就是三维坐标上增加一行,使用的时候看作Cartesian3即可,在实际场景运用中基本无。

坐标转换

1. 经纬度和弧度的转换:

var radians=Cesium.Math.toRadians(degrees);//经纬度转弧度var degrees=Cesium.Math.toDegrees(radians);//弧度转经纬度

2. WGS84经纬度坐标和WGS84弧度坐标系(Cartographic)的转换:

//方法一:
var longitude = Cesium.Math.toRadians(longitude1);
//其中longitude1为可选经度,以弧度为单位
var latitude= Cesium.Math.toRadians(latitude1)
//其中latitude1为可选纬度,以弧度为单位
var cartographic = new Cesium.Cartographic(longitude,latitude,height)
//方法二:
var cartographic= Cesium.Cartographic.fromDegrees(longitude,latitude,height);
//其中,longitude和latitude为可选经、纬度,以弧度为单位
//方法三:
var cartographic= Cesium.Cartographic.fromRadians(longitude,latitude,height);
//其中,longitude和latitude为可选经、纬度,以弧度为单位

3. WGS84坐标系和笛卡尔空间直角坐标系(Cartesian3)的转换

通过经纬度或弧度进行转换

var position = Cesium.Cartesian3.fromDegrees(longitude,latitude,height);//其中,高度默认值为0,可以不用填写;longitude和latitude为可选经、纬度,以弧度为单位
var positions = Cesium.Cartesian3.fromDegreesArray(coordinates);//其中,coordinates格式为不带高度的数组。例如:[-115.0,37.0,-107.0,33.0]
var positions = Cesium.Cartesian3.fromDegreesArrayHeights(coordinates);//coordinates格式为带有高度的数组。例如:[-115.0,37.0,100000.0,-107.0,33.0,150000.0]
//同理,通过弧度转换,用法相同,具体有Cesium.Cartesian3.fromRadians,Cesium.Cartesian3.fromRadiansArray,Cesium.Cartesian3.fromRadiansArrayHeights等方法

注意:上述转换函数中最后均有一个默认参数ellipsoid(默认值为Ellipsoid.WGS84)。

4. 通过弧度进行转换

具体弧度原理可以参考上边的注意事项。

var position = Cesium.Cartographic.fromDegrees(longitude, latitude, height);
var positions = Cesium.Ellipsoid.WGS84.cartographicToCartesian(position);
var positions = Cesium.Ellipsoid.WGS84.cartographicArrayToCartesianArray([position1,position2,position3]);

5. 笛卡尔空间直角坐标系转换为WGS84

  • 直接转换
var cartographic= Cesium.Cartographic.fromCartesian(cartesian3);
// 转换得到WGS84弧度坐标系后再使用经纬度和弧度的转换,进行转换到目标值
  • 间接转换
var cartographic = Cesium.Ellipsoid.WGS84.cartesianToCartographic(cartesian3);
var cartographics = Cesium.Ellipsoid.WGS84.cartesianArrayToCartographicArray([cartesian1,cartesian2,cartesian3]);

6. 平面坐标系(Cartesian2)和笛卡尔空间直角坐标系(Cartesian3)的转换

  • 平面坐标系转笛卡尔空间直角坐标系
           这里注意的是当前的点(Cartesian2)必须在三维球上,否则返回的是undefined;通过ScreenSpaceEventHandler回调会取到的坐标都是Cartesian2
  • 屏幕坐标转场景坐标-获取倾斜摄影或模型点击处的坐标
           这里的场景坐标是包含了地形、倾斜摄影表面、模型的坐标。
           通过viewer.scene.pickPosition(movement.position)获取,根据窗口坐标,从场景的深度缓冲区中拾取相应的位置,返回笛卡尔坐标。
var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (movement) {var position = viewer.scene.pickPosition(movement.position);console.log(position);
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);//  注:若屏幕坐标处没有倾斜摄影表面、模型时,获取的笛卡尔坐标不准,
//  此时要开启地形深度检测
//  viewer.scene.globe.depthTestAgainstTerrain = true;默认为false
  • 屏幕坐标转地表坐标-获取加载地形后对应的经纬度和高程
           这里是地球表面的世界坐标,包含地形,不包括模型、倾斜摄影表面。
           通过viewer.scene.globe.pick(ray,scene)获取,其中fay=viewer.camera.getPickRay(movement.position)。
var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (movement) {var ray = viewer.camera.getPickRay(movement.position);var position = viewer.scene.globe.pick(ray, viewer.scene);console.log(position);
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
// 注:通过测试,此处得到的坐标通过转换成wgs84后,height的为该点的地形高程值。
  • 笛卡尔空间直角坐标系转平面坐标系
var cartesian2= Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene,cartesian3)
  • 空间位置变换
           经纬度转换到笛卡尔坐标系后就能运用计算机图形学中的仿射变换知识进行空间位置变换如平移旋转缩放。
           Cesium为我们提供了很有用的变换工具类:Cesium.Cartesian3(相当于Point3D)Cesium.Matrix3(3×3矩阵,用于描述旋转变换)Cesium.Matrix4(4×4矩阵,用于描述旋转加平移变换),Cesium.Quaternion(四元数,用于描述围绕某个向量旋转一定角度的变换)。

学习【Cesium】第四篇,Cesium的坐标与转换(学不会揍我)相关推荐

  1. python学习[第十四篇] 文件的输入与输出

    python学习[第十四篇] 文件的输入与输出 标准文件类型 一般来说只要程序一执行,就会访问3个文件: 标准输入(键盘) stdin 标准输出(显示器缓冲区) stdout 默认输出到屏幕 标准错误 ...

  2. SaltStack 学习笔记 - 第四篇: SaltStack常用模块

    SaltStack 通过模块来实现管理,具备丰富的模块功能,命令形式也比较自由,这里通过罗列几个有用的命令来作为入门的学习实验. sys.doc : 类似linux的man命令,可以显示minion支 ...

  3. python实现用户输入用户名和密码不能为空_Python学习【第四篇】用户输入及判断...

    用户输入:例1.写一个小程序为用户输入密码.流程如下:1.用户输入其用户名2.输出\u201CHello +用户名\\/usr\/bin\/env python # name = raw_input( ...

  4. 集成学习(ensemble learning)(四)

    文章目录 一.GBDT概述 二.GDBT原理 1.负梯度拟合 2.GBDT回归算法 3.GBDT分类算法 (1)二元GBDT分类算法 (2)多元GBDT分类算法 4.GBDT常用损失函数 (1)分类任 ...

  5. AQS与CLH相关论文学习系列(四)- AQS的设计思路

    本文是AQS与CLH相关论文学习系列第四篇. 系列其他文章链接如下 AQS与CLH相关论文学习系列(一)- 排队式自旋锁思想启蒙 AQS与CLH相关论文学习系列(二)- MCS 锁 AQS与CLH相关 ...

  6. Cty的Linux学习笔记(四)

    Linux学习笔记--第四篇 (声明:该笔记只作为学习记录及参考) cp: -r:复制一个目录 -i:安全选项 echo:用于打印,后面若有'>'符号测试将'>'前的内容写到后面的文件中, ...

  7. SSM框架学习总结第零篇--框架是什么

    SSM框架系列文章: SSM框架学习总结第零篇–框架是什么 SSM框架学习总结第一篇–MyBatis SSM框架学习总结第二篇–Spring SSM框架学习总结第三篇–Spring MVC SSM框架 ...

  8. 第四章 Cesium学习入门之加载离线影像图(tif)

    从0开始的Cesium 第一章 Cesium学习入门之搭建Vite+Vue3+Cesium开发环境 第二章 Cesium学习入门之搭建Cesium界面预览和小控件隐藏 第三章 Cesium学习入门之地 ...

  9. Cesium开发工具篇 | 07回顾总结

    到目前为止,Cesium开发课程的篇幅已经学完四分之三了,大家如果有什么问题可以私信我或者扫描以下二维码进群沟通,若群二维码失效,可扫描最下方的公众号二维码,加我为好友并备注加群.有时会比较忙来不及回 ...

最新文章

  1. java property异常_Java常见的异常和解决的办法
  2. redis演练(5) redis持久化
  3. 云炬Qtpy5开发与实战笔记 0搭建开发环境(傻瓜式安装)
  4. 品牌到底要不要做全渠道?且听他们怎么说……
  5. 在 C# 中,如何发现死锁并防止死锁
  6. 最优化课堂笔记04:非线性规划(考点4-5例题)
  7. 算法题目——二次函数三分求极值(HDU-3714)
  8. MariaDb数据库管理系统的学习(一)安装示意图
  9. 文档容器iOS网络编程-iCloud文档存储编程实例
  10. 伴鱼:借助 Flink 完成机器学习特征系统的升级
  11. scanf 输入十六进制_在C语言中使用scanf()输入一个十六进制值
  12. 解决ffmpeg中的时间戳同步问题
  13. 2022,火山引擎的云上第一“子”,为何是视频?
  14. Server.MapPath()用法
  15. 一款软件测试脚本生成工具
  16. libiec61850 1.5.1 新版本
  17. 干货分享——CAD动态块
  18. php 视频裁剪,视频画面大小裁剪 把视频画面多余部分裁剪掉,视频画面裁剪工具的使用方法...
  19. 国学精华,千古绝唱500句
  20. java打印5排星号_Java-用星号打印菱形

热门文章

  1. 销售人员如何有效地做好客户关系管理
  2. 移动硬盘显示磁盘未被格式化要怎样办啊
  3. autohotkey实现自动totalcmd 8.52点击未激活提示窗口
  4. 菜鸟第一次wp项目总结
  5. 厦门特色中秋——博饼
  6. eclipse使用git如何merge
  7. 突破存储边界 赋能开放计算 | 西部数据亮相2022 OCP
  8. js将时间秒转换成天小时分钟秒的字符串
  9. WIN XP蓝屏代码大全
  10. 一封来自Java程序员的情书