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 学习(六) 坐标转换的更多相关文章

  1. Hbase深入学习(六) Java操作HBase

    Hbase深入学习(六) ―― Java操作HBase 本文讲述如何用hbase shell命令和hbase java api对hbase服务器进行操作. 先看以下读取一行记录hbase是如何进行工作 ...

  2. TweenMax动画库学习(六)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

  3. SVG 学习<六> SVG的transform

    目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...

  4. C#多线程学习(六) 互斥对象

    如何控制好多个线程相互之间的联系,不产生冲突和重复,这需要用到互斥对象,即:System.Threading 命名空间中的 Mutex 类. 我们可以把Mutex看作一个出租车,乘客看作线程.乘客首先 ...

  5. Unity学习(六)5.x依赖打包

    http://blog.sina.com.cn/s/blog_89d90b7c0102w2ox.html unity5已经封装好了接口,所以依赖打包并没有那么神秘和复杂了. 打包: 1.定义好资源的a ...

  6. (转)MyBatis框架的学习(六)——MyBatis整合Spring

    http://blog.csdn.net/yerenyuan_pku/article/details/71904315 本文将手把手教你如何使用MyBatis整合Spring,这儿,我本人使用的MyB ...

  7. cesium 学习(五) 加载场景模型

    cesium 学习(五) 加载场景模型 一.前言 现在开始实际的看看效果,目前我所接触到基本上都是使用Cesium加载模型这个内容,以及在模型上进行操作.So,现在进行一些加载模型的学习,数据的话可以 ...

  8. Cesium学习系列汇总

    内容比较多,完整看完需要大概10分钟,废话不多说,撸起袖子,加油干!!! 1.前言 按照套路,先介绍一下什么是Cesium. Cesium ['siːzɪəm]是JavaScript开源库,通过Ces ...

  9. day 84 Vue学习六之axios、vuex、脚手架中组件传值

    Vue学习六之axios.vuex.脚手架中组件传值   本节目录 一 axios的使用 二 vuex的使用 三 组件传值 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 axios的 ...

随机推荐

  1. Oracle数据库备份和恢复的基本命令

    Oracle数据库备份与恢复基本命令 1. 获取帮助 $ exp help=y $ imp help=y 2.三种工作方式 (1)交互式方式 $ exp 然后按提示输入所需要的参数 (2)命令行方式 ...

  2. Java的String类字符串的拆分

    在java编程中,有时候我们需要把一个字符串按照某个特定字符.字母等作为截点分割这个字符串, 这样我们就可以使用这个字符串的一部分或者把所有截取的内容保存到数组里等操作. public class S ...

  3. java中Array和ArrayList区别

    1)精辟阐述:可以将 ArrayList想象成一种“会自动扩增容量的Array”. 2)Array([]):最高效:但是其容量固定且无法动态改变:     ArrayList:  容量可动态增长:但牺 ...

  4. Python基础,day2

    程序练习 程序:购物车程序 需求: 启动程序后,让用户输入工资,然后打印商品列表 允许用户根据商品编号购买商品 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 可随时退出,退出时,打印已购买 ...

  5. 利用org.mybatis.generator生成实体类

    springboot+maven+mybatis+mysql 利用org.mybatis.generator生成实体类 1.添加pom依赖:   2.编写generatorConfig.xml文件 ( ...

  6. 【jar包管理】Maven BOM

    BOM Alibaba Spring Boot Dependencies is a Maven BOM used to manage the versions of most used Alibaba ...

  7. H5 离线缓存的用法

    H5离线缓存基础系列   1.什么是离线缓存 离线缓存:离线缓存可以将站点的一些文件缓存到本地,它是浏览器自己的一种机制,将需要的文件缓存下来,以便后期即使没有连接网络,被缓存的页面也可以展示. 2. ...

  8. BZOJ 2039:[2009国家集训队]employ人员雇佣(最小割)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2039 题意:中文题意. 思路:一开始想着和之前做的最大权闭合图有点像,但是如果把边全部当成点的话,那 ...

  9. Modbus RTU 通信应用案例

    如何打开项目归档文件 例程中的TIA博途项目文件与STEP 7项目文件均为归档文件,需要按如下方式打开: TIA博途项目文件 1. 打开TIA博途软件,通过软件左下方“项目视图”按钮切换至项目视图: ...

  10. Minimum Spanning Tree

    前言 说到最小生成树(Minimum Spanning Tree),首先要对以下的图论概念有所了解. 图 图(Graph)是表示物件与物件之间的关系的数学对象,是图论的基本研究对象.图的定义方式有两种 ...