美文网首页
四章-42-要素的点击容差

四章-42-要素的点击容差

作者: 彩云飘过 | 来源:发表于2020-04-21 11:26 被阅读0次

    本文基于腾讯课堂老胡的课《跟我学Openlayers--基础实例详解》做的学习笔记,使用的openlayers 5.3.x api。

    源码 见 1042.html ,对应的 官网示例 https://openlayers.org/en/latest/examples/hit-tolerance.html?q=WebGL

    image.png image.png
    <!DOCTYPE html>
    <html>
    
    <head>
     <title>要素的点击容差</title>
     <link rel="stylesheet" href="../include/ol.css" type="text/css" />
     <script src="../include/ol.js"></script>
    </head>
    
    <body>
     <form class="form-inline">
       <span id="status">没有要素被点中</span>
       <br />
       <label>选择要素的点击容差</label>
       <select id="hitTolerance" class="form-control">
         <option value="0" selected>0 像素</option>
         <option value="5">5 像素</option>
         <option value="10">10 像素</option>
       </select>
       <br />
       区域: <canvas id="circle" style="vertical-align: middle" ></canvas>
     </form>
    
     <div id="map" class="map"></div>
    
     <script>
       var raster = new ol.layer.Tile({
         source: new ol.source.OSM()
       });
    
       var style = new ol.style.Style({
         stroke: new ol.style.Stroke({
           color: "black",
           width: 1
         })
       });
    
       var feature = new ol.Feature(
         new ol.geom.LineString([[-4000000, 0], [4000000, 0]])
       );
    
       var vector = new ol.layer.Vector({
         source: new ol.source.Vector({
           features: [feature]
         }),
         style: style
       });
    
       var map = new ol.Map({
         layers: [raster, vector],
         target: "map",
         view: new ol.View({
           center: [0, 0],
           zoom: 2
         })
       });
    
       var hitTolerance;
    
       var statusElement = document.getElementById("status");
    
       map.on("singleclick", function (e) {
         var hit = false;
         map.forEachFeatureAtPixel(
           e.pixel,
           function () {
             hit = true; //因为只有一个线性要素,所以单击时默认选中该要素;若要素有很多,需要判断到底是哪个要素被选中了
           },
           {
             hitTolerance: hitTolerance
           }
         );
         if (hit) {
           style.getStroke().setColor("green");
           statusElement.innerHTML = " 一个要素被选中了!";
         } else {
           style.getStroke().setColor("black");
           statusElement.innerHTML = " 没有要素被选中.";
         }
         feature.changed();
       });
    
       var selectHitToleranceElement = document.getElementById("hitTolerance");
       var circleCanvas = document.getElementById("circle");
    
       //把点击区域的大小示意图画出来
       var changeHitTolerance = function () {
         hitTolerance = parseInt(selectHitToleranceElement.value, 10);
    
         var size = 2 * hitTolerance + 2;
         circleCanvas.width = size;
         circleCanvas.height = size;
         var ctx = circleCanvas.getContext("2d");
         ctx.clearRect(0, 0, size, size);
         ctx.beginPath();
         ctx.arc(
           hitTolerance + 1,
           hitTolerance + 1,
           hitTolerance + 0.5,
           0,
           2 * Math.PI
         );
         ctx.fill();
         ctx.stroke();
       };
    
       selectHitToleranceElement.onchange = changeHitTolerance;
       changeHitTolerance();
    
    
     </script>
    </body>
    
    </html>
    

    相关文章

      网友评论

          本文标题:四章-42-要素的点击容差

          本文链接:https://www.haomeiwen.com/subject/oygkuhtx.html