openlayers+vite+vue3实现在地图上画线(四)

news2024/12/15 3:01:44

在前几期实现离线地图初始化以及规划某一特定区域、打点、出现弹窗的基础上,本文主要阐述如何实现在所规划的区域地图上画线,如果你实现了打点的效果,其实这个相对来说还是算比较简单的,因为和打点的代码大差不差。使用openlayers这个技术研究的内容挺多,这个就需要自己多去专研专研了。

提示:因本文实现的具体效果部分涉及到前面文章的知识点,如有不明白的小伙伴可进行查看前几期的文章哦,文章的的实现流程也是按照步骤来的,但是打点和画线不分先后顺序,由于前几期已经阐述过地图初始化这些具体步骤,所以这篇文章不在进行具体代码的演示,只展示需要实现画线的代码。

目录

一、模拟传入的画线数据

二、实现画线方法

1.计算两个中心点

2.设置线条样式

3.遍历线条数据

4.设置线条数据源和线条图层

5.将线条图层添加到地图

 6.整合所有代码

三、初始化地图中调用画线方法


一、模拟传入的画线数据

因为考虑到做项目可能地图的画线数据来于后端,这里就简单模拟一下具体画线的后端数据格式,方便能正常显示地图上的线。强调一下这个数据只是为了便于前端正常查看,若正常做项目,数据应该是后端传给前端,这里的type是为了便于区分线条的颜色,如果项目中没有这项要求,可无需考虑,lineData中是经纬度的数据。

const lines = ref([
  {
    type: '500',
    lineData: [
      {
        lon: 120.303543,
        lat: 31.681019
      },
      {
        lon: 120.266053,
        lat: 31.550228
      }
    ]
  },
  {
    type: '220',
    lineData: [
      {
        lon: 120.296595,
        lat: 31.550228
      },
      {
        lon: 120.275891,
        lat: 31.910984
      }
    ]
  },
  {
    type: '500',
    lineData: [
      {
        lon: 120.303543,
        lat: 31.681019
      },
      {
        lon: 120.266053,
        lat: 31.550228
      }
    ]
  },
  {
    type: '220',
    lineData: [
      {
        lon: 120.296595,
        lat: 31.550228
      },
      {
        lon: 120.275891,
        lat: 31.910984
      }
    ]
  }
])

二、实现画线方法

1.计算两个中心点

为了使所画的线至于两个点的中心,这个写了一个计算两个中心的方法。后续在画线方法中进行使用即可。

const getMidPoint = (point1, point2) => {
  const lon1 = point1[0]
  const lat1 = point1[1]
  const lon2 = point2[0]
  const lat2 = point2[1]
  const deltaLon = (lon2 - lon1) / 2
  const deltaLat = (lat2 - lat1) / 2
  return [lon1 + deltaLon, lat1 + deltaLat]
}

2.设置线条样式

设置线条的具体样式,因为可能线条的颜色会不一样,所以这里将颜色图标作为变量。

// 线样式
  const getLineStyle = color => {
    return new Style({
      stroke: new Stroke({
        color: color,
        width: 1.5
      })
    })
  }

3.遍历线条数据

 var lineFeature = new Array()
  let lineFeature2 = null
  lines.value.map((line, index) => {
    // 确保线在两个点中间
    const points = line.lineData.map(item => fromLonLat([item.lon, item.lat]))
    if (points.length >= 2) {
      // 确保至少有两个点
      const midPoint = getMidPoint(points[0], points[1]) // 计算中点
      const lineDataWithMidPoint = [points[0], midPoint, points[1]] // 创建包含中点的数组
      const lineFeature2 = new Feature({
        geometry: new LineString(lineDataWithMidPoint)
      })

      // 根据类型设置线的样式
      if (line.type == '500') {
        lineFeature2.setStyle(getLineStyle('#048c12'))
      } else if (line.type == '220') {
        lineFeature2.setStyle(getLineStyle('#fe0303'))
      } else if (line.type == '110') {
        lineFeature2.setStyle(getLineStyle('#036bf9'))
      } 

      lineFeature.push(lineFeature2)
    }
  })

4.设置线条数据源和线条图层

const linesSource = new VectorSource({
    features: lineFeature
  })

  const lineLayer = new VectorLayer({
    zIndex: 665,
    source: linesSource,
    style: function (feature, resolution) {
      return feature.getStyle()
    }
  })

5.将线条图层添加到地图

map.value.addLayer(lineLayer)

6.整合所有代码

//画线
const drawLine = () => {
  // 线样式
  const getLineStyle = color => {
    return new Style({
      stroke: new Stroke({
        color: color,
        width: 1.5
      })
    })
  }
  // let newLines = val || []
  var lineFeature = new Array()
  let lineFeature2 = null
  lines.value.map((line, index) => {
    // 确保线在两个点中间
    const points = line.lineData.map(item => fromLonLat([item.lon, item.lat]))
    if (points.length >= 2) {
      // 确保至少有两个点
      const midPoint = getMidPoint(points[0], points[1]) // 计算中点
      const lineDataWithMidPoint = [points[0], midPoint, points[1]] // 创建包含中点的数组
      const lineFeature2 = new Feature({
        geometry: new LineString(lineDataWithMidPoint)
      })

      // 根据类型设置线的样式
      if (line.type == '500') {
        lineFeature2.setStyle(getLineStyle('#048c12'))
      } else if (line.type == '220') {
        lineFeature2.setStyle(getLineStyle('#fe0303'))
      } else if (line.type == '110') {
        lineFeature2.setStyle(getLineStyle('#036bf9'))
      } 
      lineFeature.push(lineFeature2)
    }
  })
  const linesSource = new VectorSource({
    features: lineFeature
  })

  const lineLayer = new VectorLayer({
    zIndex: 665,
    source: linesSource,
    style: function (feature, resolution) {
      return feature.getStyle()
    }
  })

  map.value.addLayer(lineLayer)
}

三、初始化地图中调用画线方法

// 初始化地图
const init = () => {
   drawLine()
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2259691.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

游戏引擎学习第45天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾 我们刚刚开始研究运动方程,展示了如何处理当人物遇到障碍物时的情况。有一种版本是角色会从障碍物上反弹,而另一版本是角色会完全停下来。这种方式感觉不太自然,因为在游戏中,…

类与对象以及ES6的继承

认识class定义类 类的声明用的比较多 类与构造函数的异同 类的构造函数 类的实例方法 类的访问器方法 在类里面写拦截方法 类的静态方法 通过类名直接访问 es6类的继承-extends super关键字 子类可以重写父类方法包括父类的静态方法也可以继承父类的静态方法 babel可以将新的代…

通过IKE协商方式建立IPSec隧道

我们前面学习了H3C的IPsec VPN配置(为什么IPsec两端内网的网段能不能重复?分明可以实现!),学习了Juniper的IPsec VPN配置,学习了Windows的IPsec VPN配置(配置Juniper虚墙vSRX基于策略的IPsec VP…

文献分享: EMVB——PLAID后期交互引擎的进一步优化

👉前情提要: 神经网络自然语言模型概述 Transformer \text{Transformer} Transformer与注意力机制概述 📚相关论文: BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding \text{BERT: Pre-train…

vue2+element-ui实现多行行内表格编辑

效果图展示 当在表格中点击编辑按钮时:点击的行变成文本框且数据回显可以点击确定按钮修改数据或者取消修改回退数据: 具体实现步骤 1. 行数据定义编辑标记 行数据定义编辑标记 当在组件中获取到用于表格展示数据的方法中,针对每一行数据添加一个编辑标记 this.list.f…

介绍几个Linux下的杀毒软件

一:chkrootkit 是一个用于检测Linux系统下可能被攻击者植入的后门程序或恶意代码的扫描工具。 (1)安装方法(ubuntu) sudo apt update sudo apt install chkrootkit (2)使用方法: chkrootkit -…

JS 中请求队列与锁的巧妙结合

一、引言 在 JavaScript 开发中,尤其是在涉及到异步操作和对共享资源的并发访问时,有效地控制请求顺序和资源访问权限至关重要。例如,在多个网络请求同时针对一个有限制访问频率的 API 或者多个异步任务竞争同一个文件写入权限的场景下&#…

MYSQL索引的分类和创建

目录 1、聚簇索引和非聚簇索引 tips: 小问题:主键为什么建议使用自增id? 2、普通索引 (常规索引)(normal) 3、唯一索引(UNIQUE ) 唯一索引和主键的区别: 唯一约束和唯一索引的区别&#…

Oracle最佳实践-优化硬解析

前段时间参加oracle CAB,oracle高级服务部门做了一个数据库最佳实践的报告,其中就有一项就是解决未使用绑定变量但执行次数很多的SQL; 对于一个数据库来说如果不知道该如何优化,那么最简单最有效的优化就是减少硬解析,…

AI Agent:重塑业务流程自动化的未来力量(2/30)

《AI Agent:重塑业务流程自动化的未来力量》 摘要:整体思路是先介绍 AI Agent 的基本情况,再深入阐述其实现业务流程自动化的方法和在不同领域的应用,接着分析其价值和面临的挑战,最后得出结论,为读者全面…

哈默纳科Harmonic谐波减速机机器人精准高效动力传递的核心力量

在当今科技飞速发展的时代,机器人技术正以惊人的速度改变着我们的生产与生活方式。而在机器人的精密机械结构中,哈默纳科 Harmonic 谐波减速机扮演着不可或缺的角色,成为机器人精准高效动力传递的关键所在。 1.高精度与灵活性:哈默…

【开源项目】经典开源项目数字孪生体育馆—开源工程及源码

飞渡科技数字孪生体育馆管理平台,融合物联网IOT、BIM数据模型、三维GIS等技术,实现体育馆的全方位监控和实时全局掌握,同时,通过集成设备设施管理、人员管理等子系统,减少信息孤岛,让场馆“可视、可控、可管…

长短期记忆神经网络(LSTM)介绍

1、应用现状 长短期记忆神经网络(LSTM)是一种特殊的循环神经网络(RNN)。原始的RNN在训练中,随着训练时间的加长以及网络层数的增多,很容易出现梯度爆炸或者梯度消失的问题,导致无法处理较长序列数据,从而无…

SQL server学习03-创建和管理数据表

目录 一,SQL server的数据类型 1,基本数据类型 2,自定义数据类型 二,使用T-SQL创建表 1,数据完整性的分类 2,约束的类型 3,创建表时创建约束 4,任务 5,由任务编写…

正则表达式——参考视频B站《奇乐编程学院》

智能指针 一、背景🎈1.1. 模式匹配🎈1.2. 文本替换🎈1.3. 数据验证🎈1.4. 信息提取🎈1.5. 拆分字符串🎈1.6. 高级搜索功能 二、原料2.1 参考视频2.2 验证网址 三、用法3.1 限定符3.1.1 ?3.1.2 *3.1.3 3.1.…

Elasticsearch 集群部署

Elasticsearch 是一个分布式的搜索和分析引擎,广泛应用于日志分析、全文搜索、实时数据分析等场景。它以其高性能、高可用性和易用性而著称。本文档将引导您完成一个基本的 Elasticsearch 集群配置,包括节点间的通信、客户端访问、安全设置等关键步骤。我…

#思科模拟器通过服务配置保障无线网络安全Radius

演示拓扑图: 搭建拓扑时要注意: 只能连接它的Ethernet接口,不然会不通 MAC地址绑定 要求 :通过配置MAC地址过滤禁止非内部员工连接WiFi 打开无线路由器GUI界面,点开下图页面,配置路由器无线网络MAC地址过…

webstorm开发uniapp(从安装到项目运行)

1、下载uniapp插件 下载连接:Uniapp Tool - IntelliJ IDEs Plugin | Marketplace (结合自己的webstorm版本下载,不然解析不了) 将下载到的zip文件防在webstorm安装路径下,本文的地址为: 2、安装uniapp插…

mHand Pro动捕数据手套在人形机器人领域的具体运用

mHandPro是一款高精度的动作捕捉数据手套,可应用于动作捕捉与VR交互等领域,配套”mHand Studio“引擎,可实时捕捉真人手部位姿及运动轨迹数据,将数据导出还可以用于人形机器人的训练加速高精度机器人操作技能的培训进程。 高精度动…

CNCF云原生生态版图-分类指南(三)- 运行时

CNCF云原生生态版图-分类指南(三)- 运行时 CNCF云原生生态版图-分类指南三、运行时(Runtime)(一)云原生存储(Cloud Native Storage)1. 是什么?2. 解决什么问题&#xff1…