首页 > 其他分享 >Cesium中的空间直角坐标系、经纬度、弧度之间的转换

Cesium中的空间直角坐标系、经纬度、弧度之间的转换

时间:2023-12-25 16:15:03浏览次数:28  
标签:经纬度 cartesian3 Cartesian3 直角坐标 height var 坐标 Cesium

<!DOCTYPE html>
<head>
  <title>Hello World</title>
  <script src="../Build/Cesium/Cesium.js"></script>
  <link href="../Build/Cesium/Widgets/widgets.css" rel="stylesheet" />
  <style>
    html,
    body,
    #cesiumContainer {
      width: 100%;
      height: 100%;
      margin: 0;
      padding: 0;
      overflow: hidden;
    }
  </style>
</head>
<body>
  <div id="cesiumContainer"></div>
  <script>
    var viewer = new Cesium.Viewer("cesiumContainer", {
      terrainProvider: Cesium.createWorldTerrain(),
    });

    var scene = viewer.scene;
    var ellipsoid = viewer.scene.globe.ellipsoid;

    //// 鼠标点击屏幕上一点获取该点的经纬度 ////////////////////////////////////////////////////
    var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
    handler.setInputAction((event) => {
      // 1.鼠标点击后的屏幕坐标(像素值)
      var windowPostion = event.position;

      // 2.二维屏幕坐标转为三维笛卡尔空间直角坐标(世界坐标)
      var cartesian3 = scene.globe.pick(
        viewer.camera.getPickRay(windowPostion),
        scene
      );

      // 三维笛卡尔空间直角坐标(世界坐标)转为二维屏幕坐标
      // 结果是Cartesian2对象,取出X,Y即为屏幕坐标。
      // windowPostion = Cesium.SceneTransforms.wgs84ToWindowCoordinates(
      //   scene,
      //   cartesian3
      // );

      // 3.笛卡尔空间直角坐标系转为地理坐标(弧度制)
      // var cartographic = Cesium.Cartographic.fromCartesian(cartesian3); // 方法1
      var cartographic = ellipsoid.cartesianToCartographic(cartesian3); // 方法2

      // 4.地理坐标(弧度制)转为经纬度坐标
      var lat = Cesium.Math.toDegrees(cartographic.latitude);
      var lng = Cesium.Math.toDegrees(cartographic.longitude);
      var height = cartographic.height;
      console.log(lat + "," + lng + "," + height); //单位:度,度,米

      // 经纬度转弧度
      // Cesium.Math.toRadians(lat);
    }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
    ////////////////////////////////////////////////////////////////////////////////////////////

    //// 经纬度坐标转为笛卡尔空间直角坐标系 /////////////////////////////////////////////////////
    var lng = 116.5,
      lat = 36.5,
      height = 10.0;
    // 方法1:直接转换
    // var cartesian3 = Cesium.Cartesian3.fromDegrees(lng, lat, height);

    // 方法2:借助ellipsoid对象,先转换成弧度再转换
    var cartographic = Cesium.Cartographic.fromDegrees(lng, lat, height); //单位:度,度,米
    var cartesian3 = ellipsoid.cartographicToCartesian(cartographic);
    console.log(cartesian3.x + "," + cartesian3.y + "," + cartesian3.z); //单位:米,米,米
    /////////////////////////////////////////////////////////////////////////////////////////////

    // 计算两点之间的距离(pick1、pick3都是三维坐标系下的点)
    // var distance = Cesium.Cartesian3.distance(
    //   new Cesium.Cartesian3(pick1.x, pick1.y, pick1.z),
    //   new Cesium.Cartesian3(pick3.x, pick3.y, pick3.z)
    // );

    // 问题答案算法
    var d = 45;
    var rotate = Cesium.Math.toRadians(d); //转成弧度
    //quat为围绕这个z轴旋转d度的四元数
    var quat = Cesium.Quaternion.fromAxisAngle(
      Cesium.Cartesian3.UNIT_Z,
      rotate
    );
    //rot_mat3为根据四元数求得的旋转矩阵
    var rot_mat3 = Cesium.Matrix3.fromQuaternion(quat);
    //已知p1的局部坐标
    var x1 = 20000,
      y1 = 40000,
      z1 = 10000;
    var v = new Cesium.Cartesian3(x1, y1, z1);
    // m为旋转加平移的4x4变换矩阵,这里平移为(0,0,0),故填个Cesium.Cartesian3.ZERO
    var m = Cesium.Matrix4.fromRotationTranslation(
      rot_mat3,
      Cesium.Cartesian3.ZERO
    );
    var m1 = Cesium.Matrix4.multiplyByTranslation(m, v, new Cesium.Matrix4()); // m1 = m X v  将结果存储在m1中

    // 得到局部坐标原点的全局坐标,即三位笛卡尔坐标(世界坐标)
    var lng = 117,
      lat = 37,
      height = 10;
    var cart3 = ellipsoid.cartographicToCartesian(
      Cesium.Cartographic.fromDegrees(lng, lat, height)
    );
    // m2为局部坐标的z轴垂直于地表,局部坐标的y轴指向正北的4x4变换矩阵
    var m2 = Cesium.Transforms.eastNorthUpToFixedFrame(cart3);

    // m3 = m1 X m2  将结果存储到m3中
    var m3 = Cesium.Matrix4.multiplyTransformation(
      m1,
      m2,
      new Cesium.Matrix4()
    );
    var p2 = Cesium.Matrix4.getTranslation(m3, new Cesium.Cartesian3()); // 根据最终变换矩阵m3得到p2
    console.log("x=" + p2.x + ",y=" + p2.y + ",z=" + p2.z);
  </script>
</body>

标签:经纬度,cartesian3,Cartesian3,直角坐标,height,var,坐标,Cesium
From: https://www.cnblogs.com/openmind-ink/p/17926271.html

相关文章

  • Cesium基础入门教程
    Cesium中的坐标系以及坐标转换Cesium中常用的坐标Cesium中坐标转换经纬度坐标转换成世界坐标两种方式将经纬度转换成世界坐标1.直接转换varcartesian3=Cesium.Cartesian3.fromDegrees(lng,lat,height);2.借助ellipsoid对象,先转换成弧度再进行转换varcartograp......
  • vue3调用高德地图,实现地址,经纬度填写
    父组件引用高德地图:1<template>2<divclass="wrapper">3<divclass="box">4<divclass="form-box">5<el-form6label-position="top"7:inline=&qu......
  • # cesium 截取图片
    cesium截取图片没啥好说的,直接贴代码吧 toImg(){if(viewer){viewer.scene.render();letcanvas=viewer.scene.canvas;letimage=canvas.toDataURL("image/png").replace("image/png","image/octet-stream");......
  • Cesium开发遇到的问题解决
    问题1:后台缓存收回进程无法释放上下文[/BUSINESS的缓存的[10]%-请考虑增加缓存的最大大小。原因:出现该问题是Tomcat启动时,占用的缓存较大,Tomcat默认的缓存是10000KB.解决:需要调整Tomcat目录下\conf\context.xml文件中的缓存的最大值,需要添加在<Context></Context>标签内,添加项如......
  • cesium.js入门基础教程四(事件)
    事件简介Cesium中大的事件按照类型进行分类,可以分为如下几种:鼠标键盘事件相机事件数据加载事件场景加载事件 按照事件的使用方式进行分类,可以分为如下两种:创建事件处理器Handler并指定事件触发类型定义事件,如与鼠标键盘事件相关的屏幕空间事件处理器ScreenSpaceEventH......
  • Cesium学习笔记11——坐标量测
     代码:1varannotations;2functionaxToolCoordinate(layer){3varhandler=newCesium.ScreenSpaceEventHandler(viewer.canvas);4annotations=viewer.scene.primitives.add(newCesium.LabelCollection());5handler.setInputAction(function(......
  • AM@三重积分@直角坐标系上的计算
    文章目录三重积分三重积分的计算先一后二投影方式与边界曲面的交点多于2个的情形先二后一应用例1例1-1例2例3三重积分定积分和二重积分作为和极限的概念,可以推广到三重积分三重积分的定义和二重积分类似,但是积分区域从平面闭区域,变为空间闭区域同时,三重积分会更加抽象,更加偏......
  • cesium.js入门基础教程二 (影像和标注)
    影像简介Cesium加载大的虚拟地球默认是有影像的,如图:默认使用的影像是“BingMapsAerial”:影像提供者ImageryProvider除了途中列出的一些影像,开发者可以通过Cesium中的ImagerProvider影像提供者类创建所需的影像,Cesium中提供了很多种ImageryProvider影像提供类(不包括抽象......
  • java计算二个经纬度间的距离(百度坐标)
    1:背景工作中遇到计算二个地点之间的距离,根据百度经纬度进行计算。2:maven依赖<dependency><groupId>org.gavaghan</groupId><artifactId>geodesy</artifactId><version>1.1.3</version></dependency>3:代码实现packagecom.pacific.transfe......
  • cesium.js入门基础教程
    运行环境搭建下载cesium.js从https://cesium.com/downloads/下载cesium.js:在vsCode中建立index.html和index.js,并在index.html中引入index.js:index.html:<!DOCTYPEhtml><htmllang="en"><head><!--Usecorrectcharacterset.-->&......