setBasemap() not working on webmap with string or object value

07-11-2013 08:06 AM
New Contributor III

You can see in console both map objects reflect the change of basemap in _basemap and _layers has the new layer, but neither the string value 'topo' or an object of type esri/utils/Basemap work as a param to setBasemap() to successfully swap it out. what am i missing here?
0 Kudos
13 Replies
New Contributor III
nothing is wrong with the webmap if arcgis online let me build it this way. 

moved to jsfiddle
0 Kudos
Occasional Contributor II
The issue is webMaps by default don't honor the named values for basemaps.  You have to set a base map using setBaseMap before you can set another base maps.  My workaround is to use a dictionary that maps base maps titles to their valid string equivalent

then I remove the base map and useSetBaseMap of the equivalent

   //get title of basemap
var currentBasemapName = webmapResponse.itemInfo.itemData.baseMap.title
var bmNameEqiv = bmDict[currentBasemapName ];             esriMap.removeLayer(webmapResponse.itemInfo.itemData.baseMap.baseMapLayers[0].layerObject);
                //just reset the base map so we can use setBaseMap later
0 Kudos
New Contributor

Thanks for the answer, which is still helpful three more years later. This solution fixed the problem that setBaseMap cannot recognize the basemap from web map. 

I think the possible mechanism of setBaseMap() might be: Delete the basemap of map.basemapLayerIds, and then import the new one. 

0 Kudos
New Contributor

I had a similar problem setting the basemap using map.setBasemap and stumbled on this thread. After a bit of investigation I discovered that when using a webmap the map object holds a reference to the initial basemap as 'defaultBasemap'. You can see that by examining map.layerIds.  As long as that layer remains in the map, setting a new basemap with `map.setBasemap('topo')` will not work properly. The new layer gets added, but the 'defaultBasemap' layer remains. The easiest solution is removing the 'defaultBasemap' layer just before setting a new basemap. Here's how I achieved it:

const baseMap = map.getLayer('defaultBasemap');
if( baseMap ) {
0 Kudos