cesium 常见坐标系及坐标转换(工具篇)

ceisum里面的常见坐标系包括

1.屏幕坐标

2.世界坐标(笛卡尔直角坐标)

3.经纬度,可以是弧度形式和度的形式

4.WebMercator web墨卡托

5.欧拉角

6.四元数

看一张我自己画的图,整理了他们之间的关系


下面提供坐标转换的代码 github地址 


/*

 * @Description: 坐标转换工具,下面的坐标转换默认都是基于WGS84 椭球体

 */

class Degrees {

    constructor(longitude, latitude, height = 0) {

        this.longitude = longitude;

        this.latitude = latitude;

        this.height = height;

    }

}

Cesium.Degrees = Degrees;//不建议这样直接修改Cesium原始对象

class Tramsform {

    /** 

     * @description: 弧度转度

     * @param {Number} value 

     * @return {Number} 

     */

    toDegrees(value) {

        return Cesium.Math.toDegrees(value)

    }

    /**

     * @description: 度转弧度

     */

    toRadians(value) {

        return Cesium.Math.toRadians(value)

    }

    /**

     * @description: 经纬度(度)转世界坐标

     * @param {Degrees} degrees.longitude 经度 degrees.latitude 纬度 degrees.height高度

     * @return {Cartesian3} 世界坐标

     */

    degreesToCartesian(degrees) {

        return Cesium.Cartesian3.fromDegrees(degrees.longitude, degrees.latitude, degrees.height)

    }

    /*

    * @description: 世界坐标转 经纬度(度)

    * @param {Cartesian3} cartesian 世界坐标

    * @return {Cartographic}  返回转换之后的经纬度

    */

    degreesFromCartesian(cartesian) {

        let cartographic = this.cartographicFromCartesian(cartesian);

        return this.degreesFromCartographic(cartographic);

    }

    /*

   * @description: 经纬度(度)转经纬度(弧度)

   * @param {*} degrees

   * @return {*}

   */

    degreesToCartographic(degrees) {

        degrees.longitude = this.toRadians(degrees.longitude);

        degrees.latitude = this.toRadians(degrees.latitude);

        return degrees;

    }

    /**

     * @description: 经纬度(弧度)转经纬度(度)

     * @param {Cartographic} cartographic

     * @return {*} 返回经纬度(度)

     */

    degreesFromCartographic(cartographic) {

        cartographic.longitude = this.toDegrees(cartographic.longitude);

        cartographic.latitude = this.toDegrees(cartographic.latitude);

        return cartographic;

    }

    /** 

     * @description: 经纬度(度)坐标转web墨卡托坐标

     * @param {Cartographic} degrees

     * @return {Cartesian3} web墨卡托坐标

     */

    degreesToWebMercatorProjection(degrees) {

        var webMercatorProjection = new Cesium.WebMercatorProjection();

        return webMercatorProjection.project(this.degreesToCartesian(degrees))

    }

    /** 

     * @description: web墨卡托转经纬度(度)

     * @param {Cartesian3} cartesian

     * @return {Cartographic} 经纬度(度)坐标

     */

    degreesFromWebMercatorProjection(cartesian) {

        var webMercatorProjection = new Cesium.WebMercatorProjection();

        return this.degreesFromCartographic(webMercatorProjection.unproject(cartesian))

    }

    /**

     * @description: 弧度坐标转世界坐标

     * @param {Cartographic}   cartographic.longitude 经度

     * @param {Cartographic}   cartographic.latitude 纬度

     * @param {Cartographic}   cartographic.height 高度

     * @return {Cartesian3} 世界坐标

     */

    cartographicToCartesian(cartographic) {

        return Cesium.Cartographic.toCartesian(cartographic)

    }

    /**

     * @description: 世界坐标转经纬度弧度

     * @param {Cartesian3} cartesian 世界坐标

     * @return {Cartographic}  返回转换之后的经纬度弧度坐标

     */

    cartographicFromCartesian(cartesian) {

        return Cesium.Cartographic.fromCartesian(cartesian)

    }

    /**

     * @description: 经纬度度转经纬度弧度

     * @param {Degrees} degrees.longitude 经度 degrees.latitude 纬度 degrees.height高度

     * @return {*}

     */

    cartographicFromDegrees(degrees) {

        return this.degreesToCartographic(degrees)

    }

    /**

       * @description: 经纬度(弧度)转经纬度(度)

       * @param {Cartographic} cartographic

       * @return {*} 返回经纬度(度)

       */

    cartographicToDegrees(cartographic) {

        return this.degreesFromCartographic(cartographic)

    }

    /** 

     * @description: 经纬度(弧度)坐标转web墨卡托坐标

     * @param {Cartographic} cartographic

     * @return {Cartesian3} web墨卡托坐标

     */

    cartographicToWebMercatorProjection(cartographic) {

        var webMercatorProjection = new Cesium.WebMercatorProjection();

        return webMercatorProjection.project(cartographic)

    }

    /** 

     * @description: web墨卡托转经纬度(弧度)

     * @param {Cartesian3} cartesian

     * @return {Cartographic} 弧度坐标

     */

    cartographicFromWebMercatorProjection(cartesian) {

        var webMercatorProjection = new Cesium.WebMercatorProjection();

        return webMercatorProjection.unproject(cartesian)

    }

    /*

   * @description: 世界坐标转 经纬度(度)

   * @param {Cartesian3} cartesian 世界坐标

   * @return {Cartographic}  返回转换之后的经纬度

   */

    cartesianToDegrees(cartesian) {

        return this.degreesFromCartesian(cartesian)

    }

    /**

  * @description: 经纬度(度)转世界坐标

  * @param {Degrees} degrees.longitude 经度 degrees.latitude 纬度 degrees.height高度

  * @return {Cartesian3} 世界坐标

  */

    cartesianFormDegrees(degrees) {

        return this.degreesToCartesian(degrees)

    }

    /**

    * @description: 世界坐标转经纬度(弧度)

    * @param {Cartesian3} cartesian 世界坐标

    * @return {Cartographic}  返回转换之后的经纬度弧度坐标

    */

    cartesianToCartographic(cartesian) {

        return this.cartographicFromCartesian(cartesian)

    }

    /**

   * @description: 弧度坐标转世界坐标

   * @param {Cartographic}  cartographic.longitude 经度

   * @param {Cartographic}  cartographic.latitude 纬度

   * @param {Cartographic}  cartographic.height 高度

   * @return {Cartesian3} 世界坐标

   */

    cartesianFromCartographic(cartographic) {

        return this.cartographicToCartesian(cartographic)

    }

    /**

         * @description: 世界坐标坐标转web墨卡托坐标

         * @param {Cartographic} degrees

         * @return {Cartesian3} web墨卡托坐标

         */

    cartesianToWebMercatorProjection(cartesian) {

        var webMercatorProjection = new Cesium.WebMercatorProjection();

        return webMercatorProjection.project(this.cartesianToCartographic(cartesian))

    }

    /** 

     * @description: web墨卡托转世界坐标

     * @param {Cartesian3} cartesian

     * @return {Cartographic} 世界坐标

     */

    cartesianFromWebMercatorProjection(cartesian) {

        var webMercatorProjection = new Cesium.WebMercatorProjection();

        return this.cartesianFromCartographic(webMercatorProjection.unproject(cartesian))

    }

    /** 

     * @description: 世界坐标转屏幕坐标

     * @param {Cartesian3} cartesian

     * @return {Cartesian2} 屏幕坐标

     */

    cartesianToWindowCoordinates(scene, cartesian) {

        return Cesium.SceneTransforms.wgs84ToWindowCoordinates(scene, cartesian)

    }

    /** 

     * @description: 从4*4矩阵中得到平移位置

     * @param {Matrix4} mat4 4*4矩阵

     * @return {Cartesian3} 返回位置信息

     */

    getTranslationFromMatrix4(mat4, result) {

        if (!result) result = new Cesium.Cartesian3();

        return Cesium.Matrix4.getTranslation(mat4, result)

    }

    /** 

     * @description: 返回x,y,z方向的比例尺信息

     * @param {Matrix4} mat4 4*4矩阵

     * @param {Cartesian3} result 用于储存结果

     * @return {Cartesian3} 返回x,y,z方向的比例尺信息

     */

    getScaleFromMatrix4(mat4, result) {

        if (!result) result = new Cesium.Cartesian3();

        return Cesium.Matrix4.getScale(mat4, result)

    }

    /** 

     * @description: 将3*3旋转矩阵转换成齐次坐标

     * @param {Matrix4} matrix 3*3矩阵

     * @param {Quaternion} result 储存结果

     * @return {Quaternion} 返回齐次坐标

     */

    quaternionFromRotationMatrix(matrix, result) {

        return Cesium.Quaternion.fromRotationMatrix(matrix, result)

    }

    /** 

     * @description: 将欧拉角转成齐次坐标

     * @param {HeadingPitchRoll} headingPitchRoll

     * @param {Quaternion} result 储存结果

     * @return {Quaternion} 返回齐次坐标

     */

    quaternionfromHeadingPitchRoll(headingPitchRoll, result) {

        return Cesium.Quaternion.fromHeadingPitchRoll(headingPitchRoll, result)

    }

    /** 

     * @description: 将齐次坐标转成欧拉角表示,和quaternionfromHeadingPitchRoll方法互逆

     * @param {Quaternion} quaternion 齐次坐标

     * @param {HeadingPitchRoll} result  储存结果

     * @return {HeadingPitchRoll} 返回欧拉角

     */

    headingPitchRollFromQuaternion(quaternion, result) {

        return Cesium.HeadingPitchRoll.fromQuaternion(quaternion, result)

    }

    /**

     * @description: 从4*4矩阵中得到欧拉角

     * @param {Matrix4} transform 4*4矩阵

     * @param {Ellipsoid} ellipsoid 84椭球体

     * @param {Transforms.LocalFrameToFixedFrame} fixedFrameTransform 参考系,默认东-北-上参考系

     * @param {HeadingPitchRoll} result 储存结果

     * @return {HeadingPitchRoll}

     */

    fixedFrameToHeadingPitchRoll(transform, ellipsoid, fixedFrameTransform, result) {

        return Cesium.Transforms.fixedFrameToHeadingPitchRoll(transform, ellipsoid, fixedFrameTransform, result)

    }

    /** 

     * @description: 将欧拉角转成3*3矩阵

     * @param {HeadingPitchRoll} headingPitchRoll

     * @param {Matrix3} result 储存结果

     * @return {Matrix3} 返回一个3*3矩阵

     */

    matrixFromHeadingPitchRoll(headingPitchRoll, result) {

        return Cesium.Matrix3.fromHeadingPitchRoll(headingPitchRoll, result)

    }

    /** 

     * @description: 根据东-北-上方向参考系生成4*4矩阵,已知道地球上的某个位置,可以根据这个方法生成一个4*4矩阵

     * @param {Cartesian3} origin 原点坐标

     * @param {Ellipsoid} ellipsoid 84椭球体

     * @param {Matrix4} result 储存结果

     * @return {Matrix4} 返回4*4矩阵

     */

    eastNorthUpToFixedFrame(origin, ellipsoid, result) {

        return Cesium.Transforms.eastNorthUpToFixedFrame(origin, ellipsoid, result)

    }

    /** 

     * @description: 根据原点和欧拉角生成4*4矩阵

     * @param {Cartesian3} origin 原点坐标

     * @param {HeadingPitchRoll} headingPitchRoll 欧拉角

     * @param {Ellipsoid} ellipsoid

     * @param {Transforms.LocalFrameToFixedFrame} fixedFrameTransform 参考系,默认为东-北-上参考系

     * @param {Matrix4} result 储存结果

     * @return {Matrix4} 返回4*4矩阵

     */

    headingPitchRollToFixedFrame(origin, headingPitchRoll, ellipsoid, fixedFrameTransform, result) {

        return Cesium.Transforms.headingPitchRollToFixedFrame(origin, headingPitchRoll, ellipsoid, fixedFrameTransform, result)

    }

}






©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,695评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,569评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,130评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,648评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,655评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,268评论 1 309
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,835评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,740评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,286评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,375评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,505评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,873评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,357评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,466评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,921评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,515评论 2 359

推荐阅读更多精彩内容