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

在前几期实现离线地图初始化以及规划某一特定区域、打点、出现弹窗的基础上,本文主要阐述如何实现在所规划的区域地图上画线,如果你实现了打点的效果,其实这个相对来说还是算比较简单的,因为和打点的代码大差不差。使用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()
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值