zoukankan      html  css  js  c++  java
  • 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,50px,height:100px),格式{src:图片url,图片宽,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;
            }
  • 相关阅读:
    网络通信
    jvm调优
    rokectMq
    mybatis属性类
    spring cloud feign
    spring cloud hystrix
    spring cloud ribbon
    mybatis(二)创建代理类执行sql
    内存操作函数
    堆空间的开辟与使用
  • 原文地址:https://www.cnblogs.com/giser-s/p/11466465.html
Copyright © 2011-2022 走看看