openlayers6【十六】vue overlay类实现gif动态图标效果详解

news/2024/7/24 11:34:05

文章目录

    • 1. 写在前面
    • 2. 效果图
    • 3. 使用overlay类,地图添加动态图标
    • 4. css设置gif图标
    • 5. 完整代码

1. 写在前面

  1. openlayer 里面支持 gif 图标上图的只有 overlay类 可以实现,矢量图层 Vector 不能设置动态的gif图标,只能设置静态的 png,jpg文件,或者base64等数据
  2. overlay类 的常见使用场景更多可以看看这篇文章 地图覆盖物overlay三种常用用法 popup弹窗,marker标注,text文本
  3. openlayers 不支持 svga 动画图(亲测)

2. 效果图

在这里插入图片描述

3. 使用overlay类,地图添加动态图标

原理:其实就是 overlay 类创建可以通过绑定 element 属性在地图上,通过属性的css设置gif图标的样式即可。

方法详解:

  1. 先在页面获取到map元素,通过遍历coordinates的数据,创建span元素,追加在页面中
  2. 创建 overlay 类,通过 element 属性与上面创建的 span 进行绑定
  3. 最后把 overlayer 类添加到 map 中
// 使用Overlay添加GIF动态图标点位信息方法
addGif() {
    let _that = this;
    let mapDom = this.$refs.map; // 获取map地图dom元素
    for (let i = 0; i < this.coordinates.length; i++) {
        var oDiv = document.createElement("span"); // 遍历coordinates创建span元素
        oDiv.id = "gif-" + i; //设置元素的id值
        mapDom.appendChild(oDiv); //span追加到map中
        this.$nextTick(() => {
            this.markerPoint = new Overlay({ // 创建一个Overlay类
                position: fromLonLat([
                    _that.coordinates[i][0],
                    _that.coordinates[i][1]
                ]),//设置Overlay的经纬度位置
                positioning: "center-center",
                element: document.getElementById("gif-" + i),// 把上面的创建的元素绑定在Overlay中
                stopEvent: false
            });
            this.map.addOverlay(this.markerPoint);
        });
    }
}

我们看下dom元素的内容
在这里插入图片描述

4. css设置gif图标

页面有了dom元素,剩下的就是设置样式了,就是基础的css操作了。

.ol-overlay-container {
    span {
        display: block;
        width: 20px;
        height: 42px;
        border-radius: 50%;
        background: url("../../assets/images/people.gif") no-repeat;
        background-size: 20px 42px;
    }
}

5. 完整代码

<template>
    <div id="content">
        <div id="map" ref="map"></div>
    </div>
</template>

<script>
import "ol/ol.css";
import { Map, View } from "ol";
import TileLayer from "ol/layer/Tile";
import OSM from "ol/source/OSM";
import Overlay from "ol/Overlay";
import { fromLonLat } from "ol/proj";

// 弹出窗口实现
export default {
    name: "gif",
    data() {
        return {
            map: null,
            overlay: null,
            markerPoint: null,
            // 点信息
            coordinates: [
                [87.532236, 44.284182],
                [104.043505, 30.58165],
                [116.397289, 39.928632]
            ]
        };
    },
    methods: {
    	// 初始化地图
        initMap() {
            let target = "map";
            let tileLayer = new TileLayer({
                source: new OSM()
            });
            let view = new View({
                center: fromLonLat([104.912777, 34.730746]),
                zoom: 4.5
            });
            this.map = new Map({
                target: target,
                layers: [tileLayer],
                view: view
            });
        },
		// 使用Overlay添加GIF动态图标点位信息
		addGif() {
		    let _that = this;
		    let mapDom = this.$refs.map;
		    for (let i = 0; i < this.coordinates.length; i++) {
		        var oDiv = document.createElement("span");
		        oDiv.id = "gif-" + i;
		        mapDom.appendChild(oDiv);
		        this.$nextTick(() => {
		            this.markerPoint = new Overlay({
		                position: fromLonLat([
		                    _that.coordinates[i][0],
		                    _that.coordinates[i][1]
		                ]),
		                positioning: "center-center",
		                element: document.getElementById("gif-" + i),
		                stopEvent: false
		            });
		            this.map.addOverlay(this.markerPoint);
		        });
		    }
		}
    },
    mounted() {
        this.initMap();
        this.addGif();
    }
};
</script>
<style lang='scss' scope="scoped">
.ol-overlay-container {
    span {
        display: block;
        width: 20px;
        height: 42px;
        border-radius: 50%;
        background: url("../../assets/images/people.gif") no-repeat;
        background-size: 20px 42px;
    }
}
</style>

http://www.niftyadmin.cn/n/1494685.html

相关文章

dfs | 洛谷 | P1219 八皇后

https://www.luogu.org/problemnew/show/P1219 TLE代码 #include <bits/stdc.h> #define FF(a,b) for(int a0;a<b;a) #define LEN 20using namespace std; int N; int x[LEN]; int ans0;bool legal(int *a,int n){map<int,bool> exist_p_diag,exist_n_diag;fo…

Natural Language Process 资源汇总

NLP Progress https://nlpprogress.com/转载于:https://www.cnblogs.com/zhangze007/p/10406706.html

openlayers6【十七】vue VectorLayer矢量图层画地图省市区,多省市区(粤港澳大湾区)效果详解

文章目录1. VectorLayer矢量图层的理解2. openlayers通过坐标点画中国地图2.1 准备边界的 data 数据2.2 准备 china.json 的数据文件2.3 实现区域描边方法详解2.4 完整代码4. 画省&#xff0c;市&#xff0c;区的边界效果4.1 如&#xff1a;四川省&#xff08;下载对应的geo js…

code::blocks 使用笔记

文章目录build找不到main.o 的问题运行说找不到文件build找不到main.o 的问题 把路径换成全英文 运行说找不到文件 设置显示终端为系统终端 deepin-terminal -T $TITLE -x

openlayers6【十八】vue VectorLayer矢量图层实现批量图标点位上图功能详解

文章目录1. 写在前面2. openlayers实现批量标注点详解3. 完整代码1. 写在前面 对于 VectorLayer矢量图层 的理解可以看下 openlayers 6【四】地图图层Layers详解 的内容&#xff0c;及上一篇的VectorLayer矢量图层的实际应用绘制区域的案例。下面将实现的是在地图上根据经纬度…

javascript的简单模板替换

维护一些老项目的时候&#xff0c;有时候会出现特别神奇的代码&#xff0c;比如 $(#title).text(data.title); $(#content).text(data.content); $(#author).text(data.author); 复制代码如上几行还是可以接受的&#xff0c;但是如果是20行呢&#xff1f;40行呢&#xff1f; 所…

openlayers6【十九】vue HeatmapLayer热力图层实现热力图效果详解

文章目录1. 写在前面2. Heatmap 类实现热力图2.1 Heatmap 参数2.2 实现热力图3. 完整代码4. 添加删除map图层的方法5. 热力图自身的get&#xff0c;set方法1. 写在前面 本问下面有矢量图层设置的区域&#xff0c;和热力图层设置的热力图的效果&#xff0c;区域绘制效怎么设置详…

freemarker 操作字符串

1、substring&#xff08;start,end&#xff09;从一个字符串中截取子串 start:截取子串开始的索引&#xff0c;start必须大于等于0&#xff0c;小于等于endend: 截取子串的长度&#xff0c;end必须大于等于0&#xff0c;小于等于字符串长度&#xff0c;如果省略该参数&#xf…