1. 程式人生 > >cesium 學習(六) 座標轉換

cesium 學習(六) 座標轉換

cesium 學習(六) 座標轉換

一、前言

  在場景中,不管是二維還好還是三維也罷,只要涉及到空間概念都會提到座標,座標是讓我們理解位置的一個非常有效的東西。有了座標,我們能很快的確定位置相關關係,但是座標有很多種,專業的說,座標系有很多種,比如大地2000、北京54、西安80、WGS84、墨卡託投影座標系……還有各個地方的地方座標系。如果用北京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

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

  對於座標轉換,建議多看看Cesium的Transforms類。裡面有很多與座標轉換相關的方法(包括螢幕座標與世界座標的互相轉換等),比如下面我做了一個相對座標與世界座標的轉換就用了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)。

&n