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)。