美文网首页openlayers学习笔记
四章-31-更改标记图标的选中颜色

四章-31-更改标记图标的选中颜色

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

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

    源码 见 1031.html ,对应的 官网示例 https://openlayers.org/en/latest/examples/icon.html?q=style

    image.png

    使用Interaction处理点选图标的交互
    使用on监听鼠标事件动态修改鼠标指针样式
    通过hasFeatureAtPixel判断鼠标位置是否为图标

    效果时单击后,图标由绿色变成粉红色


    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>
      <div id="map" class="map"></div>
    
      <script>
        var view = new ol.View({
          center: [0, 0],
          zoom: 3
        });
    
        //为点状要素添加样式
        function createStyle(src, img) {
          return new ol.style.Style({
            image: new ol.style.Icon(
              {
                anchor: [0.5, 0.96],
                crossOrigin: "anonymous",
                // color:[255,0,0],
                src: src,
                img: img,//img和src同时存在时,img覆盖src
                imgSize: img ? [img.width, img.height] : undefined
              }
            )
          });
        }
    
        // 点要素
        var iconFeature = new ol.Feature(new ol.geom.Point([0, 0]));
        // 设置样式
        iconFeature.set(
          "style",
          createStyle(
            "../data/icon.png",
            undefined
          )
        );
    
        var map = new ol.Map({
          layers: [
            new ol.layer.Tile({
              source: new ol.source.Stamen({ layer: "watercolor" })
            }),
            new ol.layer.Vector({
              style: function (feature) {
                return feature.get("style");
              },
              source: new ol.source.Vector({ features: [iconFeature] })
            })
          ],
          target: "map",
          view: view
        });
    
        //用来标记已经选择到的样式
        var selectStyle = {};
    
        //当选中时,设置样式
        var select = new ol.interaction.Select({
          style: function (feature) {
            var image = feature
              .get("style")
              .getImage()
              .getImage();//最后这个getImage,可能返回img也可能返回src
           
            // 如果选择样式中不存在该样式,则创建样式
            if (!selectStyle[image.src]) {
              // 创建canvas元素
              var canvas = document.createElement("canvas");
              // 获取绘图环境
              var context = canvas.getContext("2d");
              // 画布宽高
              canvas.width = image.width;
              canvas.height = image.height;
              // 绘制图像
              context.drawImage(image, 0, 0, image.width, image.height);
              var imageData = context.getImageData(0, 0, canvas.width, canvas.height);
              var data = imageData.data;
              // 图片像素反向,创建负片
              for (var i = 0, ii = data.length; i < ii; i = i + (i % 4 == 2 ? 2 : 1)) {
                data[i] = 255 - data[i];
              }
              context.putImageData(imageData, 0, 0);
              // 创建样式并添加到选择样式中
              selectStyle[image.src] = createStyle(undefined, canvas);
             
            }
            return selectStyle[image.src];
          }
        });
    
        map.addInteraction(select);
    
        // 鼠标移到要素上时改变鼠标样式,由箭头变成小手
        map.on("pointermove", function (evt) {
          map.getTargetElement().style.cursor = map.hasFeatureAtPixel(evt.pixel)
            ? "pointer"
            : "";
            
        });
    
      </script>
    </body>
    
    </html>
    

    相关文章

      网友评论

        本文标题:四章-31-更改标记图标的选中颜色

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