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