中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用openlayers4.6.5實現距離量測和面積量測

發布時間:2020-10-30 23:07:28 來源:億速云 閱讀:308 作者:Leah 欄目:開發技術

使用openlayers4.6.5實現距離量測和面積量測?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

完整的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' ? '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;
    };
})

看完上述內容,你們掌握使用openlayers4.6.5實現距離量測和面積量測的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

温宿县| 大渡口区| 大洼县| 新和县| 拜城县| 久治县| 镇康县| 林口县| 泽普县| 丰都县| 双峰县| 梨树县| 静宁县| 海盐县| 礼泉县| 辉南县| 敦煌市| 芮城县| 晋宁县| 保德县| 闸北区| 金阳县| 盐津县| 怀仁县| 建昌县| 兴和县| 常山县| 东海县| 德化县| 钟祥市| 泗洪县| 玉环县| 贡山| 贺兰县| 祥云县| 江门市| 天峨县| 霍邱县| 英超| 湖北省| 肃南|