• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

cesium工具-测距和测面-原理和代码

武飞扬头像
哈哈地图
帮助1

测距分为:空间距离和贴地距离;

测面积分为:水平面积和贴地面积。

下面讲解这4个工具的相关思路和代码:

1、空间距离
学新通

思路:

Cesium.Cartesian3.distance()计算出两点之间的距离

一条线上的所有点,每2个点依次计算距离,汇总之后得到总长度。

代码:

  1.  
    let lengthAll = 0;
  2.  
    for (let i = 0; i < arrPosCartesian3.length - 1; i ) {
  3.  
    let cartesianFirst = arrPosCartesian3[i];
  4.  
    let cartesianSecond = arrPosCartesian3[i 1];
  5.  
    let lengthSegment = Cesium.Cartesian3.distance(
  6.  
    cartesianFirst,
  7.  
    cartesianSecond
  8.  
    );
  9.  
    lengthAll = lengthSegment;
  10.  
    }
  11.  
    return lengthAll;
2、贴地距离
学新通

思路:

1、Cesium.Cartesian3.lerp()根据点击的所有点,在中间插值出多个点

2、对于插值点,获取实际对应的高度点后,计算距离来作为贴地距离

代码:

  1.  
    let step = 1; //抽稀的时候用
  2.  
    for (let i = 0; i < arrCartoClamped.length - 2; i = step) {
  3.  
    let cartoStart = arrCartoClamped[i];
  4.  
    let cartoEnd = arrCartoClamped[i step];
  5.  
     
  6.  
    cartoStart.height = globe.getHeight(cartoStart);
  7.  
    cartoEnd.height = globe.getHeight(cartoEnd);
  8.  
    let lengthOf2Point = CartographicUtil.getDistanceFrom2Cartographic(
  9.  
    cartoStart,
  10.  
    cartoEnd
  11.  
    );
  12.  
    lengthALl = lengthOf2Point;
  13.  
    }
3、水平面积
学新通

思路:

面也是一个点、一个点的单击出来的

学新通

如上图,依次点击1、2、3、4、5共五个点,形成了一个多边形

计算面积就是依次对所有三角形的面积求和

即:

三角形1、2、3

三角形1、3、4

三角形1、4、5

上述所有三角形的面积和就是多边形的面积。

三角形面积,可以使用叉积来求得

代码:

  1.  
    function getAreaFromArrayCartesians(arrCartesian3) {
  2.  
    let areaAll = 0;
  3.  
    let cartesianFirst = arrCartesian3[0];
  4.  
    for (let i = 1; i < arrCartesian3.length - 1; i ) {
  5.  
    let cartesianStart = arrCartesian3[i];
  6.  
    let cartesianEnd = arrCartesian3[i 1];
  7.  
    let vecStart = Cesium.Cartesian3.subtract(
  8.  
    cartesianStart,
  9.  
    cartesianFirst,
  10.  
    new Cesium.Cartesian3()
  11.  
    );
  12.  
    let vecEnd = Cesium.Cartesian3.subtract(
  13.  
    cartesianEnd,
  14.  
    cartesianFirst,
  15.  
    new Cesium.Cartesian3()
  16.  
    );
  17.  
    let vecCross = Cesium.Cartesian3.cross(
  18.  
    vecStart,
  19.  
    vecEnd,
  20.  
    new Cesium.Cartesian3()
  21.  
    );
  22.  
    let areaTriangle = Cesium.Cartesian3.magnitude(vecCross) * 0.5;
  23.  
    areaAll = areaTriangle;
  24.  
    }
  25.  
    return areaAll;
  26.  
    }
学新通
4、贴地面积
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgafhik
系列文章
更多 icon
同类精品
更多 icon
继续加载