学习【Cesium】第四篇,Cesium的坐标与转换(学不会揍我)
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的坐标与转换(学不会揍我)相关推荐
- python学习[第十四篇] 文件的输入与输出
python学习[第十四篇] 文件的输入与输出 标准文件类型 一般来说只要程序一执行,就会访问3个文件: 标准输入(键盘) stdin 标准输出(显示器缓冲区) stdout 默认输出到屏幕 标准错误 ...
- SaltStack 学习笔记 - 第四篇: SaltStack常用模块
SaltStack 通过模块来实现管理,具备丰富的模块功能,命令形式也比较自由,这里通过罗列几个有用的命令来作为入门的学习实验. sys.doc : 类似linux的man命令,可以显示minion支 ...
- python实现用户输入用户名和密码不能为空_Python学习【第四篇】用户输入及判断...
用户输入:例1.写一个小程序为用户输入密码.流程如下:1.用户输入其用户名2.输出\u201CHello +用户名\\/usr\/bin\/env python # name = raw_input( ...
- 集成学习(ensemble learning)(四)
文章目录 一.GBDT概述 二.GDBT原理 1.负梯度拟合 2.GBDT回归算法 3.GBDT分类算法 (1)二元GBDT分类算法 (2)多元GBDT分类算法 4.GBDT常用损失函数 (1)分类任 ...
- AQS与CLH相关论文学习系列(四)- AQS的设计思路
本文是AQS与CLH相关论文学习系列第四篇. 系列其他文章链接如下 AQS与CLH相关论文学习系列(一)- 排队式自旋锁思想启蒙 AQS与CLH相关论文学习系列(二)- MCS 锁 AQS与CLH相关 ...
- Cty的Linux学习笔记(四)
Linux学习笔记--第四篇 (声明:该笔记只作为学习记录及参考) cp: -r:复制一个目录 -i:安全选项 echo:用于打印,后面若有'>'符号测试将'>'前的内容写到后面的文件中, ...
- SSM框架学习总结第零篇--框架是什么
SSM框架系列文章: SSM框架学习总结第零篇–框架是什么 SSM框架学习总结第一篇–MyBatis SSM框架学习总结第二篇–Spring SSM框架学习总结第三篇–Spring MVC SSM框架 ...
- 第四章 Cesium学习入门之加载离线影像图(tif)
从0开始的Cesium 第一章 Cesium学习入门之搭建Vite+Vue3+Cesium开发环境 第二章 Cesium学习入门之搭建Cesium界面预览和小控件隐藏 第三章 Cesium学习入门之地 ...
- Cesium开发工具篇 | 07回顾总结
到目前为止,Cesium开发课程的篇幅已经学完四分之三了,大家如果有什么问题可以私信我或者扫描以下二维码进群沟通,若群二维码失效,可扫描最下方的公众号二维码,加我为好友并备注加群.有时会比较忙来不及回 ...
最新文章
- Google开源OCR项目Tesseract训练(自己训练的记录,未成功)
- Thrift Java Servers Compared
- 实现瀑布流的核心代码
- mysql多主单向环形_mysql多主单向--gt;环形同步_MySQL
- 大学排名居然是一家快倒闭的二流杂志搞出来的自救项目?
- 教程 | 如何优雅而高效地使用Matplotlib实现数据可视化
- 荣耀Magic4 Pro延迟上市:全新一代LTPO超级四曲面屏加持
- linux+html5+开发工具,记不住 Linux 命令?这三个工具可以帮你
- 【零基础学Java】—继承父类并实现多个接口(二十五)
- 喵哈哈村小学上课啦(欧拉函数)
- 35.Linux/Unix 系统编程手册(下) -- 进程的优先级和调度
- linux优麒麟iso镜像,国产优麒麟操作系统官方下载
- 黑莓开发新手入门教学帖,如何制作一个能控制LED颜色的程序(一)
- 日紫白飞星算法_年、月、日、时紫白飞星法!
- 微信小程序中转义字符的处理
- 中国双离合器变速器市场趋势报告、技术动态创新及市场预测
- iOS -- 友盟工具进行Crash分析/dsym文件
- NOSQL 之 Graph Database 之 neo4j
- 简易实用的Web Notification桌面通知
- linux 内核 vrf,linux - linux内核支持多少个vrf,哪些系统资源限制了vrf的数量? - 堆栈内存溢出...
热门文章
- 实战打靶集锦-018-decoy
- app专项测试之电量测试
- linux应用程序基础
- Java图片透明化操作
- [附源码]Nodejs计算机毕业设计西仰陵农贸市场网销系统Express(程序+LW)
- Frida—HOOK 学习笔记1
- 电大远程教育计算机应用基础,(2017年电大)2017年电大远程网络教育计算机应用基础统考模拟试题集.doc...
- 攻防世界 supersqli
- /dede/plus_bshare.php,bShare插件管理
- dw可以自动生成html,Dreamweaver创建简单的html页面的详细教程