本文实例为大家分享了openlayers4.6.5实现距离量测和面积量测的具体代码,供大家参考,具体内容如下
版本: openlayers4.6.5
效果图:
小插曲:
原本使用ol官方提供的 量测例子,就挺不错的。但是由于放在项目中后。量测样式不知道为啥出不来,找了半天原因 也没有找到,单独在一个html中完全没问题。所以推测可能和项目中哪些地方有冲突,但是问题暂时没找出来,项目也比较急,所以只能自己实现文字标注部门的样式,实现效果如上图gif所示。
实现原理:
量测功能还是使用了ol例子提供的源码,修改部分主要是在标注这一块,另外就是时刻去添加这个标注 然后时刻删除这个标注 就可以了。
完整的js代码如下(鼠标样式图标 我没放上来,有需要的我给你发邮箱):
var draw; var click=false; var output=0; var vector; var source; var lastPolygonLabelFeature;//记录上一个面标注要素 var lastLengthLabelFeature;//记录上一个点标注要素 $( function(){ $("#measureDistance").click(function(){ if(draw){ map.removeInteraction(draw); } addInteraction("length"); setMeasureCur(); }) $("#measureArea").click(function(){ if(draw){ map.removeInteraction(draw); } addInteraction("area"); setMeasureCur(); }) $("#measureClear").click(function(){ map.removeInteraction(draw); vector.setSource(null); source=new ol.source.Vector(); vector.setSource(source); lastPolygonLabelFeature=null; lastLengthLabelFeature=null; click=false; sketch = null; output="0"; reSetCur(); }) function setMeasureCur(){ $('#map').css({ cursor:"url(../../static/images/measureIcon/measure.cur), auto" }); } function reSetCur(){ $('#map').css('cursor','default'); } source = new ol.source.Vector(); vector = new ol.layer.Vector({ source: source, style: new ol.style.Style({ fill: new ol.style.Fill({//面的填充颜色 color: 'rgba(255, 0, 0, 0.1)' }), stroke: new ol.style.Stroke({ color: 'rgb(255,116,3)', width: 2 }), image: new ol.style.Circle({ radius: 3, stroke: new ol.style.Stroke({ color: 'rgba(255, 0, 0,1)', width: 2 }), fill: new ol.style.Fill({ color: 'rgba(255,255,255)' }) }) }) }); map.addLayer(vector); var sketch; var pointerMoveHandler = function(evt) { if (evt.dragging) { return; } var Coord; if(sketch){ var geom = sketch.getGeometry(); if (geom instanceof ol.geom.Polygon) { if(lastPolygonLabelFeature){ //鼠标移动 不停的添加和删除 source.removeFeature(lastPolygonLabelFeature); } Coord = geom.getInteriorPoint().getCoordinates(); //新建一个要素ol.Feature var newFeature = new ol.Feature({ geometry: new ol.geom.Point(Coord), //几何信息 name: output }); lastPolygonLabelFeature=newFeature; newFeature.setStyle(createLabelStyle(newFeature,0,0)); } else if (geom instanceof ol.geom.LineString) { if(lastLengthLabelFeature){ source.removeFeature(lastLengthLabelFeature); } Coord = geom.getLastCoordinate(); //新建一个要素ol.Feature var newFeature = new ol.Feature({ geometry: new ol.geom.Point(Coord), //几何信息 name: output }); lastLengthLabelFeature=newFeature; newFeature.setStyle(createLabelStyle(newFeature,35,-10)); } //设置要素样式 source.addFeature(newFeature); } }; map.on('pointermove', pointerMoveHandler); map.on('click', function(evt){ var coordinate = evt.coordinate; //鼠标单击点的坐标 console.log(coordinate); if(output=="0"){ lastPolygonLabelFeature=null; if(lastLengthLabelFeature){ source.removeFeature(lastLengthLabelFeature); lastLengthLabelFeature=null; } return; } var Coord; if(sketch){ var geom = sketch.getGeometry(); if (geom instanceof ol.geom.Polygon) { if(lastPolygonLabelFeature){ source.removeFeature(lastPolygonLabelFeature); } Coord = geom.getInteriorPoint().getCoordinates(); //新建一个要素ol.Feature var newFeature = new ol.Feature({ geometry: new ol.geom.Point(Coord), //几何信息 name: output }); lastPolygonLabelFeature=newFeature; newFeature.setStyle(createLabelStyle(newFeature,0,0)); //设置要素样式 source.addFeature(newFeature); } else if (geom instanceof ol.geom.LineString) { Coord = geom.getLastCoordinate(); //新建一个要素ol.Feature var newFeature = new ol.Feature({ geometry: new ol.geom.Point(Coord), //几何信息 name: output }); newFeature.setStyle(createLabelStyle(newFeature,35,-10)); //设置要素样式 source.addFeature(newFeature); } var pointFeature = new ol.Feature({ geometry: new ol.geom.Point(coordinate), //几何信息 name: output }); source.addFeature(pointFeature); } }); //矢量标注样式设置函数,设置image为图标ol.style.Icon function createLabelStyle(feature,offsetX,offsetY){ return new ol.style.Style({ // image: new ol.style.Icon({ // anchor: [0.5, 60], //锚点 // anchorOrigin:'top-right', //锚点源 // anchorXUnits: 'fraction', //锚点X值单位 // anchorYUnits: 'pixels', //锚点Y值单位 // offsetOrigin: 'top-right', //偏移原点 // opacity: 0.75, // src: 'OL3Demo/images/label/blueIcon.png' //图标的URL // }), text: new ol.style.Text({ textAlign: 'center', //位置 textBaseline: 'middle', //基准线 font: 'normal 10px sans-serif', //文字样式 text: feature.get('name'), //文本内容 fill: new ol.style.Fill({ //文本填充样式(即文字颜色) color: 'white' }), stroke: new ol.style.Stroke({ color: 'black', width: 5 }), offsetX:offsetX, offsetY:offsetY }) }); } function addInteraction(drawType) { var type = (drawType== 'area' "0"; }, this); } var formatLength = function(line) { var length = ol.Sphere.getLength(line); var output; if (length > 100) { output = (Math.round(length / 1000 * 100) / 100) + ' ' + '千米'; } else { output = (Math.round(length * 100) / 100) + ' ' + '米'; } return output; }; var formatArea = function(polygon) { var area = ol.Sphere.getArea(polygon); var output; if (area > 10000) { output = (Math.round(area / 1000000 * 100) / 100) + ' ' + '平方千米'; } else { output = (Math.round(area * 100) / 100) + ' ' + '平方米'; } return output; }; })
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
风云阁资源网 Design By www.bgabc.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
风云阁资源网 Design By www.bgabc.com
暂无评论...
更新日志
2024年11月20日
2024年11月20日
- 张芸京.2016-失败的高歌【泡耳音乐】【WAV+CUE】
- 天籁女声《2024第31届上海国际高端音影展纪念CD》[WAV+CUE][1.1G]
- 姚斯婷 《敢爱敢做》头版限量编号24K金碟[低速原抓WAV+CUE][1.2G]
- 雷婷 《把爱留在昨天》紫银合金AQCD[低速原抓WAV+CUE][1.1G]
- 董文华2024-《精选30年·长城长HQ》头版限量[WAV+CUE]
- 柏菲·魏松2024-《跟你走》限量开盘母带ORMCD[WAV+CUE]
- 柏菲·甘雅丹《雅鲁藏布》限量开盘母带ORMCD[WAV+CUE]
- 孙露《明天你是否依然爱我》1:1母盘直刻[低速原抓WAV+CUE][1G]
- 群星2024《龙年精选.音乐盛宴》纯银CD[WAV+CUE][1.1G]
- 童丽《君再来VI》妙音首版[WAV+CUE][1G]
- 柏菲·李跃君2024-《寂寞公路》限量开盘母带ORMCD[WAV+CUE]
- 柏菲·古璇2024-《东山飘雨西山晴》限量开盘母带ORMCD[WAV+CUE]
- 群星《2024好听新歌38》AI调整音效【WAV分轨】
- 台湾荷东《周末狂热1》[WAV+CUE][1.1G]
- 群星《Hi.Fi.怀旧金曲.Vol.1》[低速原抓WAV+分轨][996M]