Cesium坐标系及坐标转换详解

更新时间:2023-05-11 06:38:26 阅读: 评论:0

Cesium坐标系及坐标转换详解
前⾔
Cesium项⽬中经常涉及到模型加载、浏览以及不同数据之间的坐标转换,弄明⽩Cesium中采⽤的坐标系以及各个坐标系之间的转换,是我们迈向三维GIS⼤门的前提,本⽂详细的介绍了Cesium中采⽤的两⼤坐标系以及之间转换的各种⽅法。
Cesium中的坐标系
Cesium中常⽤的坐标有两种WGS84地理坐标系和笛卡尔空间坐标系,我们平时常⽤的以经纬度来指明⼀个地点就是⽤的WGS84坐标,笛卡尔空间坐标系常⽤来做⼀些空间位置变换如平移旋转缩放等等。⼆者的联系如下图。
其中,WGS84地理坐标系包括 WGS84经纬度坐标系(没有实际的对象)和 WGS84弧度坐标系(Cartographic);
笛卡尔空间坐标系包括笛卡尔空间直⾓坐标系(Cartesian3)、平⾯坐标系(Cartesian2),4D笛卡尔坐标系(Cartesian4)。
WGS84坐标系
World Geodetic System 1984,是为GPS全球定位系统使⽤⽽建⽴的坐标系统,坐标原点为地球质⼼,其地⼼空间直⾓坐标系的Z轴指向BIH (国际时间服务机构)1984.O定义的协议地球极(CTP)⽅向,X轴指向BIH 1984.0的零⼦午⾯和CTP⾚道的交点,Y轴与Z轴、X轴垂直构成右⼿坐标系。我们平常⼿机上的指南针显⽰的经纬度就是这个坐标系下当前的坐标,进度范围[-180,180],纬度范围[-90,90]。
WGS84坐标系
Cesium⽬前⽀持两种坐标系WGS84和WebMercator,但是在Cesium中没有实际的对象来描述WGS84坐标,都是以弧度的⽅式来进⾏运⽤的也就是Cartographic类:
new Cesium.Cartographic(longitude, latitude, height),这⾥的参数也叫longitude、latitude,就是经度和纬度,计算⽅法:弧度= π/180×经纬度⾓度。
笛卡尔空间直⾓坐标系(Cartesian3)
笛卡尔空间坐标的原点就是椭球的中⼼,我们在计算机上进⾏绘图时,不⽅便使⽤经纬度直接进⾏绘图,⼀般会将坐标系转换为笛卡尔坐标系,使⽤计算机图形学中的知识进⾏绘图。这⾥的Cartesian3,有点类似于三维系统中的Point3D对象,new Cesium.Cartesian3(x, y, z),⾥⾯三个分量x、y、z。
笛卡尔空间直⾓坐标系
平⾯坐标系(Cartesian2)
平⾯坐标系也就是平⾯直⾓坐标系,是⼀个⼆维笛卡尔坐标系,与Cartesian3相⽐少了⼀个z的分量,new Cesium.Cartesian2(x, y)。Cartesian2经常⽤来描述屏幕坐标系,⽐如⿏标在电脑屏幕上的点击位置,返回的就是Cartesian2,返回了⿏标点击位置的xy像素点分量。
平⾯坐标系
坐标转换
经纬度和弧度的转换
var radians=Radians(degrees);//经纬度转弧度
var degrees=Degrees(radians);//弧度转经纬度
WGS84经纬度坐标和WGS84弧度坐标系(Cartographic)的转换
//⽅法⼀:
var longitude = Radians(longitude1); //其中 longitude1为⾓度
var latitude= Radians(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为弧度
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)。
通过过度进⾏转换
具体过度原理可以参考上边的注意事项。
var position = Cesium.Cartographic.fromDegrees(longitude, latitude, height);
var positions = Cesium.Ellipsoid.WGS84.cartographicToCartesian(position);
var positions = Cesium.Ellipsoid.WGS84.cartographicArrayToCartesianArray([position1,position2,position3]);
笛卡尔空间直⾓坐标系转换为WGS84
直接转换
var cartographic= Cesium.Cartographic.fromCartesian(cartesian3);
转换得到WGS84弧度坐标系后再使⽤经纬度和弧度的转换,进⾏转换到⽬标值
间接转换
var cartographic = Cesium.Ellipsoid.WGS84.cartesianToCartographic(cartesian3);
var cartographics = Cesium.Ellipsoid.WGS84.cartesianArrayToCartographicArray([cartesian1,cartesian2,cartesian3]);
平⾯坐标系(Cartesian2)和笛卡尔空间直⾓坐标系(Cartesian3)的转换
平⾯坐标系转笛卡尔空间直⾓坐标系
这⾥注意的是当前的点(Cartesian2)必须在三维球上,否则返回的是undefined;通过ScreenSpaceEventHandler回调会取到的坐标都是Cartesian2。
屏幕坐标转场景坐标-获取倾斜摄影或模型点击处的坐标
这⾥的场景坐标是包含了地形、倾斜摄影表⾯、模型的坐标。
通过viewer.scene.pickPosition(movement.position)获取,根据窗⼝坐标,从场景的深度缓冲区中拾取相应的位置,返回笛卡尔坐标。
var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.tInputAction(function (movement) {
var position = viewer.scene.pickPosition(movement.position);
console.log(position);
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
注:若屏幕坐标处没有倾斜摄影表⾯、模型时,获取的笛卡尔坐标不准,此时要开启地形深度检测(viewer.scene.globe.depthTestAgainstTerrain = true; //默认为fal)。
屏幕坐标转地表坐标-获取加载地形后对应的经纬度和⾼程
这⾥是地球表⾯的世界坐标,包含地形,不包括模型、倾斜摄影表⾯。
通过viewer.scene.globe.pick(ray, scene)获取,其中ray=PickRay(movement.position)。
var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.tInputAction(function (movement) {
var ray = PickRay(movement.position);
var position = viewer.scene.globe.pick(ray, viewer.scene);
console.log(position);
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
注:通过测试,此处得到的坐标通过转换成wgs84后,height的为该点的地形⾼程值。
屏幕坐标转椭球⾯坐标-获取⿏标点的对应椭球⾯位置
这⾥的椭球⾯坐标是参考椭球的WGS84坐标(Ellipsoid.WGS84),不包含地形、模型、倾斜摄影表⾯。
通过 viewer.scene.camera.pickEllipsoid(movement.position, ellipsoid)获取,可以获取当前点击视线与椭球⾯相交处的坐标,其中ellipsoid是当前地球使⽤的椭球对象:viewer.scene.globe.ellipsoid,默认为Ellipsoid.WGS84。
var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.tInputAction(function (movement) {
var position = viewer.scene.camera.pickEllipsoid(movement.position, viewer.scene.globe.ellipsoid);
console.log(position);
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
注:通过测试,此处得到的坐标通过转换成wgs84后,height的为0(此值应该为地表坐标减去地形的⾼程)。
笛卡尔空间直⾓坐标系转平⾯坐标系
var cartesian2= Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene,cartesian3)
空间位置变换
经纬度转换到笛卡尔坐标系后就能运⽤计算机图形学中的仿射变换知识进⾏空间位置变换如平移旋转缩放。
Cesium为我们提供了很有⽤的变换⼯具类:Cesium.Cartesian3(相当于Point3D)Cesium.Matrix3(3x3矩阵,⽤于描述旋转变换)Cesium.Matrix4(4x4矩阵,⽤于描述旋转加平移变换),Cesium.Quaternion(四元数,⽤于描述围绕某个向量旋转⼀定⾓度的变换)。
下⾯举个例⼦:
⼀个局部坐标为p1(x,y,z)的点,将它的局部坐标原点放置到loc(lng,lat,alt)上,局部坐标的z轴垂直于地表,局部坐标的y轴指向正北,并围绕这个z轴旋转d度,求此时
p1(x,y,z)变换成全局坐标笛卡尔坐p2(x1,y1,z1)是多少?
var rotate = Radians(d);//转成弧度
var quat = Cesium.Quaternion.fromAxisAngle(Cesium.Cartesian3.UNIT_Z, rotate); //quat为围绕这个z轴旋转d度的四元数
var rot_mat3 = Cesium.Matrix3.fromQuaternion(quat);//rot_mat3为根据四元数求得的旋转矩阵
var v = new Cesium.Cartesian3(x, y, z);//p1的局部坐标
var m = Cesium.Matrix4.fromRotationTranslation(rot_mat3, Cesium.Cartesian3.ZERO);//m为旋转加平移的4x4变换矩阵,这⾥平移为(0,0,0),故填个Cesium.Cartesian3.ZERO m = Cesium.Matrix4.multiplyByTranslation(m, v);//m = m X v
var cart3 = ellipsoid.cartographicToCartesian(Cesium.Cartographic.fromDegrees(lng, lat, alt)); //得到局部坐标原点的全局坐标
var m1 = Cesium.Transforms.eastNorthUpToFixedFrame(cart3);//m1为局部坐标的z轴垂直于地表,局部坐标的y轴指向正北的4x4变换矩阵
m = Cesium.Matrix4.multiplyTransformation(m, m1);//m = m X m1
var p2 = Translation(m);//根据最终变换矩阵m得到p2
console.log('x=' + p2.x + ',y=' + p2.y + ',z=' + p2.z );
总结
通过本⽂,介绍了各个坐标系间的转换问题,在具体项⽬中,可结合实际需求,灵活组合解决具体的实际问题。注意,博⽂是参照⽹上相关博客及结合⾃⼰的实践总结得来,希望本⽂对你有所帮助,后续会更新更多内容,感兴趣的朋友可以加关注,欢迎留⾔交流!

本文发布于:2023-05-11 06:38:26,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/581821.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:坐标   坐标系   转换   空间   经纬度   地形   位置   获取
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图