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

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>
以下是一个简单的 OpenLayers OverlayVue 组件结合的案例: 1. 在 Vue 组件中定义一个 div 元素,并设置其样式和位置,作为 OpenLayers Overlay 的容器。 ```html <template> <div class="map-overlay" ref="overlay"></div> </template> <style> .map-overlay { position: absolute; top: 10px; right: 10px; z-index: 100; } </style> ``` 2. 在 Vue 组件中引入 OpenLayers 库,并在 mounted 钩子函数中创建一个 Overlay 对象,并将其添加到地上。 ```javascript import ol from 'openlayers'; export default { mounted() { const map = new ol.Map({ target: 'map', // ... }); const overlay = new ol.Overlay({ element: this.$refs.overlay, positioning: 'top-right' }); map.addOverlay(overlay); } } ``` 3. 在 Vue 组件中定义一个方法,用于更新 Overlay 中的内容。这个方法可以根据需要接受一个参数,并将其渲染到 Overlay 容器中。 ```javascript export default { // ... methods: { updateOverlay(content) { this.$refs.overlay.innerHTML = content; } } } ``` 4. 在 Vue 组件中使用 updateOverlay 方法,更新 Overlay 中的内容。 ```javascript export default { // ... mounted() { // ... const overlay = new ol.Overlay({ element: this.$refs.overlay, positioning: 'top-right' }); map.addOverlay(overlay); // 更新 Overlay 内容 this.updateOverlay('Hello, World!'); } } ``` 这个案例中,我们使用了 OpenLayersOverlay 对象来创建一个浮动面板,然后将其与 Vue 组件结合,通过 updateOverlay 方法来更新 Overlay 中的内容。这种方式可以方便地将 OpenLayers 的地功能与 Vue 组件结合起来,实现更加灵活和丰富的交互效果
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Q_Q 忙里偷闲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值