基于vue 在平面图上画路线图 canvas

效果图:
在这里插入图片描述
**实现思路:**搜了很多都是在地图上做轨迹图,所以想到了用canvas画线,平面图是作为背景图展示,只需要提供各个巡逻点的坐标信息,就可以完成路线的绘制,具体代码中也有注释

完整代码:

<template>
  <div class="bg">
      <canvas id="mycanvas" width="1000" height="700"></canvas>
  </div>
</template>
<script>
export default {
  data() {
    return {
      pointData: [
        {
          x1: 900,
          y1: 100,
          x2: 80,
          y2: 75,
          text: '巡逻点1',
        },
        {
          x1: 80,
          y1: 75,
          x2: 200,
          y2: 300,
          text: '巡逻点2',
        },
        {
          x1: 200,
          y1: 300,
          x2: 580,
          y2: 500,
          text: '巡逻点3',
        },
        {
          x1: 580,
          y1: 500,
          x2: 900,
          y2: 100,
          text: '巡逻点4',
        },
      ],
    };
  },
  created() {
    this.doDraw();
  },
  methods: {
    doDraw() {
      // 获取canvas
      let canvas = document.getElementById('mycanvas');
      // 由于弹窗,确保已获取到
      let a = setInterval(() => {
        // 重复获取
        canvas = document.getElementById('mycanvas');
        if (!canvas) {
          return false;
        } else {
          clearInterval(a);
          // 可以理解为一个画笔,可画路径、矩形、文字、图像
          let context = canvas.getContext('2d');
          this.clearCanvas(context, canvas);
          this.pointData.forEach((item) => {
            const { x1, y1, x2, y2, text } = item;

            context.lineWidth = 3; //线条的宽度
            context.lineCap = 'round'; //线帽效果
            context.strokeStyle = 'rgb(20, 20, 235)'; //线条颜色
            context.beginPath();

            // 添加阴影
            context.shadowColor = 'rgb(20, 20, 235)';
            context.shadowOffsetX = 0;
            context.shadowOffsetY = 0;
            context.shadowBlur = 6;

            context.setLineDash([5, 10]); // [1,0]为实线

            context.moveTo(x1, y1);
            context.lineTo(x2, y2);

            //文字
            context.font = '16px Arial bolder';
            context.fillStyle = 'red';
            context.fillText(text, x1, y1);

            context.stroke();
          });
          //   绘制矩形
          //   context.strokeStyle = 'red';
          //   context.lineWidth = 3;
          //   context.strokeRect(0, 0, 300, 300);
          // 绘制线条
          //   context.moveTo(0, 0);
          //   context.lineTo(100, 50);
          //   context.strokeStyle = 'red';
          //   context.lineWidth = 3;
          //   context.stroke();
            
        }
      }, 1);
    },
    clearCanvas(ctx, canvas) {
      ctx.clearRect(0, 0, canvas.width, canvas.height);
    },
  },
};
</script>
<style lang="scss" scoped>
#mycanvas {
  border: 1px solid rgb(199, 198, 198);
}
.bg {
  width: 1000px;
  height: 700px;
  background: url('../assets/images/plat.jpg');
  background-size: 100% 100%;
}
</style>
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值