cesium 學習(六) 坐標轉換


cesium 學習() 坐標轉換

一、前言

  在場景中,不管是二維還好還是三維也罷,只要涉及到空間概念都會提到坐標,坐標是讓我們理解位置的一個非常有效的東西。有了坐標,我們能很快的確定位置相關關系,但是坐標有很多種,專業的說,坐標系有很多種,比如大地2000、北京54、西安80WGS84、墨卡托投影坐標系……還有各個地方的地方坐標系。如果用北京54坐標帶入到WGS84坐標中去使用,你會發現偏差的不說十萬八千里也會讓你懷疑人生!

  所以我們需要坐標轉換這個東西,把一個坐標系的坐標轉換成另一個想要的坐標系的坐標。

二、GPS坐標轉Cartesian3坐標

  Cesium提供了這兩個坐標系的轉換方法,是比較簡單的,可以直接轉換,但是有一點是Cartesian3坐標轉換成GPS坐標時,它的結果是弧度值,不是角度值,所以如果需要我們常用的GPS坐標就需要再轉換一下,將弧度轉換為角度。

//GPS轉世界坐標(x,y,z

this.GPSToWorldCoordinate = function(longtitude,latitude,height){

    var result = Cesium.Cartesian3.fromDegrees(longtitude, latitude, height);

    return result;

};

//世界坐標轉GPS坐標(角度值)[經度,緯度,高度]

this.WorldCoordinateToGPS = function(x,y,z){

    var result = Cesium.Cartographic.fromCartesian(new Cesium.Cartesian3(x,y,z));

    var arr = [result.longitude*180/Math.PI,result.latitude*180/Math.PI,result.height];

    return arr;

};

三、Transforms

  CesiumTransforms做的真的不錯,剛開始的時候我所有的坐標轉換特別是世界坐標與Matrix4的轉換,根本搞不懂,還好API講的還很清楚,不然是根本做不了坐標的一系列計算。

  對於坐標轉換,建議多看看CesiumTransforms類。里面有很多與坐標轉換相關的方法(包括屏幕坐標與世界坐標的互相轉換等),比如下面我做了一個相對坐標與世界坐標的轉換就用了Transfroms的方法。

四、本地坐標轉換世界坐標

  自己做了一個本地與世界轉換坐標的類,建立一個本地坐標,然后相互計算。

 /**

 * 相對坐標系與世界坐標系轉換,相對坐標系的軸方向由可選參數direction控制,默認是eastNorthUp北、東、上為軸線

 *

 * @param {Number} longitude 世界坐標系中的經度

 * @param {Number} latitude 世界坐標系中的緯度

 * @param {Number} height 世界坐標系中的高度

 * @param {Number} direction 坐標軸方向,值是"northEastDown","northUpEast","northWestUp","eastNorthUp"(默認)

 */

var LocalAndWorldTransform = function(longitude,latitude,height,direction){

 

    var RCSorigincenter = Cesium.Cartesian3.fromDegrees(longitude,latitude,height);

    if (direction == "northEastDown")

        this.RCSMatrix = Cesium.Transforms.northEastDownToFixedFrame(RCSorigincenter);

    else if (direction == "northUpEast")

        this.RCSMatrix = Cesium.Transforms.northUpEastToFixedFrame(RCSorigincenter);

    else if (direction == "northWestUp")

        this.RCSMatrix = Cesium.Transforms.northWestUpToFixedFrame(RCSorigincenter);

    else

        this.RCSMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(RCSorigincenter);

    this.RCSmatrixInverse = Cesium.Matrix4.inverseTransformation(this.RCSMatrix, new Cesium.Matrix4());

 

  /**

   * 相對坐標轉換成對應的世界坐標

   *

   * @param {Object} localCoordinates 相對坐標系中的坐標,如 {x:1,y:1,z:1}

   * @param {Object} result 世界坐標系中的對應坐標,XYZ格式

   * @returns

   */

  this.localToWorldCoordinates = function(localCoordinates, result){

      if (!result) {

          result = new Cesium.Cartesian3();

      }

      Cesium.Matrix4.multiplyByPoint(this.RCSMatrix, localCoordinates, result);

      return result;

  };

 

  /**

   * 世界坐標轉換成對應的相對坐標

   *

   * @param {Object} WorldCoordinates 世界坐標系中的坐標,XYZ格式

   * @param {Object} result 相對坐標系中的坐標,XYZ格式

   * @returns

   */

  this.WorldCoordinatesTolocal = function(WorldCoordinates, result){

      if (!result) {

          result = new Cesium.Cartesian3();

      }

      Cesium.Matrix4.multiplyByPoint(this.RCSmatrixInverse, WorldCoordinates, result);

      return result;

  };

};

 

五、總結

  總的來說,Cesium對於坐標轉換已經給我們做的太好了,大多時候我們直接使用即可。因為我有很多地方都用到了相對坐標與世界坐標的轉換,所以自己就做了一個公共方法。在使用中還是很方便的,實例化一個相對轉換關系對象,然后就可以互轉了(: P)。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM