0

SETUP

OpenLayers / GeoServer + PostGIS

REQUIREMENT

I have a map with multiple WMS layers and of these I need to refresh a few after inserting a polygon in one of the layers.

PROBLEM

Given below are three options of the AJAX success callback function on successful insert of polygon geometry in the PostGIS backend and the corresponding errors/observations.

Option 1:

if(data == "SUCCESS")
{
   map.getLayersByName('dummy_nodes')[0].redraw(true);
   map.getLayersByName('bldg_logical')[0].redraw(true);  
}

// Throws error: Uncaught TypeError: Cannot call method 'redraw' of undefined

Option 2:

var tempLayer;
if(data == "SUCCESS")
{
   map.getLayersByName('dummy_nodes')[0].redraw(true);
   console.log("Prev cmd is successful");
   tempLayer = map.getLayersByName('bldg_logical')[0]
   tempLayer.redraw(true);  
}

// Outputs: 'Prev cmd is successful'
// tempLayer gives proper layer object: OpenLayers.Layer.WMS.OpenLayers.Class.initialize {metadata: Object, options: Object, singleTile: true, ratio: 1, isBaseLayer: false…}
// But still throws error: Uncaught TypeError: Cannot call method 'redraw' of undefined

Option 3:

if(data == "SUCCESS")
{
   map.getLayersByName('dummy_nodes')[0].redraw(true);
}

// Works fine (but I need both layers to be refreshed)

QUESTIONS

Could anyone let me know why the error occurs?
Is my usage wrong?
Does it have to do anything with the order in which the layers have been added to the map?

1
  • Are you doing anything besides this in the ajax call? Also I would reference the layers directly not with a method lookup. Commented Jun 15, 2014 at 6:19

1 Answer 1

1

It looks to me like your layers named 'bldg_logical' don't exist. 'Undefined' means you have an uninitialized property. This implies that the getLayersByName method isn't finding any layers named 'bldg_logical'.

2
  • If you check the Option 2 section, the tempLayer variable gets the Layer object ie., getLayersByName works and the first element is present in the result array which implies the bldg_logical layer is present. So why should it throw an undefined error in that case?
    – Siva
    Commented Jul 23, 2013 at 10:04
  • Are you sure? When map.getLayersByName('bldg_logical') doesn't find any match, it returns empty array []. So you can successfully do tempLayer = [][0] and tempLayer will be undefined. You should add console.log(tempLayer) before tempLayer.redraw(true); Commented Feb 5, 2016 at 7:28

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.