jeudi 26 février 2015

OpenLayers 3 custom control doesn't get the map object


I've been playing around with extending controls in OpenLayers 3. I've built a control which grabs a legend image from a mapserver with a GetLegendGraphics request. However, when I add the control to the map, the map object doesn't get passed to the control. I think the inheritance works just fine, because the control does have a getMap() function, but it returns undefined. Does anyone have an idea what am I doing wrong?


Code:



var ol3_legend = function(e) {
var options = e || {};
var wmsVersion = options.wmsVersion || '1.3.0';
var format = options.format || 'image/png';
var legendP = document.createElement('p');
legendP.innerHTML = 'Legend:';
var legendDiv = document.createElement('div');
legendDiv.className = options.class + ' ol-unselectable';
legendDiv.appendChild(legendP);
var layers = this.getMap().getLayers().getArray();
for (var i=0;i<layers.length;i++) {
if (layers[i].get('showLegend') === true) {
try {
var url = layers[i].getSource().getUrls()[0];
}
catch(err) {
var url = layers[i].getSource().getUrl();
}
var legendImg = document.createElement('img');
legendImg.src = url + '&version=' + wmsVersion + '&service=WMS&request=GetLegendGraphic&sld_version=1.1.0&layer=' + layers[i].getSource().getParams().layers + '&format=' + format;
legendDiv.appendChild(legendImg);
}
}
ol.control.Control.call(this, {
element: legendDiv
});
}
ol.inherits(ol3_legend, ol.control.Control);

ol3_map.addControl(new ol3_legend({
class: 'ol_legend'
}));


Output:



Uncaught TypeError: Cannot read property 'getLayers' of undefined


Workaround (just the modified lines):



var layers = options.map.getLayers().getArray();

ol3_map.addControl(new ol3_legend({
map: ol3_map,
class: 'ol_legend'
}));


The problem is, that I have to provide the map object, which makes restrictions if I would like to reuse the code later.


Working fiddle.





Aucun commentaire:

Enregistrer un commentaire