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

  • 相关阅读:
    wpf图片查看器,支持鼠标滚动缩放拖拽
    Python 3.x 学习笔记--杂
    Python 3.x 模块
    python 连接kafka
    Oracle问题
    Device Mapper Multipath(DM-Multipath)
    各种书籍
    Centos 6.x系统
    老男孩Python 3.x 讲义
    Python 3.x 学习笔记
  • 原文地址:https://www.cnblogs.com/CreateFree/p/11244512.html
Copyright © 2011-2022 走看看