openlayer 利用overlay实现动画效果

思路:分割线段后 利用定时器控制gif图片的位置

import Overlay from 'ol/Overlay';
import Feature from 'ol/Feature';
import {LineString} from 'ol/geom.js';
import Style from 'ol/style/Style';
import Stroke from 'ol/style/Stroke';
import Point from 'ol/geom/Point';
/**
 * 直升机取水
 * coord : 起点
 * targetCoord : 终点
 * */
export function showQuShui(map,coord,targetCoord){

    targetCoord =  targetCoord || [115.83137799360136, 40.43483229118801];
    //创建直升机div
    let div = document.createElement("div");
    div.className = "mhzsj";
    let span = document.createElement("span");
    span.className = "mhzsj-title";
    span.innerHTML = "灭火直升机"
    div.appendChild(span);
    let mhzsjOverLay = new Overlay({
        className : "mhzsj-div",
        element : div,
        insertFirst : false,
        stopEvent : false,
        positioning: 'center-center'
    });
    div.onclick = function(){
        console.log("点击灭火取水直升机")
    }
    map.addOverlay(mhzsjOverLay);

    let zjsPath = new Feature({
        geometry:new LineString([coord,targetCoord],"XY")
    });
    let distance = zjsPath.getGeometry().getLength();
    let pathCoords = [];
    for(let i= 0; i< distance; i+= 0.0001){
        let  c =zjsPath.getGeometry().getCoordinateAt(i/distance);
        pathCoords.push(c);
    }
    mhzsjOverLay.setPosition(pathCoords[0]);
    let length = pathCoords.length;
    let idx = 0;
    //直升机状态 1:前往取水途中 2:取水中  3:返程  4:放水灭火中
    let zStatus = 1;

    let timer = setInterval(()=>{
        quShuiTimer();
    },1000/60);

    function quShuiTimer(){
        mhzsjOverLay.setPosition(pathCoords[idx]);
        if(zStatus === 1){
            idx ++ ;
            if(idx === length){
                zStatus = 2;//终点取水中
                span.innerHTML = "取水中";
                clearInterval(timer);
                setTimeout(()=>{
                    zStatus = 3;//取水完毕 返程
                    span.innerHTML = "灭火直升机";
                    timer =  setInterval(()=>{
                        quShuiTimer();
                    },1000/60)
                },3000)
            }
        }else if(zStatus === 3){
            idx --;
            if(idx === 0){
                zStatus = 4;//起点灭火中
                span.innerHTML = "灭火中";
                clearInterval(timer);
                setTimeout(()=>{
                    zStatus = 1;//洒水完毕 继续取水
                    span.innerHTML = "灭火直升机";
                    timer =  setInterval(()=>{
                        quShuiTimer();
                    },1000/60)
                },3000)
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值