openlayers 添加标记点击弹窗 定位图标闪烁
环境vue3.0 ,地图为公用组件,将添加图标标记的方法放在公共地图的初始化方法里
同一时间弹窗和定位标识都只有一个,因而我把弹窗和定位标记的dom预先写好放到了页面
  //矢量标注样式设置函数,设置image为图标ol.style.Icon
    function createLabelStyle(feature, icon, scale, opacity) {
      return (new ol.style.Style({
        image: new ol.style.Icon({
          opacity: opacity,
          src: icon,
          scale: scale // 标注图标大小
        }),
        text: new ol.style.Text({
          textAlign: "center", // 位置
          textBaseline: "middle", // 基准线
          font: "normal 12px 微软雅黑", // 文字样式
          text: feature.get("name"),
          fill: new ol.style.Fill({
            // 文本填充样式(即文字颜色)
            color: "#333"
          }),
          stroke: new ol.style.Stroke({
            color: "#Fff",
            width: 1
          })
        })
      }));
    }
    // 添加标注
    function draw(arr, icon, scale, opacity) {
      var me = this;
      /*********************显示地标**************************/
      // 设置标识范围
      var maxX = 99;
      var minX = 78;
      var maxY = 36;
      var minY = 26;
      //创建空的矢量容器
      var vectorSource = new ol.source.Vector({});
      // 设置要素点
      for (let i = 1; i <= arr.length; i++) {
        let t1 = Math.random() * (maxX - minX + 1) + minX;
        let t2 = Math.random() * (maxY - minY + 1) + minY;
        //创建图标特性
        var iconFeature = new ol.Feature({
          geometry: new ol.geom.Point([t1, t2], "XY"),
          name: arr[i - 1]
        });
        //设置点要素样式
        iconFeature.setStyle(
          createLabelStyle(iconFeature, icon, scale, opacity)
        );
        //将图标特性添加进矢量中
        vectorSource.addFeature(iconFeature);
      }
      //创建矢量层
      var vectorLayer = new ol.layer.Vector({
        source: vectorSource,
        style: createLabelStyle(iconFeature, icon, scale, opacity)
      });
      kpst._this.rvl = vectorLayer
      // kpst._this.removeLayer(vectorLayer);
      // kpst._this.addLayer(vectorLayer);
    }
    // 标志方法  挂载到地图对象
    kpst._this.draw = draw
    // 将给 为的Feature
    kpst._this.createLabelStyle = createLabelStyle
    // 设置标识文字
    var arr = ["s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9"];
    // 设置标识图标
    var src = "https://openlayers.org/en/latest/examples/data/icon.png";
    var scale = 0.5;
    var opacity = 0.5;
    // 将图标放到地图对象
    draw(arr, src, scale, opacity);
    /*********************显示弹出层**************************/
    var container = document.getElementById("popup");
    var content = document.getElementById("popup-content");
    var popupCloser = document.getElementById("popup-closer");
    var overlay = new ol.Overlay({
      element: container,
      autoPan: true
    });
    // 图标hover渲染
    function showHover(t, coordinate) {
      var tip = document.getElementById('tip');
      tip.style.display = 'block'
      tip.innerText = t
      var t_overlay = new ol.Overlay({
        element: tip,
        positioning: 'center-center'
      });
      t_overlay.setPosition(coordinate);
      kpst._this.addOverlay(t_overlay)
    }
    // 标记hover效果
    kpst._this.on('pointermove', function (e) {
      var pixel = kpst._this.getEventPixel(e.originalEvent);
      var coordinate = kpst._this.getEventCoordinate(e.originalEvent);
      var feature = kpst._this.forEachFeatureAtPixel(pixel, function (feature) {
        // showHover(feature.get('name'), coordinate)
        return feature;
      })
    })
    // 弹窗显示
    function showPop(coodinate) {
      if (container) {
        overlay.setPosition(coodinate);
        coodinate = [coodinate[0].toFixed(2), coodinate[1].toFixed(2)]
        content.innerHTML = "<p>你点击的坐标为:" + coodinate + "</p>";
        kpst._this.addOverlay(overlay);
      }
    }
    // 将弹窗显示方法挂载到地图对象
    kpst._this.showPop = showPop
    // 点击弹窗
    kpst._this.on('click', function (e) {
      var pixel = kpst._this.getEventPixel(e.originalEvent);
      kpst._this.forEachFeatureAtPixel(pixel, function (feature) {
        var coodinate = e.coordinate;
        showPop(coodinate)
      });
    });
    // 弹窗关闭按钮
    if (popupCloser) {
      popupCloser.addEventListener('click', function () {
        overlay.setPosition(undefined);
      });
    }
    // 定位图标显示
    function showDot(coordinate) {//coordinate为坐标值
      // 动态创建这个div,并将这个div作为overlay的Element,添加到地图中
      // var point_div = document.createElement('div');
      // point_div.id = "dot";
      // point_div.style.width = '10px'
      // point_div.style.height = '10px'
      // point_div.style.background = 'red'
      var point_div = document.getElementById('dot');
      point_div.style.display = 'block'
      var point_overlay = new ol.Overlay({
        element: point_div,
        positioning: 'center-center'
      });
      point_overlay.setPosition(coordinate);
      point_overlay.setPositioning("center-center"); //与positioning: 'center-center' 作用同 使圆点的中心与坐标重合
    }
    kpst._this.markOverlay = overlay
    kpst._this.showDot = showDot
调用方法,渲染图标标记
       // 图标移除
        map.removeLayer(map.rvl);
        // 图标的添加
        map.addLayer(map.rvl);
  // 定位到拉萨并弹窗 点闪烁
          map.showDot([91.1, 29.41]);
          map.showPop([91.1, 29.41]);
          map.removeOverlay(map.point);
          map.addOverlay(map.point);
          map.getView().setCenter([91.15, 29]); //使定位点为地图中心
弹窗 圆点 hover html
 <div id="popup" class="ol-popup">
      <a href="#" id="popup-closer" class="ol-popup-closer"></a>
      <div id="popup-content"></div>
    </div>
    <div id="dot"></div>
    <div class="icon-hover" id="tip"></div>
样式
  .ol-popup {
    position: absolute;
    background-color: #eeeeeee3;
    -webkit-filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2));
    filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2));
    padding: 15px;
    border-radius: 10px;
    border: 1px solid #cccccc;
    bottom: 12px;
    // bottom: 30px;
    left: -50px;
    min-width: 280px;
  }
  .ol-popup:after,
  .ol-popup:before {
    top: 100%;
    border: solid transparent;
    content: " ";
    height: 0;
    width: 0;
    position: absolute;
    pointer-events: none;
  }
  .ol-popup:after {
    border-top-color: #eeeeee;
    border-width: 10px;
    left: 48px;
    margin-left: -10px;
  }
  .ol-popup:before {
    border-top-color: #cccccc;
    border-width: 11px;
    left: 48px;
    margin-left: -11px;
  }
  .ol-popup-closer {
    text-decoration: none;
    position: absolute;
    top: 2px;
    right: 8px;
  }
  .ol-popup-closer:after {
    content: "✖";
  }
}
    #dot{
      height:16px;
      width:16px;
      border-radius: 25px;
      background: rgba(255, 0, 0, 0.9);
      transform: scale(0);
      animation: myfirst 1s;
      animation-iteration-count: infinite;
      display: none;
    }
    @keyframes myfirst{
      to{
          transform: scale(2);
          background: rgba(0, 0, 0, 0);
      }
    }
#tip{
  width: 20px;
  height: 20px;
  background-color:rgba(0, 195, 255, 0.87);
  color: #fff;
  display: none;
  font-size: 12px;
  text-align: center;
 }
openlayers 添加标记点击弹窗 定位图标闪烁的更多相关文章
- HTML5 <input>添加多张图片,可点击弹窗放大。限定4张,可删除。
		点击弹窗放大,需要加入插件. <link rel="stylesheet" href="css/photoswipe.css"> <link ... 
- iOS开发小技巧 - label中的文字添加点击事件
		Label中的文字添加点击事件 GitHub地址:https://github.com/lyb5834/YBAttributeTextTapAction 以前老师讲过类似的功能,自己懒得回头看了,找了 ... 
- WPF 系统托盘 图标闪烁
		WPF消息通知 系统托盘,图标闪烁 using System.Windows.Forms; using System.Windows.Threading; public partial class W ... 
- 对类HelloWorld程序中添加一个MessageBox弹窗
		对类HelloWorld程序中添加一个MessageBox弹窗 分析: 任一程序运行的时候都会加载kernel32.dll的,但MessageBoxA()这个API却是在user32.dll中的.所以 ... 
- VC 任务栏图标闪烁
		像QQ来消息时的,图标闪烁效果 将如下代码添加到Timer响应函数中 ) {// 任务栏图标闪烁 if (this != GetForegroundWindow()) { //// this-> ... 
- 百度地图笔记_覆盖物(标注marker,折线polyline,多边形polygon)的点击弹窗和右键菜单
		利用绘制工具绘制点线面,并在执行绘制完成回调事件给相应覆盖物添加事件操作,提供标注的点击弹窗和标注.折线.多边形的右键删除 效果图如下: 完整代码如下:html+js <!DOCTYPE htm ... 
- Ubuntu 如何为 XMind 添加快速启动方式和图标
		目录 Ubuntu 如何为 XMind 添加快速启动方式和图标 Ubuntu 如何为 XMind 添加快速启动方式和图标 按照教程Ubuntu16.04LTS安装XMind8并创建运行图标进行Xmin ... 
- 家庭版记账本app进度之关于listview显示账单,并为其添加点击事件
		这个主要学习是关于listview的学习. 怎样去自定义adapter,以及使用.自己创建文件,还有就是为listview的每一个子控件添加点击事件. 在整个过程中收获到的知识点如下: 一.对于数据库 ... 
- 【Swift 2.1】为 UIView 添加点击事件和点击效果
		前言 UIView 不像 UIButton 加了点击事件就会有点击效果,体验要差不少,这里分别通过自定义和扩展来实现类似 UIButton 的效果. 声明 欢迎转载,但请保留文章原始出处:) 博客园: ... 
随机推荐
- Python学习笔记:list的各种操作
			向一个列表中添加单个元素: my_list = []my_list.append('我爱你') 移除列表中的某个元素: my_list.pop(0) # 0是需要移除元素在列表中的index 或者是移 ... 
- Quartz.Net任务调度总结
			Quartz.Net使用经验总结: 学习参考的例子不错,分享一下: (1)https://www.cnblogs.com/jys509/p/4628926.html,该博文介绍比较全面 (2)http ... 
- ImportError: bad magic number in: b'\x03\xf3\r\n'
			解决办法:删除项目中所有的 .pyc 文件. 
- mysql 5.7安装方法
			yum方式安装rpm包形式,安装mysql的方法: 方法一: 使用yum方式,下载后离线安装mysql的安装包 安装前,先使用命令查看,确定系统未安装mysql安装包.彻底清除之前安装的mysql安装 ... 
- C语言转义字符表和ASCII码表
			主要参考 http://www.51hei.com/mcu/4342.html 以及 https://www.cnblogs.com/jason207489550/p/6663444.html 
- LeetCode 516——最长回文子序列
			1. 题目 2. 解答 与最长回文子串类似,我们可以用动态规划来求解这个问题,只不过这里的子序列可以不连续.我们定义状态 state[i][j] 表示子串 s[i, j] 的最长回文子序列长度,那么状 ... 
- 说说 Activity、Intent、Service 是什么关系
			他们都是 Android 开发中使用频率最高的类.其中 Activity 和 Service 都是 Android 四大组件之一.他俩都是Context 类的子类 ContextWrapper 的子类 ... 
- 模仿抽奖转盘,并且用cookie记录历史次数
			自己制作了一个模仿抽奖转盘的小游戏,代码比较简单,规则是只有三次抽奖机会,并且浏览器会记录抽奖的次数, 代码如下 <!DOCTYPE html> <html> <head ... 
- Egret入门学习日记 --- 第二篇 (书籍的选择 && 书籍目录 && 书中 3.3 节 内容)
			第二篇 (书籍的选择 && 书籍目录 && 书中 3.3 节 内容) 既然选好了Egret,那我就要想想怎么学了. 开始第一步,先加个Q群先,这不,拿到了一本<E ... 
- python 生成器、三元表达式、列表推倒式、字典生成式、生成器表达式(总结)
			1.生成器 def func(): yield g = func() next(g) x = yield 2.三元表达式 res = x if 条件 else y 3.列表推导式,字典生成式,生成器表 ... 
