cesium借助 turf 工具库绘制矩形 --任意倾斜角度 --vue2.0

19 篇文章 4 订阅
  1. 流程演示在这里插入图片描述

在这里插入图片描述

2.外部引入turf

npm install @turf/turf
// 调用绘制的功能模块
import { bearingToAzimuth, point } from "@turf/helpers";
import rhumbBearing from "@turf/rhumb-bearing";
import distance from "@turf/distance";
import destination from "@turf/destination";

3.实现流程

    drawRectangle() {
      var viewer = window.map.map3D;
      this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);
      const points = [];
      let shape = this.renderRect(points);
      let step = 0;

      this.handler.setInputAction((e) => {
        let cartesian = viewer.scene.pickPosition(e.position);
        if (!Cesium.defined(cartesian)) {
          const ray = viewer.camera.getPickRay(e.position);
          cartesian = viewer.scene.globe.pick(ray, viewer.scene);
        }

        points[step] = cartesian;
        step++;

        if (step === 3) {
          this.handler.destroy();
        }
      }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

      this.handler.setInputAction((e) => {
        let cartesian = viewer.scene.pickPosition(e.startPosition);

        if (!Cesium.defined(cartesian)) {
          const ray = viewer.camera.getPickRay(e.startPosition);
          cartesian = viewer.scene.globe.pick(ray, viewer.scene);
        }

        points[2] = cartesian;
      }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
    },

    renderRect(points) {
      var viewer = window.map.map3D;
      const shape = viewer.entities.add({
        id: "Rectangle",
        polygon: {
          hierarchy: new Cesium.CallbackProperty(() => {
            if (points[0] && points[1] && points[2]) {
              const r0 = Cesium.Cartographic.fromCartesian(points[0]);
              const r1 = Cesium.Cartographic.fromCartesian(points[1]); // 辅助点
              const r2 = Cesium.Cartographic.fromCartesian(points[2]);

              const p0 = point([
                (r0.longitude * 180) / Math.PI,
                (r0.latitude * 180) / Math.PI,
              ]);
              const p1 = point([
                (r1.longitude * 180) / Math.PI,
                (r1.latitude * 180) / Math.PI,
              ]);
              const p2 = point([
                (r2.longitude * 180) / Math.PI,
                (r2.latitude * 180) / Math.PI,
              ]);
              this.rectanglePoint = p1;
              const bearing1 = rhumbBearing(p0, p1);
              const bearing2 = rhumbBearing(p0, p2);
              const angle1 = bearing2 - bearing1;
              // 对角长度
              const length = distance(p0, p2, { units: "miles" });

              const len1 = Math.cos((angle1 / 180) * Math.PI) * length;
              const dest1 = destination(p0, len1, bearing1, { units: "miles" });

              const angle2 = 90 - angle1;
              const len2 = Math.cos((angle2 / 180) * Math.PI) * length;
              const dest2 = destination(p0, len2, 90 + bearing1, {
                units: "miles",
              });

              const coordinates = [
                points[0],
                Cesium.Cartesian3.fromDegrees(...dest1.geometry.coordinates),
                points[2],
                Cesium.Cartesian3.fromDegrees(...dest2.geometry.coordinates),
              ];
              return new Cesium.PolygonHierarchy(coordinates);
            }
          }, false),
        },
      });
      return shape;
    },
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值