Openlayers Overlay加载gif图片
说明:
项目中使用vector图层做图片撒点功能,发现加载gif没有效果。网上查找资料发现,openlayers不支持gif图片样式。
后面采用overlay的方式,gif图片赋值给DOM元素
解决方案:
1、单个点
先在地图容器里新增一个id为marks的<div>标签
/*加载gif图片格式*/
function addGifMarks() {
let aa = document.getElementById('marks');
let lyr = new ol.Overlay({
id: "overlay",
position: [0, 0],//默认空
positioning: 'center-bottom',
element: aa,//绑定上面添加的元素
//stopEvent: false,
offset: [-13.5, -40]//图片偏移量
});
encMap.encmap.addOverlay(lyr);
var src = './assets/green.gif';//拼接图片地址
document.getElementById('marks').style.backgroundImage = 'url(' + src + ')';
lyr.setPosition([12970694.29785, 4743563.564]); //显示
}
这个方法的核心在于使用Overlay的element属性绑定一个<div>标签,然后将gif图片路径设置给这个<div>标签的backgroundImage样式。(这个思路可以用在很多地方)
2、多点
/**
* @description 撒点(以overlay的element方式,解决openlayers无法加载gif图片等问题)
* @param {Map} _map 地图对象
* @param {Array} _points 点集,格式[{attributes:{x:12976694.29785,y:4743563.56400}},{attributes:{x:12937907.75571,y:4778074.42433}}]
* @param {Object} _imgParam 图片名称,格式{src:图片url,width:50px,height:100px),格式{src:图片url,width:图片宽,height:图片高}
* @param {String} _elementId overlay添加的容器Id
* @param {Function} _clickFunc 点击图片回调函数
*/
this.addMarksByOverlay = function (_map, _points, _imgParam, _elementId, _clickFunc) {
let marker = null;
//循环点集
for (let i = 0; i < _points.length; i++) {
//新增放置overly的div
let _overlay = document.getElementById(_elementId);
_overlay.id = _elementId;
if(document.getElementById("overlay" + i))
{
let _removeLyr = _map.encmap.getOverlayById("overlay" + i);
_map.encmap.removeOverlay(_removeLyr);
}
let sElement = document.createElement("div");
sElement.id = "overlay" + i;
sElement.style.width = _imgParam.width;
sElement.style.height = _imgParam.height;
sElement.attr = _points[i].attributes;
sElement.x = _points[i].attributes.x;
sElement.y = _points[i].attributes.y;
_overlay.appendChild(sElement); //新增overly
var lyr = new ol.Overlay({
id: 'overlay' + i,
positioning: 'center-center',
//属性
attributes: _points[i].attributes,
//overly放置的div
element: document.getElementById('overlay' + i),
stopEvent: false
}); //逐个把overly添加到地图上
_map.encmap.addOverlay(lyr);
var src = _imgParam.src;//拼接图片地址
document.getElementById('overlay' + i).style.backgroundImage = 'url(' + src + ')';
lyr.setPosition([_points[i].attributes.x, _points[i].attributes.y]); //显示 //如果点击事件
if (_clickFunc) {
document.getElementById('overlay' + i).onclick = function (evt) {
if (!evt.currentTarget.attr) {
return;
}
let attr = evt.currentTarget.attr;
attr.x = evt.currentTarget.attr.x ? evt.currentTarget.attr.x : 0;
attr.y = evt.currentTarget.attr.y ? evt.currentTarget.attr.y : 0;
_clickFunc(attr);
};
}
}
}
多点的核心思路和加载单点一样,但是多了一个逻辑。
设想一下,如果一个Overlay绑定一个div,一个div生成一个点要素的话,可以推得一个Overlay就相当于一个点。
问题就来了,如果按单点的方法来的话,我撒100个点就需要预先建100个div,这并不科学。
因此这里我采用动态构建div的方法,找到id为_elementId的控件,在里面新建id为overlay1,overlay2,overlay3...的div,并循环绑定Overlay
第二次加载前,会判断是否加载过,如果加载过,则先清空上一次的div
附清空方法:
let olLyrs = this.encmap.getOverlays().getArray();
let olLyrsLength = this.encmap.getOverlays().getArray().length;
for(let i = 0;i < olLyrsLength;i++){
olLyrs[i].setPosition(undefined);
//olLyrs[i] = null;
}
Openlayers Overlay加载gif图片的更多相关文章
- WebView加载HTML图片大小自适应与文章自动换行
http://www.brighttj.com/ios/ios-webview-load-html-image-adaptive.html 在很多App中都会使用到webview,尤其是在加载新闻内容 ...
- Android ListView 图片异步加载和图片内存缓存
开发Android应用经常需要处理图片的加载问题.因为图片一般都是存放在服务器端,需要联网去加载,而这又是一个比较耗时的过程,所以Android中都是通过开启一个异步线程去加载.为了增加用户体验,给用 ...
- WPF中加载高分辨率图片性能优化
在最近的项目中,遇到一个关于WPF中同时加载多张图片时,内存占用非常高的问题. 问题背景: 在一个ListView中同时加载多张图片,注意:我们需要加载的图片分辨率非常高. 代码: XAML: < ...
- Fresco 使用笔记(一):加载gif图片并播放
项目总结 --------------------------------------------------------------------- 前言: 项目中图文混合使用的太多太多了,但是绝大部 ...
- 图片_ _Android有效解决加载大图片时内存溢出的问题 2
Android有效解决加载大图片时内存溢出的问题 博客分类: Android Android游戏虚拟机算法JNI 尽量不要使用setImageBitmap或 setImageResource或 Bit ...
- Delphi7 第三方控件1stClass4000的TfcImageBtn按钮控件动态加载jpg图片例子
Delphi7 第三方控件1stClass4000的TfcImageBtn按钮控件动态加载jpg图片例子 procedure TForm1.Button1Click(Sender: TObject); ...
- Adobe Edge Animate –解决图形边缘精确检测问题-通过jquery加载svg图片
Adobe Edge Animate –解决图形边缘精确检测问题-通过jquery加载svg图片 版权声明: 本文版权属于 北京联友天下科技发展有限公司. 转载的时候请注明版权和原文地址. 在edge ...
- android95 缩放加载大图片
MainActivity: package com.itheima.loadimage; import android.os.Bundle; import android.app.Activity; ...
- Android(java)学习笔记236:多媒体之加载大图片到内存(Bitmap API)
1.Bitmap (API使用) android里面的bitmap中,一个像素点需要4个byte去表示,这是因为android表示颜色是" argb ":其中 a 表示是透明度,然 ...
随机推荐
- MyBatisCodeHelper-Pro插件破解
MyBatisCodeHelper-Pro: MyBatisCodeHelper-Pro是IDEA下的一个插件,功能类似mybatis plugin. 但是是收费的,我们可以对他进行破解 转载出处:h ...
- Dubbo配置完全外部化实践,使用动态配置中心的注意事项
问题描述 近期开发项目,将Dubbo的配置全部外部化到动态配置中心.这里配置中心我使用的是Apollo. @Configuration public class DubboConfig { @Bean ...
- Redis(十二)flush误操作、Redis安全、处理bigkey和寻找热点key
一.flushall/flushdb误操作的处理 假设进行flush操作的Redis是一对主从结构的主节点,其中键值对的个数是100万,每秒写入量是1000. 1.缓存与存储 被误操作flush后,根 ...
- p6spy打印SQL
一 Springboot项目 <dependency> <groupId>p6spy</groupId> <artifactId>p6spy</a ...
- OpenCV图像处理以及人脸识别
OpenCV基础 OpenCV是一个开源的计算机视觉库.提供了很多图像处理常用的工具 批注:本文所有图片数据都在我的GitHub仓库 读取图片并显示 import numpy as np import ...
- 放棋子:组合数/dp/容斥原理
题目传送门 啊又是一个考场上没拿到的水题,差一步!! 组合数,先打个杨辉三角吧. 显然棋子应该一种一种的放,这很dp. 而且棋子一旦放下,那么它所在的行列就只能放这种颜色的棋子了. 设dp[i][x] ...
- 「2019.8.11 考试」一套把OI写的很诗意的题
这次写的更惨了,T2暴力再次挂掉了. 先写了T1的75暴力,然后写了T2的70分暴力(挂成了25),T3啥也不会骗了12分.T3看完题一点思路没有,心态爆炸了,一直在观察数据,忽略的思考的重要性,以至 ...
- 简述同步和异步,以及js的任务队列.
javascript是单线程的一门语言,所以在执行任务的时候,所有任务必须排队,然后一个一个的执行.这就是同步模式 所以同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个 ...
- restapi(9)- caching, akka-http 缓存
restapi作为前后端交互的枢纽:面对大批量的前端请求,需要确保回复的及时性.使用缓存是一项有效工具.我们可以把多数前端请求的回复response存入缓存,特别是一些需要大量计算才能获取的回复值,更 ...
- 2019.11.11&12题解
Day1 考的不是很好,T1T2没区分度,T3想的太少,考试后期几乎都是在摸鱼,bitset乱搞也不敢打,只拿到了35分,跟前面的差距很大 A. 最大或 标签: 二进制+贪心 题解: 首先x,y中一定 ...