Cesium坐标系详解

Cesium是一款用于构建地球上3D地图的开源JavaScript库。它采用WebGL技术,能够在不同的浏览器和平台上展示高性能和高质量的3D地图。作为一个3D地图API,不论是在定位、导航还是数据可视化方面,Cesium均非常优秀。本文将全面介绍Cesium坐标系,包括坐标系转换、CGCS2000坐标系、笛卡尔坐标系、模型坐标系、局部坐标系等。

一、Cesium坐标系转换

Cesium中的坐标系转换是很重要的。在Cesium中,通过viewer.scene.globe.ellipsoid.cartesianToCartographic(position)将笛卡尔坐标系的position转换成经纬度信息,便于进行地理信息的处理和可视化。相反地,通过viewer.scene.globe.ellipsoid.cartographicToCartesian(cartographic)可以将经纬度转换成笛卡尔坐标系。

//笛卡尔坐标系转经纬度信息
var position = Cesium.Cartesian3.fromDegrees(longitude, latitude, height);
var cartographic = Cesium.Cartographic.fromCartesian(position);
var longitudeStr = Cesium.Math.toDegrees(cartographic.longitude).toFixed(5);  
var latitudeStr = Cesium.Math.toDegrees(cartographic.latitude).toFixed(5);  

二、Cesium坐标系墨卡托

在使用Cesium进行地图开发时,可通过坐标系墨卡托进行横向距离的计算。Cesium提供两种墨卡托投影方式,一种是Web墨卡托投影,一种是标准墨卡托投影。它们的区别在于标准墨卡托投影比Web墨卡托投影偏右。Web墨卡托进行横向距离的计算公式为:

function getWebMeratorDist(start, end) {
    var dlat = Cesium.Math.toRadians(end.latitude - start.latitude);
    var dlon = Cesium.Math.toRadians(end.longitude - start.longitude);
    var boundary = Cesium.Math.EPSILON12;
    if (Cesium.Math.equalsEpsilon(Math.abs(dlat), boundary, 0) && Cesium.Math.equalsEpsilon(Math.abs(dlon), boundary, 0)) {
        return 0;
    }
    var a = 6378137.0;
    var k = 1.0;
    if (start.latitude !== 0.0 && (Math.abs(start.latitude) > boundary)) {
        var b = a * (1.0 - 1.0 / 298.257223563) / Math.sqrt(1.0 - Math.pow(0.0818191908425, 2) * Math.pow(Math.sin(Cesium.Math.toRadians(start.latitude)), 2));
        k = Math.cos(Cesium.Math.toRadians(start.latitude)) * (a + b) / a;
    }
    return Math.sqrt(Math.pow(k * dlat, 2) + Math.pow(k * Math.cos(Cesium.Math.toRadians(end.latitude)) * dlon, 2));
}

三、Cesium坐标系说明

Cesium使用的坐标系采用的是WGS84坐标系。这是一种基于椭球的坐标系,主要用于地球测量领域。在Cesium中,Ellipsoid类表示一个三维的椭球体,Ellipsoid.WGS84即为WGS84坐标系。

var ellipsoid = Cesium.Ellipsoid.WGS84;

四、Cesium坐标系CGCS2000

CGCS2000是中国大地坐标系2000,也是国际标准。Cesium中也提供了CGCS2000坐标系的支持。我们可以通过在 viewer.camera.lookAtTransform(mapMatrix)修改当前摄像机的姿态和视图来完成CGCS2000坐标系的展示。

var mapMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(center, ellipsoid);
viewer.camera.lookAtTransform(mapMatrix, new Cesium.Cartesian3(0.0, 0.0, height));

五、Cesium 2000坐标系

Cesium 2000坐标系是一种Cesium自定义的坐标系,在场景中默认使用。与WGS84坐标系非常接近。我们可以使用 Cesium.Transforms.preloadIcrfFixed() 来预先加载并计算 ICRF 到 固定坐标系 的变换矩阵。

Cesium.Transforms.preloadIcrfFixed();

六、Cesium笛卡尔坐标系

Cesium中采用笛卡尔坐标系来描述位置、速度和加速度等,即{x,y,z}坐标。我们可以通过Cesium.Cartesian3类来初始化笛卡尔坐标系的位置坐标,将一个经纬度转换成笛卡尔坐标系的位置,或是在笛卡尔坐标系中进行2D和3D点位操作。

var position = new Cesium.Cartesian3(x, y, z);   //初始化笛卡尔坐标系的位置坐标
var cartesian = Cesium.Cartesian3.fromDegrees(longitude, latitude, height);   //将经纬度转换成笛卡尔坐标系的位置

七、Cesium模型坐标系

在Cesium中,模型坐标系是一种相对于父级的坐标系,可以将模型放置在场景中的特定位置和角度。我们可以使用Cesium.TransformationMatrix类来创建一个矩阵变换,使一个对象相对于另一个对象进行旋转、平移和缩放。

var hh = Cesium.Transforms.headingPitchRollQuaternion(cartesian3, new Cesium.HeadingPitchRoll(heading, pitch, roll));  //旋转变换

八、Cesium局部坐标系

局部坐标系是相对于另一个对象或父级的坐标系。在Cesium中,我们可以通过Cesium.ReferenceFrame类来创建一个局部坐标系。该局部坐标系的原点是相对于父级的位置,可以在场景中的任意地方移动、旋转和缩放。

var referenceFrame = new Cesium.ReferenceFrame({
    origin: position,
    axes: [new Cesium.Cartesian3(1.0, 0.0, 0.0), new Cesium.Cartesian3(0.0, 1.0, 0.0), new Cesium.Cartesian3(0.0, 0.0, 1.0)]
});

九、Cesium默认坐标系

Cesium中默认的坐标系是俯视图的笛卡尔坐标系,即z轴垂直于地球表面。这种坐标系可以规避使得计算坐标系的方向向量时造成的所有复杂性,也比其它坐标系更容易被理解和使用。

以上就是Cesium坐标系的详细介绍。无论从坐标系转换、墨卡托投影、CGCS2000坐标系,到笛卡尔坐标系、模型坐标系、局部坐标系和默认坐标系,我们都详细讲解了相关知识点,并且提供了对应的代码示例。希望能对大家了解Cesium坐标系有所帮助。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/151409.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-11 13:41
下一篇 2024-11-11 13:41

相关推荐

  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25
  • MPU6050工作原理详解

    一、什么是MPU6050 MPU6050是一种六轴惯性传感器,能够同时测量加速度和角速度。它由三个传感器组成:一个三轴加速度计和一个三轴陀螺仪。这个组合提供了非常精细的姿态解算,其…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25
  • Java BigDecimal 精度详解

    一、基础概念 Java BigDecimal 是一个用于高精度计算的类。普通的 double 或 float 类型只能精确表示有限的数字,而对于需要高精度计算的场景,BigDeci…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25
  • git config user.name的详解

    一、为什么要使用git config user.name? git是一个非常流行的分布式版本控制系统,很多程序员都会用到它。在使用git commit提交代码时,需要记录commi…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25
  • Python安装OS库详解

    一、OS简介 OS库是Python标准库的一部分,它提供了跨平台的操作系统功能,使得Python可以进行文件操作、进程管理、环境变量读取等系统级操作。 OS库中包含了大量的文件和目…

    编程 2025-04-25

发表回复

登录后才能评论