openlayers绘制箭头线

老规矩,先上效果图(只需看黄色箭头样式就行)

在这里插入图片描述

实现方法也很简单,具体如下:

// line就是线条两边的坐标
const lineArrow = [
        {
          name: '浙奉渔19001',
          type: 1,
          line: [[13739180.61760428, 3867806.8497407753], [13753601.705080839, 3864763.0546381413]]
        },
        {
          name: '中国海监7018',
          type: 2,
          line: [[13746408.59354844, 3872287.6211607265], [13754948.401795218, 3866382.9561385084]]
        },
        {
          name: '浙岱渔06423',
          type: 1,
          line: [[13764890.343228461, 3873362.5145883015], [13757755.785627745, 3867978.732211734]]
        },
        {
          name: '东海救101',
          type: 2,
          line: [[13766958.941841919, 3868072.8124196446], [13759617.524379842, 3866116.9934596373]]
        },
        {
          name: '中国海监7008',
          type: 2,
          line: [[13767786.38128729, 3860980.4743164163], [13757489.822948873, 3864373.4603425944]]
        }
      ]
	//然后通过LineString绘制线条
	for (var i = 0; i < lineArrow.length; i++) {
        var feature = new Feature({
          geometry: new LineString(lineArrow[i].line),
          name: lineArrow[i].name
        })
        bezierFeatures.push(feature)
      }
      const bezierSource = new VectorSource({
        features: bezierFeatures
      })
      const bezierLayer = new VectorLayer({
        source: bezierSource,
        zIndex: 1001,
        style: this.bezierStyle
      })
      this.map.addLayer(bezierLayer)

重点是箭头的样式,首先准备一张箭头图片,然后通过样式加到线条头部

geometry.forEachSegment(function(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: require('@/assets/images/shipIcon/line-arrow.png'),
            opacity: 1,
            anchor: [0.5, 0.5],
            rotateWithView: true,
            rotation: -rotation,
            scale: 1
          })
        })
      )
    })
    //设置线段样式
    styles.push(
      new Style({
        stroke: new Stroke({
          color: '#FFD966',
          width: 3,
          lineDash: [20, 8, 1, 8]
        })
      })
    )
  }
  return styles

完整代码

	createBezierPointers() {
      const lineArrow = [
        {
          name: '浙奉渔19001',
          type: 1,
          line: [[13739180.61760428, 3867806.8497407753], [13753601.705080839, 3864763.0546381413]]
        },
        {
          name: '中国海监7018',
          type: 2,
          line: [[13746408.59354844, 3872287.6211607265], [13754948.401795218, 3866382.9561385084]]
        },
        {
          name: '浙岱渔06423',
          type: 1,
          line: [[13764890.343228461, 3873362.5145883015], [13757755.785627745, 3867978.732211734]]
        },
        {
          name: '东海救101',
          type: 2,
          line: [[13766958.941841919, 3868072.8124196446], [13759617.524379842, 3866116.9934596373]]
        },
        {
          name: '中国海监7008',
          type: 2,
          line: [[13767786.38128729, 3860980.4743164163], [13757489.822948873, 3864373.4603425944]]
        }
      ]
      const bezierFeatures = []
      for (var i = 0; i < lineArrow.length; i++) {
        var feature = new Feature({
          geometry: new LineString(lineArrow[i].line),
          name: lineArrow[i].name
        })
        bezierFeatures.push(feature)
      }

      const bezierSource = new VectorSource({
        features: bezierFeatures
      })
      const bezierLayer = new VectorLayer({
        source: bezierSource,
        zIndex: 1001,
        style: this.bezierStyle
      })
      this.map.addLayer(bezierLayer)
    },
    
	bezierStyle(feature) {
      const geometry = feature.getGeometry()
      const featureType = feature.getGeometry().getType()
      const styles = []
      geometry.forEachSegment(function(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: require('@/assets/images/shipIcon/line-arrow.png'),
              opacity: 1,
              anchor: [0.5, 0.5],
              rotateWithView: true,
              rotation: -rotation,
              scale: 1
            })
          })
        )
      })
      styles.push(
        new Style({
          stroke: new Stroke({
            color: '#FFD966',
            width: 3,
            lineDash: [20, 8, 1, 8]
          })
        })
      )
      return styles
    },
  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值