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/zh-hant/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

發表回復

登錄後才能評論