openlayers实现地图测距测面

本文实例为大家分享了openlayers实现地图测距测面的具体代码,供大家参考,具体内容如下

项目背景vue-cli3.0

public下html需要引入文件

<link rel="stylesheet" href="<%= BASE_URL %>./css/gr-ol.css" type="text/css">
<script src="<%= BASE_URL %>./js/ol.js" type="text/javascript"></script>

这里地图为公共组件,方法写在公共组件的init方法里,kpst._this为地图对象

调用

//测距/面
var draw = me.map._this.interactions.getArray()[10]
me.map._this.removeInteraction(draw);
  if (data.name == '测距' || data.name == '测面') {
  me.map._this.interactions.array_ = arr.slice(0, 10)
  if (data.name == '测距') {
   me.mtype = 'LineString'
  } else {
   me.mtype = 'Polygon'
  }
  me.map._this.measure(me.mtype) //map已挂载到vue原型Vue.prototype.map = map
  } else if (data.name == '清除') {
  me.map._this.clear()
  }

方法挂载

// 测距、面
//创建一个当前要绘制的对象
var sketch
//创建一个帮助提示框对象
var helpTooltipElement;
//创建一个帮助提示信息对象
var helpTooltip;
//创建一个测量提示框对象
var measureTooltipElement;
//创建一个测量提示信息对象
var measureTooltip;
//继续绘制多边形的提示信息
var continuePolygonMsg
//继续绘制线段的提示信息
var continueLineMsg
//帮助提示信息
var helpMsg
//定义矢量数据源
var source = new ol.source.Vector();
//定义矢量图层
var vector = new ol.layer.Vector({
  source: source,
  style: new ol.style.Style({
  fill: new ol.style.Fill({
   color: 'rgba(255,255,255,0.2)'
  }),
  stroke: new ol.style.Stroke({
   color: '#e21e0a',
   width: 2
  }),
  image: new ol.style.Circle({
   radius: 5,
   fill: new ol.style.Fill({
   color: '#ffcc33'
   })
  })
  })
 });
 //创建比例尺控件
 var scaleLineControl = new ol.control.ScaleLine({
  units: 'metric',
  target: 'scalebar',
  className: 'ol-scale-line'
 });
 function measure(mtype) {
  sketch = new ol.Feature();
  // continuePolygonMsg = 'Click to continue drawing the polygon';
  // continueLineMsg = 'Click to continue drawing the line';
  //将矢量图层添加到地图中
  kpst._this.removeLayer(vector);
  kpst._this.addLayer(vector);
  //添加比例尺控件
  kpst._this.removeControl(scaleLineControl);
  kpst._this.addControl(scaleLineControl);
  //鼠标移动触发的函数
  var pointerMoveHandler = function (evt) {
  //如果是平移地图则直接结束
  if (evt.dragging) {
   return;
  }
  //帮助提示信息
  helpMsg = 'Click to start drawing';
  if (sketch) {
   //获取绘图对象的几何要素
   var geom = sketch.getGeometry();
   //如果当前绘制的几何要素是多线段,则将绘制提示信息设置为多线段绘制提示信息
   // if (geom instanceof ol.geom.Polygon) {
   // helpMsg = continuePolygonMsg;
   // } else if (geom instanceof ol.geom.LineString) {
   // helpMsg = continueLineMsg;
   // }
  }
  //设置帮助提示要素的内标签为帮助提示信息
  // if (helpTooltipElement)
  // helpTooltipElement.innerHTML = helpMsg;
  //设置帮助提示信息的位置
  // if (helpTooltip)
  helpTooltip.setPosition(evt.coordinate);
  //移除帮助提示要素的隐藏样式
  // $(helpTooltipElement).removeClass('hidden');
  removeClass(document.getElementsByClassName('tooltip')[0], 'hidden')
  };

  //触发pointermove事件
  kpst._this.on('pointermove', pointerMoveHandler);

  //当鼠标移除地图视图的时为帮助提示要素添加隐藏样式
  document.querySelector('.ol-viewport').onmouseout = function () {
  addClass(document.getElementsByClassName('tooltip')[0], 'hidden')
  }
  // 判断class有无
  function hasClass(ele, cls) {
  if (ele) {
   cls = cls || '';
   if (cls.replace(/\s/g, '').length == 0) return false; //当cls没有参数时,返回false
   return new RegExp(' ' + cls + ' ').test(' ' + ele.className + ' ');
  }
  }
  //添加class
  function addClass(ele, cls) {
  if (!hasClass(ele, cls) && ele) {
   ele.className = ele.className == '' ? cls : ele.className + ' ' + cls;
  }
  }
  // 去除class
  function removeClass(ele, cls) {
  if (hasClass(ele, cls) && ele) {
   var newClass = ' ' + ele.className.replace(/[\t\r\n]/g, '') + ' ';
   while (newClass.indexOf(' ' + cls + ' ') >= 0) {
   newClass = newClass.replace(' ' + cls + ' ', ' ');
   }
   ele.className = newClass.replace(/^\s+|\s+$/g, '');
  }
  }
  //定义一个交互式绘图对象
  var draw;
  //添加交互式绘图对象的函数
  function addInteraction() {
  //创建一个交互式绘图对象
  draw = new ol.interaction.Draw({
   //绘制的数据源
   source: source,
   //绘制类型
   type: mtype,
   //样式
   style: new ol.style.Style({
   fill: new ol.style.Fill({
    color: 'rgba(255,255,255,0.2)'
   }),
   stroke: new ol.style.Stroke({
    color: 'rgba(0,0,0,0.5)',
    lineDash: [10, 10],
    width: 2
   }),
   image: new ol.style.Circle({
    radius: 5,
    stroke: new ol.style.Stroke({
    color: 'rgba(0,0,0,0.7)'
    }),
    fill: new ol.style.Fill({
    color: 'rgba(255,255,255,0.2)'
    })
   })
   })
  });
  //将交互绘图对象添加到地图中
  kpst._this.addInteraction(draw);
  //创建测量提示框
  createMeasureTooltip();
  //创建帮助提示框
  createHelpTooltip();
  //定义一个事件监听
  var listener;
  //定义一个控制鼠标点击次数的变量
  var count = 0;
  //绘制开始事件
  draw.on('drawstart', function (evt) {
   //The feature being drawn.
   sketch = evt.feature;
   //提示框的坐标
   var tooltipCoord = evt.coordinate;
   //监听几何要素的change事件
   //Increases the revision counter and dispatches a 'change' event.
   listener = sketch.getGeometry().on('change', function (evt) {
   //The event target.
   //获取绘制的几何对象
   var geom = evt.target;
   //定义一个输出对象,用于记录面积和长度
   var output;
   if (geom instanceof ol.geom.Polygon) {
    kpst._this.removeEventListener('singleclick');
    kpst._this.removeEventListener('dblclick');
    //输出多边形的面积
    output = formatArea(geom);
    //Return an interior point of the polygon.
    //获取多变形内部点的坐标
    tooltipCoord = geom.getInteriorPoint().getCoordinates();
   } else if (geom instanceof ol.geom.LineString) {
    //输出多线段的长度
    output = formatLength(geom);
    //Return the last coordinate of the geometry.
    //获取多线段的最后一个点的坐标
    tooltipCoord = geom.getLastCoordinate();
   }
   //设置测量提示框的内标签为最终输出结果
   // if (measureTooltipElement)
   measureTooltipElement.innerHTML = output;
   //设置测量提示信息的位置坐标
   // if (measureTooltip)
   measureTooltip.setPosition(tooltipCoord);
   });
   //地图单击事件
   kpst._this.on('singleclick', function (evt) {
   //设置测量提示信息的位置坐标,用来确定鼠标点击后测量提示框的位置
   // if (measureTooltip)
   measureTooltip.setPosition(evt.coordinate);
   //如果是第一次点击,则设置测量提示框的文本内容为起点
   if (count == 0 && measureTooltipElement) {
    measureTooltipElement.innerHTML = "起点";
   }
   //根据鼠标点击位置生成一个点
   var point = new ol.geom.Point(evt.coordinate);
   //将该点要素添加到矢量数据源中
   source.addFeature(new ol.Feature(point));
   //更改测量提示框的样式,使测量提示框可见
   measureTooltipElement.className = 'tooltip tooltip-static';
   //创建测量提示框
   createMeasureTooltip();
   //点击次数增加
   count++;
   });
   //地图双击事件
   kpst._this.on('dblclick', function (evt) {
   //根据
   var point = new ol.geom.Point(evt.coordinate);
   source.addFeature(new ol.Feature(point));
   });
  }, this);
  //绘制结束事件
  draw.on('drawend', function (evt) {
   count = 0;
   //设置测量提示框的样式
   measureTooltipElement.className = 'tooltip tooltip-static';
   //Set the offset for this overlay.
   //设置偏移量
   measureTooltip.setOffset([0, -7]);
   //清空绘制要素
   sketch = null;
   //清空测量提示要素
   measureTooltipElement = null;
   //创建测量提示框
   createMeasureTooltip();
   //Removes an event listener using the key returned by on() or once().
   //移除事件监听
   ol.Observable.unByKey(listener);
   //移除地图单击事件
   kpst._this.removeEventListener('singleclick');
  }, this);
  }
  //创建帮助提示框
  function createHelpTooltip() {
  //如果已经存在帮助提示框则移除
  if (helpTooltipElement) {
   helpTooltipElement.parentNode.removeChild(helpTooltipElement);
  }
  //创建帮助提示要素的div
  if (!helpTooltipElement)
   helpTooltipElement = document.createElement('div');
  //设置帮助提示要素的样式
  helpTooltipElement.className = 'tooltip hidden';
  //创建一个帮助提示的覆盖标注
  helpTooltip = new ol.Overlay({
   element: helpTooltipElement,
   offset: [15, 0],
   positioning: 'center-left'
  });
  //将帮助提示的覆盖标注添加到地图中
  kpst._this.addOverlay(helpTooltip);
  }
  //创建测量提示框
  function createMeasureTooltip() {
  //创建测量提示框的div
  // if (!measureTooltipElement)
  measureTooltipElement = document.createElement('div');
  measureTooltipElement.setAttribute('id', 'lengthLabel');
  //设置测量提示要素的样式
  measureTooltipElement.className = 'tooltip tooltip-measure';
  //创建一个测量提示的覆盖标注
  measureTooltip = new ol.Overlay({
   element: measureTooltipElement,
   offset: [0, -15],
   positioning: 'bottom-center'
  });
  //将测量提示的覆盖标注添加到地图中
  kpst._this.addOverlay(measureTooltip);
  }
  //格式化测量长度
  var formatLength = function (line) {
  //定义长度变量
  var length;
  //计算平面距离
  length = Math.round(line.getLength() * 100) / 100;
  //定义输出变量
  var output;
  //如果长度大于1000,则使用km单位,否则使用m单位
  if (length > 100) {
   output = (Math.round(length / 1000 * 100) / 100) + ' ' + 'km'; //换算成KM单位
  } else {
   output = (Math.round(length * 100) / 100) + ' ' + 'm'; //m为单位
  }
  return output;
  };
  //格式化测量面积
  var formatArea = function (polygon) {
  //定义面积变量
  var area;
  //获取平面面积
  area = polygon.getArea();
  // }
  //定义输出变量
  var output;
  //当面积大于10000时,转换为平方千米,否则为平方米
  if (area > 1000) {
   output = (Math.round(area / 1000000 * 100) / 100) + ' ' + 'km<sup>2</sup>';
  } else {
   output = (Math.round(area * 100) / 100) + ' ' + 'm<sup>2</sup>';
  }
  return output;
  };
  //添加交互绘图对象
  addInteraction();
 }
 // 清除提示对象
 function clear() {
  source.clear()
  kpst._this.getOverlays().clear();
  kpst._this.removeLayer(vector);
  kpst._this.removeControl(scaleLineControl);
 }
kpst._this.measure = measure
kpst._this.clear = clear

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Openlayers测量距离与面积的实现方法

    本文实例为大家分享了Openlayers测量距离与面积的具体代码,供大家参考,具体内容如下 1.地图测量功能 一般的地图的测量功能主要表现在两个方面,一是测量距离,一是测量面积:面积的测量是根据鼠标绘制的范围,通过地理坐标系的转换而计算出实际面积大小,距离的测量是根据鼠标在地图上绘制的点,实时计算出两点之间的实际距离,下面我们就在Openlayers3中来实现这一功能: 2.代码实现 <!DOCTYPE html> <html xmlns="http://www.w3.org/

  • Openlayers实现测量功能

    本文实例为大家分享了Openlayers实现测量的具体代码,供大家参考,具体内容如下 由于公司项目需要使用到openlayers,就开始学习了openlayers,其中有一个需求需要用到测量功能,就参考<WebGisOpenlayers全面解析>写了一个小demo,话不多说,直接上代码: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content=&qu

  • OpenLayers3实现测量功能

    本文实例为大家分享了OpenLayers3实现测量功能的具体代码,供大家参考,具体内容如下 1. 前言 测量功能实现面积的测量以及长度的测量.通过鼠标绘制区域以及长度来进行测量.OpenLayers 3 框架没有提供测量控件,但提供了相应的接口,需要需要基于几何对象的相应接口,结合图形绘制功能实现. 2. 实现思路 (1)新建一个网页,引用 openlayers 3 开发库.jQuery 库与 bootstrap 库,并参照前面显示地图的文章,加载 OSM 瓦片图层. (2)在地图容器中,创建一

  • openlayers4.6.5实现距离量测和面积量测

    本文实例为大家分享了openlayers4.6.5实现距离量测和面积量测的具体代码,供大家参考,具体内容如下 版本: openlayers4.6.5 效果图: 小插曲: 原本使用ol官方提供的 量测例子,就挺不错的.但是由于放在项目中后.量测样式不知道为啥出不来,找了半天原因 也没有找到,单独在一个html中完全没问题.所以推测可能和项目中哪些地方有冲突,但是问题暂时没找出来,项目也比较急,所以只能自己实现文字标注部门的样式,实现效果如上图gif所示. 实现原理: 量测功能还是使用了ol例子提供

  • openlayers实现地图测距测面

    本文实例为大家分享了openlayers实现地图测距测面的具体代码,供大家参考,具体内容如下 项目背景vue-cli3.0 public下html需要引入文件 <link rel="stylesheet" href="<%= BASE_URL %>./css/gr-ol.css" type="text/css"> <script src="<%= BASE_URL %>./js/ol.js&qu

  • Openlayers实现地图的基本操作

    本文实例为大家分享了Openlayers实现地图基本操作的具体代码,供大家参考,具体内容如下 1.新建一个html页面,引入ol.js和ol.css文件,然后在body中创建一个Div标签和4个Button按钮,用来实现地图的放大.缩小.平移等功能: 2.代码实现 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C

  • openlayers实现地图弹窗

    本文实例为大家分享了openlayers实现地图弹窗的具体代码,供大家参考,具体内容如下 <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <link rel="stylesheet" href=

  • Openlayers实现地图全屏显示

    本文实例为大家分享了Openlayers实现地图全屏显示的具体代码,供大家参考,具体内容如下 1.新建一个html页面,引入ol.js和ol.css文件,然后在body中创建一个div标签,用来作为地图加载的容器: 2.代码实现 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type"

  • Openlayers绘制地图标注

    本文实例为大家分享了Openlayers绘制地图标注的具体代码,供大家参考,具体内容如下 1.标注的简介 标注简单点说就是通过图标.文字等方式将我们想展示的内容显示在地图上,着重突出人们所关注的专题内容,从而为用户提供个性化的地图服务: 2.标注方式 在Openlayers3里面,有两种对地理位置点进行标注的方法,一种是通过创建矢量图层然后设置其样式的方法,还有一种就是创建Overlay覆盖层的方法:对于第一种方式,本质上创建的还是一个矢量对象,只是将其表现形式更换了一下,用Style样式进行包

  • vue使用openlayers创建地图

    vue项目中使用openlayers创建地图,供大家参考,具体内容如下 前期准备 安装node环境 安装cnpm 安装vue-cli 以上步骤网上都有很多教程 搭建vue项目 vue create vue-ol 按照提示一步步搭建vue项目 cd vue-ol npm run serve 浏览器打开 http://localhost:8080/ 就可以看到初始化的vue项目页面 vue项目安装openlayers cnpm i ol --s main.js中引入ol.css import 'ol

  • 使用OpenLayers3 添加地图鼠标右键菜单

    添加右键菜单,首先我们要监听鼠标右键点击的操作,我们知道鼠标右键事件名是 contextmenu,当鼠标在 html 元素之上,点击鼠标右键,便会触发 contextmenu 事件,在 contextmenu 事件的回调函数中实现相应的显示菜单功能即可. 那么在 openlayers 中,在地图中添加这个事件,我们从哪里下手呢?首先我们得了解 openlayers 的初始化页面的过程. openlayers 初始化页面过程 openlayers 也是一个前端库,那么它肯定离不开 html 的运用

  • openlayers 3实现车辆轨迹回放

    本文实例为大家分享了openlayers 3实现车辆轨迹回放的具体代码,供大家参考,具体内容如下 先上效果: 利用 openlayers 3地图的 postcompose 事件监听地图的重绘 注意:此代码是我在Vue 的methods 里面写的测试方法,并不能直接运行,请在理解的基础上测试. vm 为vue的this对象 注释已经很丰富了,先做个备份,后期会编辑加入一点详解. 实现代码: html: <div id="menu"> <label for="s

  • Vue + OpenLayers 快速入门学习教程

    Openlayers 是一个模块化.高性能并且功能丰富的WebGIS客户端的JavaScript包,用于显示地图及空间数据,并与之进行交互,具有灵活的扩展机制. 简单来说,使用 Openlayers(后面简称ol) 可以很灵活自由的做出各种地图和空间数据的展示.而且这个框架是完全免费和开源的. 前言 本文记录 Vue 使用 OpenLayers 入门,使用 OpenLayers 创建地图组件,分别使用 OpenLayers 提供的地图和本地图片做为地图. Overview OpenLayers

  • Vue+OpenLayer实现测距功能

    目录 前言 引入相关库文件 绘制提示文字 鼠标绘制线 设置距离信息窗 绘制完成 取消绘制 全部代码 前言 首先呢说明一下,我是跟着一个大佬学的,所以我是个小次佬,openlayer的官网上面给出了案例,但是习惯vue开发的我完全不理解,关键是连注释都没多少,而且我 openlayer 用的本来就不多. 然后这里分享一下官网的测距案例 引入相关库文件 这个库文件直接按照官网的来就可以了. 首先说一个事情哈,官网用的案例是地图使用的 EPSG:3857, 如果我们改成 EPSG:4326,测量数据不

随机推荐