服务平台版微信小程序_openlayers4.6.5完成间隔量测

2021-01-05 10:40 jianzhan
openlayers4.6.5实现距离量测和面积量测       这篇文章主要为大家详细介绍了openlayers4.6.5实现距离量测和面积量测,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了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);

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' 'Polygon' : 'LineString'); draw = new ol.interaction.Draw({ source: source, type: type, style: new ol.style.Style({ fill: new ol.style.Fill({ color: 'rgba(255, 0, 0, 0.2)' stroke: new ol.style.Stroke({ color: 'rgb(255,116,3)', // lineDash: [10, 10],//虚线 width: 2 image: new ol.style.Circle({ radius: 5, stroke: new ol.style.Stroke({ color: 'rgba(255, 0, 0, 0.1)' fill: new ol.style.Fill({ color: 'rgba(255,116,3, 0.3)' map.addInteraction(draw); var listener; draw.on('drawstart', function(evt) { // set sketch sketch = evt.feature; listener = sketch.getGeometry().on('change', function(evt) { var geom = evt.target; if (geom instanceof ol.geom.Polygon) { output = formatArea(geom); } else if (geom instanceof ol.geom.LineString) { output = formatLength(geom); }, this); draw.on('drawend', function() { // unset sketch sketch = null; ol.Observable.unByKey(listener); output="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; })

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