cesium-测量距离

15 篇文章 0 订阅
12 篇文章 0 订阅

左键测量,右键结束

直接上代码,调用即可用。需要安装插件

"@turf/turf": "^6.5.0",

import * as Cesium from 'cesium'
import * as turf from "@turf/turf";
class cesiumdemo {
    container;
    viewer;
    /**
     * 
     * @param container id 容器
     */
    constructor(container:string){
        //授权
        Cesium.Ion.defaultAccessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiIzNmI0MDRkZi04NzhjLTQyYmMtYjQxOC1iNzc2MDA1MmM4ZjIiLCJpZCI6OTAwMTAsImlhdCI6MTY1MDA3NTM0MX0.mGMDeDFon6i_AOEfTs3pEq30wRCipCWL3O-bzLHswtw';
       this.container = container;
    }
    
    /**
     * 
     * @param propJson 配置对象
     */
    init(propJson:object) {
      this.viewer = new Cesium.Viewer(this.container, propJson);
       this.viewer._cesiumWidget._creditContainer.style.display = 'none'

    }
//测量面积
 measureAreaSpace(viewer, cesiumID, callback?)  {
  var points = [];
  var measureAreaSpaceEntitys = [];
  var gatherPolygon = null;

  let measureAreaSpaceHandler = new Cesium.ScreenSpaceEventHandler(
    viewer.scene.canvas
  );

  //鼠标变成加号
  document.getElementById(cesiumID).style.cursor = "crosshair";
  //   let the = this;
  // 对鼠标按下事件的监听
  measureAreaSpaceHandler.setInputAction((event) => {
    //获取加载地形后对应的经纬度和高程:地标坐标
    var ray = viewer.camera.getPickRay(event.position);
    var cartesian = viewer.scene.globe.pick(ray, viewer.scene);
    console.log(cartesian);
    if (!Cesium.defined(cartesian)) {
      return;
    }
    var point = viewer.entities.add({
      position: cartesian,
      point: {
        color: Cesium.Color.WHITE,
        pixelSize: 5,
        heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
        outlineColor: Cesium.Color.BLACK,
        outlineWidth: 1,
      },
    });
    measureAreaSpaceEntitys.push(point);
    points.push(cartesian);
    if (points.length >= 3) {
      if (gatherPolygon == null) {
        gatherPolygon = viewer.entities.add({
          polygon: {
            hierarchy: new Cesium.CallbackProperty(function (time, result) {
              var hierarchyTemp = new Cesium.PolygonHierarchy(points, null);
              return hierarchyTemp;
            }, false),
            material: Cesium.Color.GREENYELLOW.withAlpha(0.5),
          },
        });
        measureAreaSpaceEntitys.push(gatherPolygon);
      } else {
        gatherPolygon.polygon.hierarchy = new Cesium.CallbackProperty(function (
          time,
          result
        ) {
          var hierarchyTemp = new Cesium.PolygonHierarchy(points, null);
          return hierarchyTemp;
        },
        false);
      }
    }
  }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

  measureAreaSpaceHandler.setInputAction(function (rightClick) {
    var dke = gatherPolygon.polygon.hierarchy.getValue().positions;

    if (dke.length >= 3) {
      var objArr = [];
      for (var i = 0; i < dke.length; i++) {
        var ellipsoid = viewer.scene.globe.ellipsoid;
        var cartesian3 = new Cesium.Cartesian3(dke[i].x, dke[i].y, dke[i].z);
        var cartographic = ellipsoid.cartesianToCartographic(cartesian3);
        //console.log("cartographic",cartographic);
        var obj = {};
        obj.lat = Cesium.Math.toDegrees(cartographic.latitude);
        obj.lng = Cesium.Math.toDegrees(cartographic.longitude);
        objArr.push(obj);
      }
      console.log("采集的面坐标(经纬度)", objArr);

      let featuresArr = [];
      let areaXYArr = [];
      objArr.forEach((obj, index) => {
        featuresArr.push(turf.point([obj.lng, obj.lat]));
        areaXYArr.push([obj.lng, obj.lat]);
      });

      var features = turf.featureCollection(featuresArr);
      var center = turf.center(features);
      console.log("center232", center);

      let lngTemp = center.geometry.coordinates[0];
      let latTemp = center.geometry.coordinates[1];

      areaXYArr.push(areaXYArr[0]);
      console.log("areaXYArr", areaXYArr);
      var polygon = turf.polygon([areaXYArr]);
      var area = turf.area(polygon);
      console.log("area", area);
      let textDisance = "";
      if (area > 10000) {
        textDisance = (area / 1000000).toFixed(2) + "k㎡";
      } else {
        textDisance = area.toFixed(2) + "㎡";
      }

      let labelTemp = viewer.entities.add({
        position: Cesium.Cartesian3.fromDegrees(lngTemp, latTemp),
        label: {
          text: textDisance,
          font: "18px sans-serif",
          fillColor: Cesium.Color.GOLD,
          style: Cesium.LabelStyle.FILL_AND_OUTLINE,
          outlineWidth: 2,
          verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
        },
      });

      measureAreaSpaceEntitys.push(labelTemp);
      //鼠标变成加号
      document.getElementById(cesiumID).style.cursor = "default";
      //移除地图点击事件
      measureAreaSpaceHandler.removeInputAction(
        Cesium.ScreenSpaceEventType.LEFT_CLICK
      ); //移除事件
      measureAreaSpaceHandler.removeInputAction(
        Cesium.ScreenSpaceEventType.RIGHT_CLICK
      ); //移除事件
      callback(area);
    } else {
      clearMeasureAreaSpaceEntitys();
    }
  }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
};
//计算出两点距离(内部接口)
measureCenterByCartesian(from, to) {
    // 转换为Cartographic
    var carto1 = Cesium.Ellipsoid.WGS84.cartesianToCartographic(from);
    var carto2 = Cesium.Ellipsoid.WGS84.cartesianToCartographic(to);
    // 计算中心点的经纬度
    var lon = (carto1.longitude + carto2.longitude) / 2;
    var lat = (carto1.latitude + carto2.latitude) / 2;
    var center = Cesium.Cartographic.fromRadians(lon, lat);
    // 将中心点的经纬度转换回Cartesian3
    let centerPoint = Cesium.Ellipsoid.WGS84.cartographicToCartesian(center);
    return centerPoint;
  }
//测量距离
measureLineLength(viewer,cesiumID,callback?) {
    let distanceCount = 0;
    let points = [];
    let measureLineLengthEntitys = [];
    let gatherPolyline = null;
    let measureLineLengthHandler = new Cesium.ScreenSpaceEventHandler(
      viewer.canvas
    );
    //鼠标变成加号
    document.getElementById(cesiumID).style.cursor = "crosshair";
    let the = this;
    // 对鼠标按下事件的监听
    measureLineLengthHandler.setInputAction(function (event) {
      //获取加载地形后对应的经纬度和高程:地标坐标
      let ray = viewer.camera.getPickRay(event.position);
      let cartesian = viewer.scene.globe.pick(ray, viewer.scene);

      if (!Cesium.defined(cartesian)) {
        return;
      }
      let point = viewer.entities.add({
        name: "polyline_point",
        position: cartesian,
        point: {
          color: Cesium.Color.WHITE,
          pixelSize: 5,
          heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
          outlineColor: Cesium.Color.BLACK,
          outlineWidth: 1,
        },
      });
      measureLineLengthEntitys.push(point);
      points.push(cartesian);
      if (points.length >= 2) {
        //叠加线
        if (gatherPolyline == null) {
          gatherPolyline = viewer.entities.add({
            polyline: {
              positions: new Cesium.CallbackProperty(function (time, result) {
                return points;
              }, false),
              width: 10.0,
              clampToGround: true,
              material: new Cesium.PolylineGlowMaterialProperty({
                color: Cesium.Color.CHARTREUSE.withAlpha(0.5),
              }),
            },
          });
          measureLineLengthEntitys.push(gatherPolyline);
        } else {
          //CallbackProperty监听point变化值会自动set
        }
        //叠加测量点
        var distance = Cesium.Cartesian3.distance(
          points[points.length - 2],
          points[points.length - 1]
        );
        distanceCount = distanceCount + distance;
        let textDisance = "";
        if (distance > 10000) {
          textDisance = (distance / 1000).toFixed(2) + "km";
        } else {
          textDisance = distance.toFixed(2) + "m";
        }
        let centerPoint = the.measureCenterByCartesian(
          points[points.length - 2],
          points[points.length - 1]
        );
        let labelTemp = viewer.entities.add({
          position: centerPoint,
          label: {
            text: textDisance,
            font: "18px sans-serif",
            fillColor: Cesium.Color.GOLD,
            style: Cesium.LabelStyle.FILL_AND_OUTLINE,
            outlineWidth: 2,
            verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
          },
        });
        measureLineLengthEntitys.push(labelTemp);
      }
    }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

    measureLineLengthHandler.setInputAction(function (rightClick) {
      //鼠标变成加号
      document.getElementById(cesiumID).style.cursor = "default";
      measureLineLengthHandler.removeInputAction(
        Cesium.ScreenSpaceEventType.LEFT_CLICK
      );
      measureLineLengthHandler.removeInputAction(
        Cesium.ScreenSpaceEventType.RIGHT_CLICK
      );
      callback(distanceCount);
    }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
  };
 


}
export default cesiumdemo

在vue组件使用

<template>
  <div id="cesiumContainer"></div>
</template>
<script lang="ts" setup>
import { onMounted, ref, watch, onBeforeUpdate } from "vue";
import cesiumdemo from "cesiumdemo";
onMounted(() => {
let cesium = new cesiumdemo("cesiumContainer");
  cesium.init({
    homeButton: false,
    baseLayerPicker: false, //地图图层组件
    fullscreenButton: false, //全屏组件
    geocoder: false, //地理编码搜索组件
    infoBox: false, //信息框
    sceneModePicker: false, //场景模式
    selectionIndicator: false, //选取指示器组件
    timeline: false, //时间轴
    navigationHelpButton: false, //帮助按钮
    navigationInstructionsInitiallyVisible: false,
    animation: false,
    vrButton: false,
  });
const callback1 = (value) => {
    console.log("采集到的", value);
  };
  cesium.measureLineLength(cesium.viewer, "cesiumContainer", callback1);
});
</script>

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值