cesium 学习(六) 坐标转换
cesium 学习(六) 坐标转换
一、前言
在场景中,不管是二维还好还是三维也罢,只要涉及到空间概念都会提到坐标,坐标是让我们理解位置的一个非常有效的东西。有了坐标,我们能很快的确定位置相关关系,但是坐标有很多种,专业的说,坐标系有很多种,比如大地2000、北京54、西安80、WGS84、墨卡托投影坐标系……还有各个地方的地方坐标系。如果用北京54坐标带入到WGS84坐标中去使用,你会发现偏差的不说十万八千里也会让你怀疑人生!
所以我们需要坐标转换这个东西,把一个坐标系的坐标转换成另一个想要的坐标系的坐标。
二、GPS坐标转Cartesian3坐标
Cesium提供了这两个坐标系的转换方法,是比较简单的,可以直接转换,但是有一点是Cartesian3坐标转换成GPS坐标时,它的结果是弧度值,不是角度值,所以如果需要我们常用的GPS坐标就需要再转换一下,将弧度转换为角度。
|
//GPS转世界坐标(x,y,z) this.GPSToWorldCoordinate = function(longtitude,latitude,height){ var result = Cesium.Cartesian3.fromDegrees(longtitude, latitude, height); return result; }; //世界坐标转GPS坐标(角度值)[经度,纬度,高度] this.WorldCoordinateToGPS = function(x,y,z){ var result = Cesium.Cartographic.fromCartesian(new Cesium.Cartesian3(x,y,z)); var arr = [result.longitude*180/Math.PI,result.latitude*180/Math.PI,result.height]; return arr; }; |
三、Transforms
Cesium的Transforms做的真的不错,刚开始的时候我所有的坐标转换特别是世界坐标与Matrix4的转换,根本搞不懂,还好API讲的还很清楚,不然是根本做不了坐标的一系列计算。
对于坐标转换,建议多看看Cesium的Transforms类。里面有很多与坐标转换相关的方法(包括屏幕坐标与世界坐标的互相转换等),比如下面我做了一个相对坐标与世界坐标的转换就用了Transfroms的方法。
四、本地坐标转换世界坐标
自己做了一个本地与世界转换坐标的类,建立一个本地坐标,然后相互计算。
|
/** * 相对坐标系与世界坐标系转换,相对坐标系的轴方向由可选参数direction控制,默认是eastNorthUp北、东、上为轴线 * * @param {Number} longitude 世界坐标系中的经度 * @param {Number} latitude 世界坐标系中的纬度 * @param {Number} height 世界坐标系中的高度 * @param {Number} direction 坐标轴方向,值是"northEastDown","northUpEast","northWestUp","eastNorthUp"(默认) */ LocalAndWorldTransform = function(longitude,latitude,height,direction){ var RCSorigincenter = Cesium.Cartesian3.fromDegrees(longitude,latitude,height); if (direction == "northEastDown") this.RCSMatrix = Cesium.Transforms.northEastDownToFixedFrame(RCSorigincenter); else if (direction == "northUpEast") this.RCSMatrix = Cesium.Transforms.northUpEastToFixedFrame(RCSorigincenter); else if (direction == "northWestUp") this.RCSMatrix = Cesium.Transforms.northWestUpToFixedFrame(RCSorigincenter); else this.RCSMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(RCSorigincenter); this.RCSmatrixInverse = Cesium.Matrix4.inverseTransformation(this.RCSMatrix, new Cesium.Matrix4()); /** * 相对坐标转换成对应的世界坐标 * * @param {Object} localCoordinates 相对坐标系中的坐标,如 {x:1,y:1,z:1} * @param {Object} result 世界坐标系中的对应坐标,XYZ格式 * @returns */ this.localToWorldCoordinates = function(localCoordinates, result){ if (!result) { result = new Cesium.Cartesian3(); } Cesium.Matrix4.multiplyByPoint(this.RCSMatrix, localCoordinates, result); return result; }; /** * 世界坐标转换成对应的相对坐标 * * @param {Object} WorldCoordinates 世界坐标系中的坐标,XYZ格式 * @param {Object} result 相对坐标系中的坐标,XYZ格式 * @returns */ this.WorldCoordinatesTolocal = function(WorldCoordinates, result){ if (!result) { result = new Cesium.Cartesian3(); } Cesium.Matrix4.multiplyByPoint(this.RCSmatrixInverse, WorldCoordinates, result); return result; }; }; |
五、总结
总的来说,Cesium对于坐标转换已经给我们做的太好了,大多时候我们直接使用即可。因为我有很多地方都用到了相对坐标与世界坐标的转换,所以自己就做了一个公共方法。在使用中还是很方便的,实例化一个相对转换关系对象,然后就可以互转了(: P)。
cesium 学习(六) 坐标转换的更多相关文章
- Hbase深入学习(六) Java操作HBase
Hbase深入学习(六) ―― Java操作HBase 本文讲述如何用hbase shell命令和hbase java api对hbase服务器进行操作. 先看以下读取一行记录hbase是如何进行工作 ...
- TweenMax动画库学习(六)
目录 TweenMax动画库学习(一) TweenMax动画库学习(二) TweenMax动画库学习(三) Tw ...
- SVG 学习<六> SVG的transform
目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...
- C#多线程学习(六) 互斥对象
如何控制好多个线程相互之间的联系,不产生冲突和重复,这需要用到互斥对象,即:System.Threading 命名空间中的 Mutex 类. 我们可以把Mutex看作一个出租车,乘客看作线程.乘客首先 ...
- Unity学习(六)5.x依赖打包
http://blog.sina.com.cn/s/blog_89d90b7c0102w2ox.html unity5已经封装好了接口,所以依赖打包并没有那么神秘和复杂了. 打包: 1.定义好资源的a ...
- (转)MyBatis框架的学习(六)——MyBatis整合Spring
http://blog.csdn.net/yerenyuan_pku/article/details/71904315 本文将手把手教你如何使用MyBatis整合Spring,这儿,我本人使用的MyB ...
- cesium 学习(五) 加载场景模型
cesium 学习(五) 加载场景模型 一.前言 现在开始实际的看看效果,目前我所接触到基本上都是使用Cesium加载模型这个内容,以及在模型上进行操作.So,现在进行一些加载模型的学习,数据的话可以 ...
- Cesium学习系列汇总
内容比较多,完整看完需要大概10分钟,废话不多说,撸起袖子,加油干!!! 1.前言 按照套路,先介绍一下什么是Cesium. Cesium ['siːzɪəm]是JavaScript开源库,通过Ces ...
- day 84 Vue学习六之axios、vuex、脚手架中组件传值
Vue学习六之axios.vuex.脚手架中组件传值 本节目录 一 axios的使用 二 vuex的使用 三 组件传值 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 axios的 ...
随机推荐
- FMX中实现PostMessage的方法
首先,做为一个从Windows下转过来的开发人员,许多时候,我们喜欢用PostMessage来触发一些异步执行的代码,但遗憾的是,FMX做为EMB的跨平台库的基础,只提供了SendMessage方法, ...
- C#委托和事件 EventHandle和EventArgs
一.背景由于对于C#委托和事件理解的不够透彻,并且平时工作中对于自己手写委托和事件很少,渐渐的只会增删改查了.特定整理了委托和事件的基本知识.二.案例案例引用了张逸 博客 中的案例,并做了处理. 创建 ...
- SQL数据库连接池与C#关键字return
SQL数据库连接池: 先前做的一个Sharepoint项目,在上线后的不久,最近一直出现间歇性访问缓慢问题Sharepoint特性问题,并分析了其数据库服务器,发现所耗内存已经达到了97%. 所以断定 ...
- 从零开始人工智能AI(一)-k-nn-矩阵
参考资料: https://baike.baidu.com/item/%E7%9F%A9%E9%98%B5/18069?fr=aladdin http://blog.csdn.net/c4064957 ...
- 【原创】ABAP根据文件路径获取文件所在目录(续)
在上一篇文章<ABAP根据文件路径获取文件所在目录>中,我主要的思路是采用 “SPLIT dobj AT sep INTO TABLE result_tab” 句型将文件全路径按分隔符“\ ...
- hadoop之hive&hbase互操作
大家都知道,hive的SQL操作非常方便,但是查询过程中需要启动MapReduce,无法做到实时响应. hbase是hadoop家族中的分布式数据库,与传统关系数据库不同,它底层采用列存储格式,扩展性 ...
- 深入浅出Ajax
原文(我的GitHub):https://github.com/liangfengbo/frontend-ability/issues/1 学习大纲 理解Ajax的工作原理 Ajax核心-XMLHtt ...
- NSCache缓存怎么来的
什么是NSCache NSCache主要用来存储临时数据(键值对),当内存资源不够时,系统会自动释放部分数据.它有三个特点: • NSCache为了保持不占用过多的系统内存,它有多种自动回收内存策略: ...
- 高性能高并发网站架构,教你搭建Redis5缓存集群
一.Redis集群介绍 Redis真的是一个优秀的技术,它是一种key-value形式的NoSQL内存数据库,由ANSI C编写,遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Val ...
- 高并发 Nginx+Lua OpenResty系列(4)——Lua 模块开发
在实际开发中,不可能把所有代码写到一个大而全的lua文件中,需要进行分模块开发:而且模块化是高性能Lua应用的关键.使用require第一次导入模块后,所有Nginx 进程全局共享模块的数据和代码,每 ...