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-hk/n/151409.html