Cesium中各种坐标以及相互转换(七)
2024-09-18 15:50:31
2023-01-11
1.坐标系
Cartesian3
笛卡尔坐标,又叫世界坐标,是一个三维空间中的点 ,具有xyz,类似:(-1314910.6675027965, 5328726.846411945, 3238183.748823095),单位为米
原点在椭球中心
Cartesian2
是二维空间中的点,通常是屏幕坐标
console.log(`鼠标点击位置为:${click.position}`);
鼠标点击位置为:(372.79998779296875, 213.7999997138977)
屏幕左上角为原点,向右为x正方向,向下为y正方向
cartographic
和Cartesian3一样是三维空间中的点,但是单位是弧度,通常也叫椭球坐标
当世界坐标为:(-1315009.0349616667, 5329125.484381694, 3238427.62747913),
此时对应的cartographic为:(1.8127222052449903, 0.5359692831389684, 492.5617098962376)
第三个参数是海拔,单位为米。
经纬度
Cesuim中没有具体的经纬度对象,要得到经纬度首先需要计算为弧度,再进行转换。
2.坐标转换
2.1 转换为经纬度
其实在实际应用中最常用的就是经纬度,我们先将如何转换为经纬度
2.1.1 cartographic 转经纬度(弧度转经纬度)
这是最简单的,弧度和经纬度是可以直接按照数学公式计算的。
Cesium的Math库也提供了函数进行计算:
// 弧度转换为经纬度
var lon = Cesium.Math.toDegrees(cartographic.longitude); // 经度
var lat = Cesium.Math.toDegrees(cartographic.latitude); // 纬度
console.log(`经度:${lon},纬度:${lat}`);
2.1.2 Cartesian3转经纬度(世界坐标/笛卡尔坐标 转经纬度)
由于已经知道如果有弧度的话就可以计算得到经纬度,所以问题转换为如何将世界坐标转换为椭球坐标。
找到了如下方法
可以直接用Cartesian3创建一个弧度坐标。
var x = Cesium.Cartographic.fromCartesian(new Cesium.Cartesian3.fromDegrees(100,30,500))
console.log(`100,30,500对应的弧度:${x}`);
100,30,500对应的弧度:(1.7453292519943295, 0.5235987755982987, 499.9999999999014)
2.1.3 屏幕坐标转经纬度
在camera里有这么一个方法
返回一个Cartesian3也就是笛卡尔坐标系下的点
click是点击事件,这里不用管
console.log(`鼠标点击位置为:${click.position}`); var cartesian = that.viewer.scene.globe.pick(that.viewer.camera.getPickRay(click.position),that.viewer.scene); console.log(`世界坐标:${cartesian}`);
鼠标点击位置为:(367.20001220703125, 233.00003337860107)
世界坐标:(-1296852.0512911458, 5257755.129365052, 3210992.6158761424)
Cartesian3怎么转经纬度不用说了吧
//转换为弧度
var x = Cesium.Cartographic.fromCartesian(cartesian);
console.log(x);
//弧度转经纬度
var lon = Cesium.Math.toDegrees(cartographic.longitude); // 经度
var lat = Cesium.Math.toDegrees(cartographic.latitude); // 纬度
console.log(`经度:${lon},纬度:${lat}`);
2.2 经纬度转换为其他
2.2.1 经纬度转换为弧度
//经纬度转弧度
var cartographic=Cesium.Cartographic.fromDegrees(lon,lat,height);
console.log(cartographic);
2.2.2 经纬度转换为世界坐标
Cesium.Cartesian3.fromDegrees(longitude, latitude, height, ellipsoid, result);
很明显,fromDegrees这个方法就是从经纬度转换为某某坐标系下的方法
2.2.3 经纬度转换为屏幕坐标
var c3 = Cesium.Cartesian3.fromDegrees(new Cesium.Cartesian3(100,30,500)); //笛卡尔坐标转屏幕坐标
var c2 = Cesium.SceneTransforms.wgs84ToWindowCoordinates(that.viewer.scene, c3);
console.log(c2);
原点是viewer的原点
3. 总结
我们可以画一条线
Cartesian2 -> Cartesian3 -> cartographic -> 经纬度
这条线往返转换的方法都讲了,依次转换就可以了
中间应该还有一些跳步骤的方法,比如Cesium.Cartesian3.fromDegrees(longitude, latitude, height, ellipsoid, result),经纬度直接转换为世界坐标
后面再更新
最新文章
- 【Android环境搭建】解决安装使用SDK Manager更新时的问题
- Vs2012(Vs2013) 编译 64位 Qt (动态库), 并使用自编译Qt建立工程(悲催经历)。(含遗留问题)
- 客户端调用服务端webservice的端口问题
- OpenSessionInViewFilter 的配置及作用
- mysql 权限篇
- 创建FrameWork
- centos vpn
- C Primer Plus(第五版)10
- SRM 388(1-250pt)
- Photoshop调出清晰的阴雨天气山水风景照
- Java 非静态内部类中可以定义静态变量或方法吗?
- PlantUml 使用代码画各种图
- [持续交付实践] pipeline使用:Multibranch Pipeline
- odoo开发笔记 -- 字段增加唯一约束
- 软件工程——移动的HelloWorld
- python 读取文件第一列 空格隔开的数据
- 谁说delphi没有IOCP库,delphi新的IOCP类库,开源中: DIOCP组件JSON流模块说明
- 绝对震撼 10个实用的jQuery/HTML5插件
- HHVM中文网
- LeetCode—Longest Consecutive Sequence