【开源WebGIS】07-Openlayers+Vue 测量功能-02

文章介绍了如何细化地图测量功能,包括创建绘制提示和显示测量结果的函数,以及测量线长度和面面积的格式化方法。通过监听draw的drawstart事件来实时更新测量结果,并在清除按钮中增加清除交互、文字、测量图层和测量结果的功能。代码示例基于OpenLayers库。
摘要由CSDN通过智能技术生成

在上一节中,我们实现了基础的测量功能。但是实现的测量功能还有很多问题,还有很多东西可以细化,主要细化以下几个方面:

  • 绘制的提示文字
    在这里插入图片描述
  • 绘制结果的显示

在这里插入图片描述
最终实现相对完整的测量功能,展示如下:
在这里插入图片描述

创建一个绘制提示的函数

createHelpTooltip() {
  if (this.helpTooltipElement) {
    this.helpTooltipElement.parentNode.removeChild(this.helpTooltipElement);
  }
  this.helpTooltipElement = document.createElement('div');
  this.helpTooltipElement.className = 'ol-tooltip hidden';
  this.helpTooltip = new Overlay({
    element: this.helpTooltipElement,
    offset: [15, 0],
    positioning: 'center-left',
  });
  this.map.addOverlay(this.helpTooltip);
},

创建一个显示测量结果的函数

createMeasureTooltip() {
  if (this.measureTooltipElement) {
    this.measureTooltipElement.parentNode.removeChild(this.measureTooltipElement);
  }
  this.measureTooltipElement = document.createElement('div');
  this.measureTooltipElement.className = 'ol-tooltip ol-tooltip-measure';
  this.measureTooltip = new Overlay({
    element: this.measureTooltipElement,
    offset: [0, -15],
    positioning: 'bottom-center',
    stopEvent: false,
    insertFirst: false,
  });
  this.map.addOverlay(this.measureTooltip);
},

创建一个测量线的长度的函数

formatLength(line){
      var length 
      length = Math.round(line.getLength() * 100) / 100; //直接得到线的长度
      var output
      if (length > 100) {
          output = (Math.round(length / 1000 * 100) / 100) + ' ' + 'km'; //换算成KM单位
      } else {
          output = (Math.round(length * 100) / 100) + ' ' + 'm'; //m为单位
      }
      return output;//返回线的长度
    },

创建一个测量面的面积的函数

formatArea(polygon){
      var area
      //直接获取多边形的面积
      area = polygon.getArea()
      var output;
      if (area > 10000) {
          output = (Math.round(area / 1000000 * 100) / 100) + ' ' + 'km<sup>2</sup>'; //换算成KM单位
      } else {
          output = (Math.round(area * 100) / 100) + ' ' + 'm<sup>2</sup>';//m为单位
      }
      return output; //返回多边形的面积
    }

监听draw的做drawstart事件

这一步的操作是通过监听event事件的geometry的变化,实现以下两个功能:

  1. 将最新生成的geometry首先传递进入面积测量和距离测量的函数中,计算得到面积和距离的结果。
  2. 将测量结果显示在线要素的最后一个坐标/面要素的中心位置
this.draw.on('drawstart',(evt)=>{
   this.sketch = evt.feature //绘制的要素
   this.sketch.getGeometry().on('change',(evt)=>{
     var geom = evt.target;//绘制几何要素
     if (type =='Polygon') {
       this.measureTooltipElement.innerHTML = this.formatArea(this.sketch.getGeometry())
       //计算面积
       this.measureTooltip.setPosition(geom.getInteriorPoint().getCoordinates());
     } else if (type == 'LineString') {
       //计算长度
       this.measureTooltipElement.innerHTML = this.formatLength(this.sketch.getGeometry())
       this.measureTooltip.setPosition(geom.getLastCoordinate());
     }
   })
 })

在清除按钮中增加更多功能

// 清除交互
 this.map.removeInteraction(this.draw)
  //清除文字
  this.map.removeOverlay(this.measureTooltip)
  // 清除测量的图层
  this.map.getAllLayers().forEach(element => {
    if (element.values_.name == 'mensureLayer')
      this.map.removeLayer(element)
  });
  // 清除测量结果
  this.mensureResult = null
  //清除文字
  this.map.removeOverlay(this.measureTooltip)
  this.map.removeOverlay(this.helpTooltip);

获取代码

  • 关注公粽号“老靳的WebGIS”回复ol07获取
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老靳的WebGIS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值