环境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 添加标记点击弹窗 定位图标闪烁的更多相关文章

  1. HTML5 <input>添加多张图片,可点击弹窗放大。限定4张,可删除。

    点击弹窗放大,需要加入插件. <link rel="stylesheet" href="css/photoswipe.css"> <link ...

  2. iOS开发小技巧 - label中的文字添加点击事件

    Label中的文字添加点击事件 GitHub地址:https://github.com/lyb5834/YBAttributeTextTapAction 以前老师讲过类似的功能,自己懒得回头看了,找了 ...

  3. WPF 系统托盘 图标闪烁

    WPF消息通知 系统托盘,图标闪烁 using System.Windows.Forms; using System.Windows.Threading; public partial class W ...

  4. 对类HelloWorld程序中添加一个MessageBox弹窗

    对类HelloWorld程序中添加一个MessageBox弹窗 分析: 任一程序运行的时候都会加载kernel32.dll的,但MessageBoxA()这个API却是在user32.dll中的.所以 ...

  5. VC 任务栏图标闪烁

    像QQ来消息时的,图标闪烁效果 将如下代码添加到Timer响应函数中 ) {// 任务栏图标闪烁 if (this != GetForegroundWindow()) { //// this-> ...

  6. 百度地图笔记_覆盖物(标注marker,折线polyline,多边形polygon)的点击弹窗和右键菜单

    利用绘制工具绘制点线面,并在执行绘制完成回调事件给相应覆盖物添加事件操作,提供标注的点击弹窗和标注.折线.多边形的右键删除 效果图如下: 完整代码如下:html+js <!DOCTYPE htm ...

  7. Ubuntu 如何为 XMind 添加快速启动方式和图标

    目录 Ubuntu 如何为 XMind 添加快速启动方式和图标 Ubuntu 如何为 XMind 添加快速启动方式和图标 按照教程Ubuntu16.04LTS安装XMind8并创建运行图标进行Xmin ...

  8. 家庭版记账本app进度之关于listview显示账单,并为其添加点击事件

    这个主要学习是关于listview的学习. 怎样去自定义adapter,以及使用.自己创建文件,还有就是为listview的每一个子控件添加点击事件. 在整个过程中收获到的知识点如下: 一.对于数据库 ...

  9. 【Swift 2.1】为 UIView 添加点击事件和点击效果

    前言 UIView 不像 UIButton 加了点击事件就会有点击效果,体验要差不少,这里分别通过自定义和扩展来实现类似 UIButton 的效果. 声明 欢迎转载,但请保留文章原始出处:) 博客园: ...

随机推荐

  1. (转)mysql基础命令

    Sql代码 asc 按升序排列 desc 按降序排列 下列语句部分是Mssql语句,不可以在access中使用. SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE ...

  2. MySQL 数据库 常用函数

    一.数学函数 数学函数主要用于处理数字,包括整型.浮点数等. ABS(x) 返回x的绝对值 SELECT ABS(-1) -- 返回1 CEIL(x),CEILING(x) 返回大于或等于x的最小整数 ...

  3. 全面解读php-网络协议

    一.OSI七层模型 1.物理层 作用:建立,维护,断开物理连接 2.数据链路层 作用:建立逻辑连接,进行硬件地址寻址,差错校验等功能. 3.网络层 作用:进行逻辑地址寻址,实现不同网络之间的路径选择. ...

  4. 最近给几个CRM软件配套开发了Outlook插件,讲讲Outlook插件开发注意事项

    原始出处:www.cnblogs.com/Charltsing/p/OutlookAddinsTips.html联系QQ:564955427 从去年到现在,写了四五个Outlook插件,其中两个是给C ...

  5. Junit : how to add listener, and how to extends RunListener to override behaviors while failed

    http://junit.sourceforge.net/javadoc/org/junit/runner/notification/RunListener.html org.junit.runner ...

  6. Web(八) commons-fileupload上传下载

    在网上看见一篇不错的文章,写的详细. 以下内容引用那篇博文.转载于<http://www.cnblogs.com/whgk/p/6479405.html>,在此仅供学习参考之用. 一.上传 ...

  7. web开发(一)-Servlet详解

    在网上看见一篇不错的文章,写的详细. 以下内容引用那篇博文.转载于<http://www.cnblogs.com/whgk/p/6399262.html>,在此仅供学习参考之用. 一.什么 ...

  8. 阶段3 2.Spring_05.基于XML的IOC的案例1_1 基于XML的IOC的案例-案例准备

    导坐标 创建数据库表 create table account( id int primary key auto_increment, name varchar(40), money float )c ...

  9. 使用vue做项目如何提高代码效率

    最近做了两个vue项目,算上之前做的两个项目,总共有四个vue项目的经验了,但是总体来说写的代码质量不是很高,体现在以下几点 1.代码没有高效的复用 自从使用vue做项目之后,以前使用面向过程变成的习 ...

  10. 黑龙江网络安全技能竞赛awd后门分析复现

    0x0环境 0x1分析复现 0x2感想 围绕主办方留下的浅显后门可以打满整场,想拿第一还是要搞定深层后门