zoukankan      html  css  js  c++  java
  • 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)。

  • 相关阅读:
    加入创业公司有什么利弊
    Find Minimum in Rotated Sorted Array II
    Search in Rotated Sorted Array II
    Search in Rotated Sorted Array
    Find Minimum in Rotated Sorted Array
    Remove Duplicates from Sorted Array
    Spiral Matrix
    Spiral Matrix II
    Symmetric Tree
    Rotate Image
  • 原文地址:https://www.cnblogs.com/CreateFree/p/11244512.html
Copyright © 2011-2022 走看看