openlayers 2实现vector图层文字标注


图层绑定要素属性实现文字标注,注意是openlayers2不是3
大概的思路是,继承OpenLayers.Layer.Vector,监听图层添加要素的事件,创建dom节点,添加到map的容器之中,同时地图放大缩小,文字标注跟随移动(根据分辨路重新计算位置),图层移除要素,移除标注;
初始化

/**
     * Constructor: OpenLayers.Layer.E_Vector
     */
    initialize : function(layerName,options) {
        OpenLayers.Layer.Vector.prototype.initialize.apply(this,arguments);
        this.annotations = [];  
    },

创建标注

/**
     * 创建标注
     * @param data
     */
    createAnnotation :function(data){
        if(!this.annotationsVisible && data.feature.layer != this)return;
        if(data.feature.attributes != null
            && data.feature.attributes.annotationDisplay != null
            && data.feature.attributes.annotationDisplay==false)
            return;
        if(data.feature.attributes.hasOwnProperty(this.bindFiled)==false)return;
        for (var i = 0, len = this.annotations.length; i < len; i++) {
            if (this.annotations[i].feature == data.feature) {
                return;
            }
        }
        var lglt = null;
        if (data.feature.geometry instanceof OpenLayers.Geometry.Point) {
            lglt = data.feature.geometry.getBounds().getCenterLonLat();
        } else if (data.feature.geometry instanceof OpenLayers.Geometry.LineString) {  //取线图形的中部作为展示标注的位置
            var lineGeos = data.feature.geometry.getVertices();
            lglt = lineGeos[parseInt(lineGeos.length / 2)].getBounds().getCenterLonLat();
        } else if (data.feature.geometry instanceof OpenLayers.Geometry.Polygon) {    //取面图形的中心作为展示标注的位置
            var point = data.feature.geometry.getCentroid();
            lglt = point.getBounds().getCenterLonLat();
        }
        var px = this.map.getLayerPxFromLonLat(lglt).add(this.annotationOffset.x,this.annotationOffset.y);
        //size 可以根据自己需要写到外部
        var size = new OpenLayers.Size(120,30);
        var divId = OpenLayers.Util.createUniqueID("E_Annotation"+"_");
        var anDiv = OpenLayers.Util.createDiv(divId, px, size,null, null, null, "hidden");
        this.map.layerContainerDiv.appendChild(anDiv);
        anDiv.innerHTML = data.feature.attributes[this.bindFiled];
        anDiv.style.zIndex = 250;
        this.annotations.push({feature:data.feature,div:anDiv});
    },

初始化标注的时候监听

        this.events.on({"featureadded": this.createAnnotation});//监听featureadded事件
        this.events.on({"featureremoved": this.deleteAnnotation});//监听featureremoved事件

大概的思路就这样,最后贴代码:
https://git.oschina.net/leez/OpenLayers2_EXT.git

转载自:https://blog.csdn.net/u010468602/article/details/51759653

You may also like...