项目背景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没有参数时,返回falsereturn new RegExp(' ' + cls + ' ').test(' ' + ele.className + ' ');}}//添加classfunction addClass(ele, cls) {if (!hasClass(ele, cls) && ele) {ele.className = ele.className == '' ? cls : ele.className + ' ' + cls;}}// 去除classfunction 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);}//创建帮助提示要素的divif (!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 = measurekpst._this.clear = clear

转载于:https://www.cnblogs.com/wwj007/p/11526159.html

openlayers之地图测距侧面相关推荐

  1. vue3.0 + typescript openlayers实现地图标点、移动、画线、显示范围、测量长度、测量面积、画三角形、画正方形、画圆、线选、画笔、清除测量、清除、地图上展示弹窗等功能

    vue3.0 + typescript openlayers实现地图标点.移动.画线.显示范围.测量长度.测量面积.画三角形.画正方形.画圆.线选.画笔.清除测量.清除地图所有等功能 由于最近项目中用 ...

  2. Angular+arcgisjs之平面地图测距、测面积、搜索

    本文代码基于Angular8和arcgis js 4.16. 代码里会涉及到一个地图变量mapView,初始化如下: const map = new Map({basemap: 'osm', }); ...

  3. 百度地图测距 java_【java】改写js百度地图测距方法

    百度地图测距js代码: var EARTHRADIUS = 6370996.81; /** * 将度转化为弧度 * @param {degree} Number 度 * @returns {Numbe ...

  4. Android百度地图测距功能

    临近春节假期,业务开发进入收尾.空闲时间做的技术储备: 百度地图测距 为什么做这个技术储备,1 年尾有时间 2 我们现有的地图业务基于百度地图 3 这个功能竞品某壳等没有但是很实用 个人在看房时候经常 ...

  5. python中地图测距

    百度地图测距-终稿V3.0: import requests from bs4 import BeautifulSoup from datetime import datetime import js ...

  6. 【WebGIS】二、基于Openlayers实现地图的加载与显示

    二.基于Openlayers实现地图的加载与显示 基于上文中配置好的环境,先通过Element Plus实现一个页面的布局,然后基于openlayers加载显示全球瓦片地图. 1. 引入element ...

  7. html把地图显示全屏显示,Openlayers实现地图全屏显示

    本文实例为大家分享了Openlayers实现地图全屏显示的具体代码,供大家参考,具体内容如下 1.新建一个html页面,引入ol.js和ol.css文件,然后在body中创建一个div标签,用来作为地 ...

  8. OpenLayers 3地图添加图标

    OpenLayers 3地图添加图标 一.overlay方式在地图添加图标 1.项目结构 2.map.html <!Doctype html> <html xmlns='http:/ ...

  9. 使用OpenLayers 勾画地图

    使用OpenLayers 勾画地图 <!DOCTYPE html> <html xmlns=http://www.w3.org/1999/xhtml><head>& ...

最新文章

  1. Openldap配置TLS加密传输(完整版——shell脚本实现[即在客户端执行代码,即可实现TLS加密])
  2. 集群镜像:实现高效的分布式应用交付
  3. 组会PPT202006220717《双研究步骤的螺旋波等离子体放电结果分析》
  4. J2EE搭建Dynamic web SpringMVC工程404错误分析(二)
  5. 树莓派3B+64位系统烧制与软件安装
  6. K_Nearest_Neighbot(knn)方法及其Pyhon 实现
  7. 和foreach的区别和应用场景_介绍下Set、Map、WeakSet 和 WeakMap 的区别?
  8. php 集成 spss,spss怎么导入数据
  9. 飞秋2013设置后无法保存配置问题
  10. 第2次作业:软件案例分析
  11. javascript运行机制
  12. Mac 清除dns缓存
  13. Fortran简明自学手册
  14. u盘检测java软件_windows下的Java程序用于检测U盘
  15. openpose环境搭建(全教程)
  16. PSP开发一 linux菜鸟fedora下配置psp开发环境
  17. axure 画小程序效果图_【附源文件】5款精美小程序原型设计模板,触手可得
  18. 基于javaweb的精品养老院管理系统(java+springboot+mybatis+vue+mysql)
  19. app头像上传vue_VUE上传头像,从相册选择、调用摄像头,ios适用transPath的转换
  20. 关于餐饮行业环境污染现状的调研报告

热门文章

  1. 诺思格医药通过注册:年营收6亿 实控人武杰为美国籍
  2. 80核处理器_Intel i9-10980XE处理器首发评测:售价“良心”的18核性能旗舰
  3. 创意发明:单片机做的半导体智能制冷小冰箱 原理图和程序源代码等技术文件
  4. discuz手机版帖子页面支持表格添加边框及边框颜色
  5. 成都东软学院2016年ACM冬季校赛正式赛 - 题解
  6. oracle等待事件4——buffer busy wait 特别介绍
  7. Make your own Neural NetWork之代码详解中
  8. 0x00000709无法连接打印机怎么办?
  9. 如何发掘各种暴利的赚钱项目,如何知道别人在干什么赚钱
  10. 7-13 盲盒包装流水线