极乐门资源网 Design By www.ioogu.com
本文实例为大家分享了openlayers实现地图测距测面的具体代码,供大家参考,具体内容如下
项目背景vue-cli3.0
public下html需要引入文件
<link rel="stylesheet" href="<%= BASE_URL %>./css/gr-ol.css" type="text/css"> <script src="/UploadFiles/2021-04-02/ol.js">这里地图为公共组件,方法写在公共组件的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 == '' "起点"; } //根据鼠标点击位置生成一个点 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以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
极乐门资源网 Design By www.ioogu.com
极乐门资源网
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
极乐门资源网 Design By www.ioogu.com
暂无openlayers实现地图测距测面的评论...
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
2024年11月17日
2024年11月17日
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】