乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       路人甲Java 2021-11-30

      前言

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

      Cesium中的坐標(biāo)系

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

      其中,WGS84地理坐標(biāo)系包括 WGS84經(jīng)緯度坐標(biāo)系(沒有實際的對象)和 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)原點為地球質(zhì)心,其地心空間直角坐標(biāo)系的Z軸指向BIH (國際時間服務(wù)機構(gòu))1984.O定義的協(xié)議地球極(CTP)方向,X軸指向BIH 1984.0的零子午面和CTP赤道的交點,Y軸與Z軸、X軸垂直構(gòu)成右手坐標(biāo)系。我們平常手機上的指南針顯示的經(jīng)緯度就是這個坐標(biāo)系下當(dāng)前的坐標(biāo),進(jìn)度范圍[-180,180],緯度范圍[-90,90]。

      WGS84坐標(biāo)系

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

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

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

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

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

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

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

      平面坐標(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)換

      通過經(jīng)緯度或弧度進(jìn)行轉(zhuǎn)換
      var position = Cesium.Cartesian3.fromDegrees(longitude, latitude, height);//其中,高度默認(rèn)值為0,可以不用填寫;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]
      
      //同理,通過弧度轉(zhuǎn)換,用法相同,具體有Cesium.Cartesian3.fromRadians,Cesium.Cartesian3.fromRadiansArray,Cesium.Cartesian3.fromRadiansArrayHeights等方法

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

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

      具體過度原理可以參考上邊的注意事項。

      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)前的點(Cartesian2)必須在三維球上,否則返回的是undefined;通過ScreenSpaceEventHandler回調(diào)會取到的坐標(biāo)都是Cartesian2。

      屏幕坐標(biāo)轉(zhuǎn)場景坐標(biāo)-獲取傾斜攝影或模型點擊處的坐標(biāo)

      這里的場景坐標(biāo)是包含了地形、傾斜攝影表面、模型的坐標(biāo)。

      通過viewer.scene.pickPosition(movement.position)獲取,根據(jù)窗口坐標(biāo),從場景的深度緩沖區(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)處沒有傾斜攝影表面、模型時,獲取的笛卡爾坐標(biāo)不準(zhǔn),此時要開啟地形深度檢測(viewer.scene.globe.depthTestAgainstTerrain = true; //默認(rèn)為false)。

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

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

      通過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);

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

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

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

      通過 viewer.scene.camera.pickEllipsoid(movement.position, ellipsoid)獲取,可以獲取當(dāng)前點擊視線與橢球面相交處的坐標(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);

      注:通過測試,此處得到的坐標(biāo)通過轉(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)系后就能運用計算機圖形學(xué)中的仿射變換知識進(jìn)行空間位置變換如平移旋轉(zhuǎn)縮放。

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

      下面舉個例子:

            一個局部坐標(biāo)為p1(x,y,z)的點,將它的局部坐標(biāo)原點放置到loc(lng,lat,alt)上,局部坐標(biāo)的z軸垂直于地表,局部坐標(biāo)的y軸指向正北,并圍繞這個z軸旋轉(zhuǎn)d度,求此時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為圍繞這個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),故填個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)原點的全局坐標(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é)

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

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多