Cesium笔记(9):Cesium常用坐标系相互转化方法与优化说明
Cartographic Cartesian2 Cartesian3是什么鬼?笛卡尔空间直角坐标、经纬度坐标、弧度坐标,如何在cesium使用,如何转换为屏幕像素坐标?球心坐标(ECEF)与本地坐标(NEU)有何区别?cesium对于坐标及3D运动做了哪些优化措施?
对于坐标系不太熟悉的,可以先阅读《GIS坐标系测绘原理:大地水准面/基准面/参考椭球体/EPSG/SRI/WKT 》、《GIS坐标系:WGS84,GCJ02,BD09,火星坐标,大地坐标等解析说与转换 》
Cesium中可使用的坐标系
Cesium中常用的坐标系主要有两种:WGS84坐标系和笛卡尔空间直角坐标系。平时我们常见的某个点的经纬度就是在WGS84坐标系下某个点的坐标,它的坐标原点在椭球的质心;而笛卡尔坐标系主要是用来做空间位置的变化如平移、旋转和缩放等等,它的坐标原点在椭球的中心。
除此之外,还有不常用的坐标系:
-
Cartographic 地理坐标系下经纬度的弧度表示,Cesium.Cartographic.fromDegrees(lng,lat,alt)
-
Cartesian2 平面坐标系
-
Cartesian3 笛卡尔空间直角坐标系,Cesium.Cartesian3.fromDegrees(longitude, latitude, height, ellipsoid, result)
-
Cartesian4(unknown,在应用中几乎用不到)
通常情况下通过它和WGS84坐标系之间互转。
Cesium坐标使用
平面坐标系与空间直角坐标系
Cartesian2→ new Cesium.Cartesian2(x, y)
Cartesian3→ new Cesium.Cartesian3(x, y, z)
Cartesian3→ Cartesian2:Cesium.Cartesian2.fromCartesian3(cartesian, result)
经纬度坐标(WGS84)
Cartesian3→ Cesium.Cartesian3.fromDegrees(longitude, latitude, height, ellipsoid, result)
弧度坐标
Cartesian3→ Cesium.Cartesian3.fromRadians(longitude, latitude, height, ellipsoid, result)
Cartographic→new Cesium.Cartographic(longitude, latitude, height) //经纬度为弧度单位
Cartesian3→ Cartographic 互相转换
Cesium.Cartographic.fromCartesian(new Cesium.Cartographic(longitude, latitude, height) , ellipsoid, result)
Cesium.Cartographic.fromDegrees(longitude, latitude, height, result)
经纬度坐标和弧度坐标也可以通过Cesium.Math来转换
Cesium.CesiumMath.toDegrees(radians) → Number
Cesium.CesiumMath.toRadians(degrees) → Number
Cesium各坐标系参数转换
Pick----屏幕坐标 Cartesian----世界坐标 cartographic-----地理坐标(弧度)Point----经纬度坐标
一、经纬度转换为世界坐标
Cesium.Cartesian3.fromDegrees(longitude, latitude, height, ellipsoid, result)
var ellipsoid=viewer.scene.globe.ellipsoid;
var cartographic=Cesium.Cartographic.fromDegrees(lng,lat,alt);
var cartesian3=ellipsoid.cartographicToCartesian(cartographic);
二、 世界坐标转换为经纬度
var ellipsoid=viewer.scene.globe.ellipsoid;
var cartesian3=new Cesium.cartesian3(x,y,z);
var cartographic=ellipsoid.cartesianToCartographic(cartesian3);
var lat=Cesium.Math.toDegrees(cartograhphic.latitude);
var lng=Cesium.Math.toDegrees(cartograhpinc.longitude);
var alt=cartographic.height;
Cartographic.fromCartesian
三、屏幕坐标和世界坐标相互转换
var pick1= new Cesium.Cartesian2(0,0);
var cartesian = viewer.scene.globe.pick(viewer.camera.getPickRay(pick1),viewer.scene);
Cesium.SceneTransforms.wgs84ToWindowCoordinates(scene, Cartesian3);
球心坐标(ECEF)与本地坐标(NEU)
假如你来到一个陌生城市,你很可能需要问路、通常会告诉你向北走100米,右转,向东走100米,理解起来很直观。你给儿子买了一个地球仪,你从北京(39,115)转到伦敦 (51,0),这个动作就可以分解为两步:先转到同一个经度(39,0),在转到同一个维度(51,0)
这个例子体现了一个问题:不同的地理范围下会使用更适合的坐标系。比如前者是局部的平面坐标,而后者是球面坐标。因此,同一个点相对不同的原点,具有不同的相对位置:既是地球上的一个经纬度,又是“出门右转富士康”的这类的位置。如图,蓝色坐标系就是球心坐标,而绿色坐标系是以球面一点为原点的本地坐标系。准确讲,就是该点对应球的切面和法线组成的空间。
这自然引出了这个问题:如何从以球心为原点的球面坐标到以球面上任意一点为原点的局部坐标,坐标系之间的转换,答案就是矩阵。
坐标系的换算,其实就是坐标原点之间的转换。比如发射导弹,首先瞄准,然后发射,这里面就包括两个动作:旋转和平移。如上图,旋转分为两步,经度(Z轴)旋转和纬度(X轴)旋转,分别是上图中绿色和蓝色两个过程。
具体可以阅读《三维旋转笔记:欧拉角/四元数/旋转矩阵/轴角-记忆点整理》,这里不再赘述
Cesium关于坐标变换的优化
如上是矩阵公式推算和几何意义的解释。看上去是几何问题,实际上是函数问题,这正是矩阵的价值所在。但函数问题也有一个缺点,特别是矩阵,计算量太大,占用内存也不低。大家在做数学题的时候应该都有过类似感觉,一个代数题好复杂,计算了半天,还容易犯错,好不容易才得出答案。这时老师用几何的思路来求解,一目了然,如穿越虫洞般不费吹灰之力。
回到这个问题,我们把坐标转换抽象成矩阵问题,对应的几何意义就是该点的切面和法线。
假设是一个圆,如下,圆心到该点就是其切面法线,这个向量很容易得出,通过点乘可以很容易的得到法线对应该点的垂线。
这时,把这个圆看成一个球,两条黑线的叉乘就可以得出另一个垂线,这就是该点对应的NEU坐标的三个轴,是不是也很容易理解,而且只需要三个步骤,计算量很小:
-
减法求出Up向量
-
点乘求出East向量
-
叉乘求出North向量
这正是Cesium中提供的思路,对应Transforms.eastNorthUpToFixedFrame方法
摘要文章:
Cesium之球心坐标与本地坐标 https://www.cnblogs.com/fuckgiser/p/6688531.html
Cesium Cartesian3 和经纬度以及屏幕坐标等之间的转换 https://blog.csdn.net/u013821237/article/details/80169327
Cesium学习笔记(2) https://blog.csdn.net/u013929284/article/details/52503295
本文转自 https://www.zhoulujun.cn/html/GIS/cesium/8337.html,如有侵权,请联系删除。