学习【Cesium】第四篇,Cesium的坐标与转换(学不会揍我)
Cesium坐標系
Cesium中常用的坐標有兩種WGS84地理坐標系和笛卡爾空間坐標系,我們平時常用的以經緯度來指明一個地點就是用的WGS84坐標,笛卡爾空間坐標系常用來做一些空間位置變換如平移旋轉縮放等等。其中,WGS84地理坐標系包括WGS84經緯度坐標系(沒有實際的對象)和WGS84弧度坐標系(Cartographic);笛卡爾空間坐標系包括笛卡爾空間直角坐標系(Cartesian3)、平面坐標系(Cartesian2),4D笛卡爾坐標系(Cartesian4)。WGS84坐標系(Cartographic)
World Geodetic System 1984,是為GPS全球定位 系統使用而建立的坐標系統,坐標原點為地球質心,其地心空間直角坐標系的Z軸指向BIH (國際時間服務機構) 1984.0定義的協議地球極(CTP)方向,X軸指向BIH 1984.0的零子午面和CTP赤道的交點,Y軸與Z軸、X軸垂直構成右手坐標系。我們平常手機上的指南針顯示的經緯度就是這個坐標系下當前的坐標,進度范圍[-180, 180]緯度范圍[-90, 90]。
?
?Cesium目前支持兩種坐標系WGS84和WebMercator,但是在Cesium中沒有 實際的對象來描述WGS84坐標,都是以弧度的方式來進行運用的也就是Cartographic類: new Cesium.Cartographic(longitude, latitude, height),這里的參數也叫longitude、latitude, 就是經度和緯度,計算方法:弧度= π/180x經緯度角度。
笛卡爾空間坐標系(Cartesian3)
直角坐標系也可以推廣至三維空間與高維空間?(higher dimension)。在原本的二維直角坐標系,再添加一個垂直于x-軸,y-軸的坐標軸,稱為z-軸。假若,這三個坐標軸滿足右手定則,則可得到三維的直角坐標系。這z-軸與x-軸,y-軸相互正交于原點。在三維空間的任何一點P,可以用直角坐標(x,y,z)來表達其位置
平面坐標系(Cartesian2)?
平面坐標系也就是平面直角坐標系,是一一個二維笛卡爾坐標系,與Cartesian3相比少 了-一個z的分量, new Cesium.Cartesian2(x, y)。Cartesian2經常用來描述屏幕坐標系,如鼠標在電腦屏幕上的點擊位置,返回的就是Cartesian2, 返回了鼠標點擊位置的xy像素點分量。
?4D笛卡爾坐標系(Cartesian4)
在《web GL編程指南》中有描述:
?
?(按照矩陣運算規則:依次用各行*各列)新的X=1*x+Tx*1;新的Y=y+Ty;新的Z=z+Tz; 最后的的一行任然為1不改變。 加入沒有紅框中的那一行的話運算就不成立
?所以可以理解為Cartesian4就是三維坐標上增加一行,使用的時候看作Cartesian3即可,在實際場景運用中基本無。
坐標轉換
1. 經緯度和弧度的轉換:
var radians=Cesium.Math.toRadians(degrees);//經緯度轉弧度var degrees=Cesium.Math.toDegrees(radians);//弧度轉經緯度2. WGS84經緯度坐標和WGS84弧度坐標系(Cartographic)的轉換:
//方法一: var longitude = Cesium.Math.toRadians(longitude1); //其中longitude1為可選經度,以弧度為單位 var latitude= Cesium.Math.toRadians(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為可選經、緯度,以弧度為單位3. 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)。
4. 通過弧度進行轉換
具體弧度原理可以參考上邊的注意事項。
var position = Cesium.Cartographic.fromDegrees(longitude, latitude, height); var positions = Cesium.Ellipsoid.WGS84.cartographicToCartesian(position); var positions = Cesium.Ellipsoid.WGS84.cartographicArrayToCartesianArray([position1,position2,position3]);5. 笛卡爾空間直角坐標系轉換為WGS84
- 直接轉換
- 間接轉換
6. 平面坐標系(Cartesian2)和笛卡爾空間直角坐標系(Cartesian3)的轉換
- 平面坐標系轉笛卡爾空間直角坐標系
? ? ? ?這里注意的是當前的點(Cartesian2)必須在三維球上,否則返回的是undefined;通過ScreenSpaceEventHandler回調會取到的坐標都是Cartesian2。 - 屏幕坐標轉場景坐標-獲取傾斜攝影或模型點擊處的坐標
? ? ? ?這里的場景坐標是包含了地形、傾斜攝影表面、模型的坐標。
? ? ? ?通過viewer.scene.pickPosition(movement.position)獲取,根據窗口坐標,從場景的深度緩沖區中拾取相應的位置,返回笛卡爾坐標。
- 屏幕坐標轉地表坐標-獲取加載地形后對應的經緯度和高程
? ? ? ?這里是地球表面的世界坐標,包含地形,不包括模型、傾斜攝影表面。
? ? ? ?通過viewer.scene.globe.pick(ray,scene)獲取,其中fay=viewer.camera.getPickRay(movement.position)。
- 笛卡爾空間直角坐標系轉平面坐標系
- 空間位置變換
? ? ? ?經緯度轉換到笛卡爾坐標系后就能運用計算機圖形學中的仿射變換知識進行空間位置變換如平移旋轉縮放。
? ? ? ?Cesium為我們提供了很有用的變換工具類:Cesium.Cartesian3(相當于Point3D)Cesium.Matrix3(3×3矩陣,用于描述旋轉變換)Cesium.Matrix4(4×4矩陣,用于描述旋轉加平移變換),Cesium.Quaternion(四元數,用于描述圍繞某個向量旋轉一定角度的變換)。
總結
以上是生活随笔為你收集整理的学习【Cesium】第四篇,Cesium的坐标与转换(学不会揍我)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 详细的渗透思路(转Mr-xn)
- 下一篇: 排列组合(两种方法)