当前位置: 首页 > article >正文

65.在 Vue 3 中使用 OpenLayers 绘制带有箭头的线条

前言

在现代的前端开发中,地图已经成为许多项目的核心功能之一。OpenLayers 是一个强大的开源地图库,它提供了丰富的功能和高度的定制化支持。在本篇文章中,我将向大家展示如何在 Vue 3 中使用 OpenLayers 绘制带有箭头的线条。

我们将实现以下功能:

  • 在地图上动态绘制线条;
  • 在线条的每段末端添加箭头;
  • 箭头方向自动调整,以指示线条的方向。

实现效果

绘制的线条如下图所示,每段线条都带有箭头,箭头的方向与线段方向一致。


开发环境

  • Vue 版本:3.x
  • OpenLayers 版本:6.x+
  • 其他工具:Node.js、NPM

项目代码

<!--
 * @Author: 彭麒
 * @Date: 2025/1/14
 * @Email: 1062470959@qq.com
 * @Description: 此源码版权归吉檀迦俐所有,可供学习和借鉴或商用。
 -->
<template>
  <div class="container">
    <div class="w-full flex justify-center">
      <div class="font-bold text-[24px]">在Vue3中使用OpenLayers显示绘制带有箭头的线</div></div>
    <div id="vue-openlayers"></div>
  </div>
</template>

<script setup>
import 'ol/ol.css';
import { ref, onMounted } from 'vue';
import { Map, View } from 'ol';
import Tile from 'ol/layer/Tile';
import OSM from 'ol/source/OSM';
import LayerVector from 'ol/layer/Vector';
import SourceVector from 'ol/source/Vector';
import Draw from 'ol/interaction/Draw';
import Point from 'ol/geom/Point';
import { Fill, Stroke, Style, Icon } from 'ol/style';
import arrow from '@/assets/OpenLayers/arrow.png';
const map = ref(null);
const source = new SourceVector({ wrapX: false });
const draw = ref(null);

const styleFunction = (feature) => {
  const geometry = feature.getGeometry();
  const styles = [
    new Style({
      stroke: new Stroke({
        color: 'purple',
        width: 2,
      }),
    }),
  ];

  geometry.forEachSegment((start, end) => {
    const dx = end[0] - start[0];
    const dy = end[1] - start[1];
    const rotation = Math.atan2(dy, dx);

    styles.push(
      new Style({
        geometry: new Point(end),
        image: new Icon({
          src: arrow,
          anchor: [0.75, 0.5],
          rotateWithView: true,
          rotation: -rotation,
        }),
      })
    );
  });

  return styles;
};

const addInteraction = () => {
  if (draw.value) {
    map.value.removeInteraction(draw.value);
  }

  draw.value = new Draw({
    source: source,
    type: 'LineString',
  });

  map.value.addInteraction(draw.value);
};

const initMap = () => {
  const raster = new Tile({
    source: new OSM(),
  });

  const vector = new LayerVector({
    source: source,
    style: styleFunction,
  });

  map.value = new Map({
    target: 'vue-openlayers',
    layers: [raster, vector],
    view: new View({
      projection: 'EPSG:4326',
      center: [113.1206, 23.034996],
      zoom: 10,
    }),
  });

  addInteraction();
};

onMounted(() => {
  initMap();
});
</script>

<style scoped>
.container {
  width: 840px;
  height: 590px;
  margin: 50px auto;
  border: 1px solid #42B983;
}

#vue-openlayers {
  width: 800px;
  height: 470px;
  margin: 0 auto;
  border: 1px solid #42B983;
  position: relative;
}
</style>

实现说明

  1. 地图初始化:
    使用 ol/Mapol/View 初始化地图,并添加瓦片图层(OSM)。

  2. 数据源和图层:
    使用 ol/source/Vector 作为数据源,添加到矢量图层中。通过 styleFunction 实现动态样式。

  3. 绘图交互:
    使用 ol/interaction/Draw 实现用户绘制线条的功能。

  4. 箭头样式:
    每段线条的末端添加一个箭头,方向通过 Math.atan2 自动计算。


注意事项

  • 箭头图标:
    请确保您提供的箭头图标路径正确,并且图片具有透明背景。

  • 坐标系:
    示例使用 EPSG:4326 坐标系,具体可根据项目需求调整。


效果预览

完成以上代码后,运行项目,您将看到一个可交互的地图,支持绘制线条并自动添加箭头。


总结

本文介绍了如何在 Vue 3 中结合 OpenLayers 使用矢量图层和交互功能,实现绘制带箭头的线条。通过这种方法,您可以轻松实现诸如路径指示、流向显示等功能。

如果您有任何问题或更好的建议,欢迎在评论区讨论! 😊


 

如果您觉得这篇文章对您有帮助,请点赞、收藏和关注!谢谢支持! ❤️



http://www.kler.cn/a/504038.html

相关文章:

  • Winforms开发基础之非主线程操作UI控件的误区
  • 搭建Node.js后端
  • 50_Lua垃圾回收
  • fastadmin插件wanlshop使用方法
  • 【入门级】计算机网络学习
  • C#图表性能的巅峰之选:LightningChart®.NET
  • 伏羲1.0试用版(文生图)
  • 【软件工程】知识点总结(下)
  • 基于python的舆情监测管理系统
  • phpstorm jetbrain 配置review code
  • React 中事件机制详细介绍:概念与执行流程如何更好的理解
  • 软件测试 —— 自动化测试(Selenium)
  • element-ui dialog弹窗 设置点击空白处不关闭
  • 【Redis】初识Redis
  • 机器学习赋能的智能光子学器件系统研究与应用
  • Spring Boot 项目启动后自动加载系统配置的多种实现方式
  • 202305 青少年软件编程等级考试C/C++ 二级真题答案及解析(电子学会)
  • 本地服务器Docker搭建个人云音乐平台Splayer并实现远程访问告别烦人广告
  • mapbox进阶,添加绘图控件
  • NHANES数据挖掘|特征变量对死亡率预测的研究设计与分析
  • 机器学习之自助法
  • 初识算法和数据结构P1:保姆级图文详解
  • 计算机网络八股文学习笔记
  • 基于网络爬虫技术的网络新闻分析【源码+文档+部署讲解】
  • Photoshop 滤镜使用详解(全集 ·  2025版)
  • 【计算机网络】lab7 TCP协议