日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Cesium坐標(biāo)系及坐標(biāo)轉(zhuǎn)換詳解

 路人甲Java 2021-11-30

前言

Cesium項(xiàng)目中經(jīng)常涉及到模型加載、瀏覽以及不同數(shù)據(jù)之間的坐標(biāo)轉(zhuǎn)換,弄明白Cesium中采用的坐標(biāo)系以及各個(gè)坐標(biāo)系之間的轉(zhuǎn)換,是我們邁向三維GIS大門的前提,本文詳細(xì)的介紹了Cesium中采用的兩大坐標(biāo)系以及之間轉(zhuǎn)換的各種方法。

Cesium中的坐標(biāo)系

Cesium中常用的坐標(biāo)有兩種WGS84地理坐標(biāo)系和笛卡爾空間坐標(biāo)系,我們平時(shí)常用的以經(jīng)緯度來(lái)指明一個(gè)地點(diǎn)就是用的WGS84坐標(biāo),笛卡爾空間坐標(biāo)系常用來(lái)做一些空間位置變換如平移旋轉(zhuǎn)縮放等等。二者的聯(lián)系如下圖。

其中,WGS84地理坐標(biāo)系包括 WGS84經(jīng)緯度坐標(biāo)系(沒(méi)有實(shí)際的對(duì)象)和 WGS84弧度坐標(biāo)系(Cartographic);

         笛卡爾空間坐標(biāo)系包括 笛卡爾空間直角坐標(biāo)系(Cartesian3)、平面坐標(biāo)系(Cartesian2),4D笛卡爾坐標(biāo)系(Cartesian4)。

WGS84坐標(biāo)系

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.O定義的協(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]。

WGS84坐標(biāo)系

Cesium目前支持兩種坐標(biāo)系WGS84和WebMercator,但是在Cesium中沒(méi)有實(shí)際的對(duì)象來(lái)描述WGS84坐標(biāo),都是以弧度的方式來(lái)進(jìn)行運(yùn)用的也就是Cartographic類:

new Cesium.Cartographic(longitude, latitude, height),這里的參數(shù)也叫l(wèi)ongitude、latitude,就是經(jīng)度和緯度,計(jì)算方法:弧度= π/180×經(jīng)緯度角度。

 笛卡爾空間直角坐標(biāo)系(Cartesian3)

笛卡爾空間坐標(biāo)的原點(diǎn)就是橢球的中心,我們?cè)谟?jì)算機(jī)上進(jìn)行繪圖時(shí),不方便使用經(jīng)緯度直接進(jìn)行繪圖,一般會(huì)將坐標(biāo)系轉(zhuǎn)換為笛卡爾坐標(biāo)系,使用計(jì)算機(jī)圖形學(xué)中的知識(shí)進(jìn)行繪圖。這里的Cartesian3,有點(diǎn)類似于三維系統(tǒng)中的Point3D對(duì)象,new Cesium.Cartesian3(x, y, z),里面三個(gè)分量x、y、z。

笛卡爾空間直角坐標(biāo)系

平面坐標(biāo)系(Cartesian2)

平面坐標(biāo)系也就是平面直角坐標(biāo)系,是一個(gè)二維笛卡爾坐標(biāo)系,與Cartesian3相比少了一個(gè)z的分量,new Cesium.Cartesian2(x, y)。Cartesian2經(jīng)常用來(lái)描述屏幕坐標(biāo)系,比如鼠標(biāo)在電腦屏幕上的點(diǎn)擊位置,返回的就是Cartesian2,返回了鼠標(biāo)點(diǎn)擊位置的xy像素點(diǎn)分量。

平面坐標(biāo)系

坐標(biāo)轉(zhuǎn)換

經(jīng)緯度和弧度的轉(zhuǎn)換

var radians=Cesium.Math.toRadians(degrees);//經(jīng)緯度轉(zhuǎn)弧度
var degrees=Cesium.Math.toDegrees(radians);//弧度轉(zhuǎn)經(jīng)緯度

WGS84經(jīng)緯度坐標(biāo)和WGS84弧度坐標(biāo)系(Cartographic)的轉(zhuǎn)換

//方法一:
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為弧度

WGS84坐標(biāo)系和笛卡爾空間直角坐標(biāo)系(Cartesian3)的轉(zhuǎn)換

通過(guò)經(jīng)緯度或弧度進(jìn)行轉(zhuǎn)換
var position = Cesium.Cartesian3.fromDegrees(longitude, latitude, height);//其中,高度默認(rèn)值為0,可以不用填寫(xiě);longitude和latitude為角度

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]

//同理,通過(guò)弧度轉(zhuǎn)換,用法相同,具體有Cesium.Cartesian3.fromRadians,Cesium.Cartesian3.fromRadiansArray,Cesium.Cartesian3.fromRadiansArrayHeights等方法

注意:上述轉(zhuǎn)換函數(shù)中最后均有一個(gè)默認(rèn)參數(shù)ellipsoid(默認(rèn)值為Ellipsoid.WGS84)。

通過(guò)過(guò)度進(jìn)行轉(zhuǎn)換

具體過(guò)度原理可以參考上邊的注意事項(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]);

笛卡爾空間直角坐標(biāo)系轉(zhuǎn)換為WGS84

直接轉(zhuǎn)換
var cartographic= Cesium.Cartographic.fromCartesian(cartesian3);

轉(zhuǎn)換得到WGS84弧度坐標(biāo)系后再使用經(jīng)緯度和弧度的轉(zhuǎn)換,進(jìn)行轉(zhuǎn)換到目標(biāo)值

間接轉(zhuǎn)換
var cartographic = Cesium.Ellipsoid.WGS84.cartesianToCartographic(cartesian3);
var cartographics = Cesium.Ellipsoid.WGS84.cartesianArrayToCartographicArray([cartesian1,cartesian2,cartesian3]);

平面坐標(biāo)系(Cartesian2)和笛卡爾空間直角坐標(biāo)系(Cartesian3)的轉(zhuǎn)換

平面坐標(biāo)系轉(zhuǎn)笛卡爾空間直角坐標(biāo)系

這里注意的是當(dāng)前的點(diǎn)(Cartesian2)必須在三維球上,否則返回的是undefined;通過(guò)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)。

通過(guò)viewer.scene.pickPosition(movement.position)獲取,根據(jù)窗口坐標(biāo),從場(chǎng)景的深度緩沖區(qū)中拾取相應(yīng)的位置,返回笛卡爾坐標(biāo)。

var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (movement) {
     var position = viewer.scene.pickPosition(movement.position);
     console.log(position);
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

注:若屏幕坐標(biāo)處沒(méi)有傾斜攝影表面、模型時(shí),獲取的笛卡爾坐標(biāo)不準(zhǔn),此時(shí)要開(kāi)啟地形深度檢測(cè)(viewer.scene.globe.depthTestAgainstTerrain = true; //默認(rèn)為false)。

屏幕坐標(biāo)轉(zhuǎn)地表坐標(biāo)-獲取加載地形后對(duì)應(yīng)的經(jīng)緯度和高程

這里是地球表面的世界坐標(biāo),包含地形,不包括模型、傾斜攝影表面。

通過(guò)viewer.scene.globe.pick(ray, scene)獲取,其中ray=viewer.camera.getPickRay(movement.position)。

var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (movement) {
     var ray = viewer.camera.getPickRay(movement.position);
     var position = viewer.scene.globe.pick(ray, viewer.scene);
     console.log(position);
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

注:通過(guò)測(cè)試,此處得到的坐標(biāo)通過(guò)轉(zhuǎn)換成wgs84后,height的為該點(diǎn)的地形高程值。

屏幕坐標(biāo)轉(zhuǎn)橢球面坐標(biāo)-獲取鼠標(biāo)點(diǎn)的對(duì)應(yīng)橢球面位置

這里的橢球面坐標(biāo)是參考橢球的WGS84坐標(biāo)(Ellipsoid.WGS84),不包含地形、模型、傾斜攝影表面。

通過(guò) viewer.scene.camera.pickEllipsoid(movement.position, ellipsoid)獲取,可以獲取當(dāng)前點(diǎn)擊視線與橢球面相交處的坐標(biāo),其中ellipsoid是當(dāng)前地球使用的橢球?qū)ο螅簐iewer.scene.globe.ellipsoid,默認(rèn)為Ellipsoid.WGS84。

var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (movement) {
     var position = viewer.scene.camera.pickEllipsoid(movement.position, viewer.scene.globe.ellipsoid);
     console.log(position);
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

注:通過(guò)測(cè)試,此處得到的坐標(biāo)通過(guò)轉(zhuǎn)換成wgs84后,height的為0(此值應(yīng)該為地表坐標(biāo)減去地形的高程)。

笛卡爾空間直角坐標(biāo)系轉(zhuǎn)平面坐標(biāo)系

var cartesian2= Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene,cartesian3)

空間位置變換

經(jīng)緯度轉(zhuǎn)換到笛卡爾坐標(biāo)系后就能運(yùn)用計(jì)算機(jī)圖形學(xué)中的仿射變換知識(shí)進(jìn)行空間位置變換如平移旋轉(zhuǎn)縮放。

Cesium為我們提供了很有用的變換工具類:Cesium.Cartesian3(相當(dāng)于Point3D)Cesium.Matrix3(3x3矩陣,用于描述旋轉(zhuǎn)變換)Cesium.Matrix4(4x4矩陣,用于描述旋轉(zhuǎn)加平移變換),Cesium.Quaternion(四元數(shù),用于描述圍繞某個(gè)向量旋轉(zhuǎn)一定角度的變換)。

下面舉個(gè)例子:

      一個(gè)局部坐標(biāo)為p1(x,y,z)的點(diǎn),將它的局部坐標(biāo)原點(diǎn)放置到loc(lng,lat,alt)上,局部坐標(biāo)的z軸垂直于地表,局部坐標(biāo)的y軸指向正北,并圍繞這個(gè)z軸旋轉(zhuǎn)d度,求此時(shí)p1(x,y,z)變換成全局坐標(biāo)笛卡爾坐p2(x1,y1,z1)是多少?

var rotate = Cesium.Math.toRadians(d);//轉(zhuǎn)成弧度
var quat = Cesium.Quaternion.fromAxisAngle(Cesium.Cartesian3.UNIT_Z, rotate); //quat為圍繞這個(gè)z軸旋轉(zhuǎn)d度的四元數(shù)
var rot_mat3 = Cesium.Matrix3.fromQuaternion(quat);//rot_mat3為根據(jù)四元數(shù)求得的旋轉(zhuǎn)矩陣
var v = new Cesium.Cartesian3(x, y, z);//p1的局部坐標(biāo)
var m = Cesium.Matrix4.fromRotationTranslation(rot_mat3, Cesium.Cartesian3.ZERO);//m為旋轉(zhuǎn)加平移的4x4變換矩陣,這里平移為(0,0,0),故填個(gè)Cesium.Cartesian3.ZERO
m = Cesium.Matrix4.multiplyByTranslation(m, v);//m = m X v
var cart3 = ellipsoid.cartographicToCartesian(Cesium.Cartographic.fromDegrees(lng, lat, alt)); //得到局部坐標(biāo)原點(diǎn)的全局坐標(biāo)
var m1 = Cesium.Transforms.eastNorthUpToFixedFrame(cart3);//m1為局部坐標(biāo)的z軸垂直于地表,局部坐標(biāo)的y軸指向正北的4x4變換矩陣
m = Cesium.Matrix4.multiplyTransformation(m, m1);//m = m X m1
var p2 = Cesium.Matrix4.getTranslation(m);//根據(jù)最終變換矩陣m得到p2
console.log('x=' + p2.x + ',y=' + p2.y + ',z=' + p2.z );

總結(jié)

通過(guò)本文,介紹了各個(gè)坐標(biāo)系間的轉(zhuǎn)換問(wèn)題,在具體項(xiàng)目中,可結(jié)合實(shí)際需求,靈活組合解決具體的實(shí)際問(wèn)題。注意,博文是參照網(wǎng)上相關(guān)博客及結(jié)合自己的實(shí)踐總結(jié)得來(lái),希望本文對(duì)你有所幫助,后續(xù)會(huì)更新更多內(nèi)容,感興趣的朋友可以加關(guān)注,歡迎留言交流!

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多