gee-community/geemap

[EE Tile Layers] Strange behavior when ussing cm.palettes

ccsuehara opened this issue · 3 comments

Environment Information

Please run the following code on your computer and share the output with us so that we can better debug your issue:

image

Description

Hello! I'm bumping into a strange behavior of geemap when using cm.palettes in the visualization. After defining the viz params, if I use the vizparam variable more than once (and since my layers are part of the different collection, just for different years), the following appears:

ValueError: The palette must be a list of colors, a string, or a Box object.

This appears even though the cm.palettes.Spectral is a Box object.

What I Did

import geemap.foliumap as geemap

# Load 2012 MODIS land cover and select the IGBP classification.
cover = ee.Image('MODIS/051/MCD12Q1/2012_01_01').select('Land_Cover_Type_1')
cover2 = ee.Image('MODIS/051/MCD12Q1/2011_01_01').select('Land_Cover_Type_1')

# Define a palette for the 18 distinct land cover classes.
igbp_palette = cm.palettes.Spectral

vizParams = {'min': 0, 'max': 17, 'palette': igbp_palette}
vizParams_2 = {'min': 0, 'max': 17, 'palette': igbp_palette}


# Define a map centered on the United States.
Map = geemap.Map()

# Add the image layer to the map and display it. Specify the min and max labels
# and the color palette matching the labels.
Map.addLayer(
    cover, vizParams, 'IGBP classes 2012')

# Map.addLayer(   
#     cover2,  vizParams,'IGBP classes 2011') // This line causes the Error


Map.addLayer(
    cover2,  vizParams_2,'IGBP classes 2011') // This line runs without an issue 

Map

Thanks so much!

I think that _validate_palette should allow type tuple.

Here is a test of what the palette looks like before and after going through .addLayer()

print(vizParams)
Map.addLayer(cover, vizParams, 'IGBP classes 2012')

print(vizParams)
Map.addLayer( cover2,  vizParams, 'IGBP classes 2011')
{'min': 0, 'max': 17, 'palette': Box({'default': ('9e0142', 'a00343', 'a20643', 'a40844', 'a70b44', 'a90d45', 'ab0f45', 'ad1246', 'af1446', 'b11747', 'b41947', 'b61b48', 'b81e48', 'ba2049', 'bc2249', 'be254a', 'c1274a', 'c32a4b', 'c52c4b', 'c72e4c', 'c9314c', 'cb334d', 'cd364d', 'd0384e', 'd23a4e', 'd43d4f', 'd63f4f', 'd7414e', 'd8434e', 'd9444d', 'da464d', 'dc484c', 'dd4a4c', 'de4c4b', 'df4e4b', 'e1504b', 'e2514a', 'e3534a', 'e45549', 'e55749', 'e75948', 'e85b48', 'e95c47', 'ea5e47', 'eb6046', 'ed6246', 'ee6445', 'ef6645', 'f06744', 'f26944', 'f36b43', 'f46d43', 'f47044', 'f57245', 'f57547', 'f57748', 'f67a49', 'f67c4a', 'f67f4b', 'f7814c', 'f7844e', 'f8864f', 'f88950', 'f88c51', 'f98e52', 'f99153', 'f99355', 'fa9656', 'fa9857', 'fa9b58', 'fb9d59', 'fba05b', 'fba35c', 'fca55d', 'fca85e', 'fcaa5f', 'fdad60', 'fdaf62', 'fdb163', 'fdb365', 'fdb567', 'fdb768', 'fdb96a', 'fdbb6c', 'fdbd6d', 'fdbf6f', 'fdc171', 'fdc372', 'fdc574', 'fdc776', 'fec877', 'feca79', 'fecc7b', 'fece7c', 'fed07e', 'fed27f', 'fed481', 'fed683', 'fed884', 'feda86', 'fedc88', 'fede89', 'fee08b', 'fee18d', 'fee28f', 'fee491', 'fee593', 'fee695', 'fee797', 'fee999', 'feea9b', 'feeb9d', 'feec9f', 'feeda1', 'feefa3', 'fff0a6', 'fff1a8', 'fff2aa', 'fff3ac', 'fff5ae', 'fff6b0', 'fff7b2', 'fff8b4', 'fffab6', 'fffbb8', 'fffcba', 'fffdbc', 'fffebe', 'ffffbe', 'fefebd', 'fdfebb', 'fcfeba', 'fbfdb8', 'fafdb7', 'f9fcb5', 'f8fcb4', 'f7fcb2', 'f6fbb0', 'f5fbaf', 'f4faad', 'f3faac', 'f2faaa', 'f1f9a9', 'f0f9a7', 'eff9a6', 'eef8a4', 'edf8a3', 'ecf7a1', 'ebf7a0', 'eaf79e', 'e9f69d', 'e8f69b', 'e7f59a', 'e6f598', 'e4f498', 'e1f399', 'dff299', 'ddf19a', 'daf09a', 'd8ef9b', 'd6ee9b', 'd3ed9c', 'd1ed9c', 'cfec9d', 'cdeb9d', 'caea9e', 'c8e99e', 'c6e89f', 'c3e79f', 'c1e6a0', 'bfe5a0', 'bce4a0', 'bae3a1', 'b8e2a1', 'b5e1a2', 'b3e0a2', 'b1dfa3', 'aedea3', 'acdda4', 'aadca4', 'a7dba4', 'a4daa4', 'a2d9a4', '9fd8a4', '9cd7a4', '99d6a4', '97d5a4', '94d4a4', '91d3a4', '8fd2a4', '8cd1a4', '89d0a4', '86cfa5', '84cea5', '81cda5', '7ecca5', '7ccaa5', '79c9a5', '76c8a5', '74c7a5', '71c6a5', '6ec5a5', '6bc4a5', '69c3a5', '66c2a5', '64c0a6', '62bda7', '60bba8', '5eb9a9', '5cb7aa', '5ab4ab', '58b2ac', '56b0ad', '54aead', '52abae', '50a9af', '4ea7b0', '4ba4b1', '49a2b2', '47a0b3', '459eb4', '439bb5', '4199b6', '3f97b7', '3d95b8', '3b92b9', '3990ba', '378ebb', '358bbc', '3389bd', '3387bc', '3585bb', '3682ba', '3880b9', '3a7eb8', '3b7cb7', '3d79b6', '3f77b5', '4175b4', '4273b3', '4471b2', '466eb1', '486cb0', '496aaf', '4b68ae', '4d65ad', '4e63ac', '5061aa', '525fa9', '545ca8', '555aa7', '5758a6', '5956a5', '5b53a4', '5c51a3', '5e4fa2'), 'n03': ('9e0142', 'ffffbf', '5e4fa2'), 'n04': ('9e0142', 'fdbf6f', 'bfe5a0', '5e4fa2'), 'n05': ('9e0142', 'f88d52', 'ffffbf', '89d0a4', '5e4fa2'), 'n06': ('9e0142', 'f46d43', 'fee08b', 'e6f598', '66c2a5', '5e4fa2'), 'n07': ('9e0142', 'ea5d47', 'fdbf6f', 'ffffbf', 'bfe5a0', '55afad', '5e4fa2'), 'n08': ('9e0142', 'e2524a', 'fca55d', 'fee99a', 'edf8a3', 'a1d9a4', '48a1b3', '5e4fa2'), 'n09': ('9e0142', 'dd4a4c', 'f88d52', 'fed380', 'ffffbf', 'd7ef9b', '89d0a4', '3f97b7', '5e4fa2'), 'n10': ('9e0142', 'd8434e', 'f67b4a', 'fdbf6f', 'feeea2', 'f1f9a9', 'bfe5a0', '75c8a5', '388eba', '5e4fa2'), 'n11': ('9e0142', 'd53e4f', 'f46d43', 'fdae61', 'fee08b', 'ffffbf', 'e6f598', 'abdda4', '66c2a5', '3288bd', '5e4fa2'), 'n12': ('9e0142', 'd0384e', 'ee6445', 'fb9c59', 'fece7c', 'fff1a7', 'f4faad', 'd1ec9c', '98d6a4', '5db7a9', '3683bb', '5e4fa2')})}
{'min': 0, 'max': 17, 'palette': ('9e0142', 'a00343', 'a20643', 'a40844', 'a70b44', 'a90d45', 'ab0f45', 'ad1246', 'af1446', 'b11747', 'b41947', 'b61b48', 'b81e48', 'ba2049', 'bc2249', 'be254a', 'c1274a', 'c32a4b', 'c52c4b', 'c72e4c', 'c9314c', 'cb334d', 'cd364d', 'd0384e', 'd23a4e', 'd43d4f', 'd63f4f', 'd7414e', 'd8434e', 'd9444d', 'da464d', 'dc484c', 'dd4a4c', 'de4c4b', 'df4e4b', 'e1504b', 'e2514a', 'e3534a', 'e45549', 'e55749', 'e75948', 'e85b48', 'e95c47', 'ea5e47', 'eb6046', 'ed6246', 'ee6445', 'ef6645', 'f06744', 'f26944', 'f36b43', 'f46d43', 'f47044', 'f57245', 'f57547', 'f57748', 'f67a49', 'f67c4a', 'f67f4b', 'f7814c', 'f7844e', 'f8864f', 'f88950', 'f88c51', 'f98e52', 'f99153', 'f99355', 'fa9656', 'fa9857', 'fa9b58', 'fb9d59', 'fba05b', 'fba35c', 'fca55d', 'fca85e', 'fcaa5f', 'fdad60', 'fdaf62', 'fdb163', 'fdb365', 'fdb567', 'fdb768', 'fdb96a', 'fdbb6c', 'fdbd6d', 'fdbf6f', 'fdc171', 'fdc372', 'fdc574', 'fdc776', 'fec877', 'feca79', 'fecc7b', 'fece7c', 'fed07e', 'fed27f', 'fed481', 'fed683', 'fed884', 'feda86', 'fedc88', 'fede89', 'fee08b', 'fee18d', 'fee28f', 'fee491', 'fee593', 'fee695', 'fee797', 'fee999', 'feea9b', 'feeb9d', 'feec9f', 'feeda1', 'feefa3', 'fff0a6', 'fff1a8', 'fff2aa', 'fff3ac', 'fff5ae', 'fff6b0', 'fff7b2', 'fff8b4', 'fffab6', 'fffbb8', 'fffcba', 'fffdbc', 'fffebe', 'ffffbe', 'fefebd', 'fdfebb', 'fcfeba', 'fbfdb8', 'fafdb7', 'f9fcb5', 'f8fcb4', 'f7fcb2', 'f6fbb0', 'f5fbaf', 'f4faad', 'f3faac', 'f2faaa', 'f1f9a9', 'f0f9a7', 'eff9a6', 'eef8a4', 'edf8a3', 'ecf7a1', 'ebf7a0', 'eaf79e', 'e9f69d', 'e8f69b', 'e7f59a', 'e6f598', 'e4f498', 'e1f399', 'dff299', 'ddf19a', 'daf09a', 'd8ef9b', 'd6ee9b', 'd3ed9c', 'd1ed9c', 'cfec9d', 'cdeb9d', 'caea9e', 'c8e99e', 'c6e89f', 'c3e79f', 'c1e6a0', 'bfe5a0', 'bce4a0', 'bae3a1', 'b8e2a1', 'b5e1a2', 'b3e0a2', 'b1dfa3', 'aedea3', 'acdda4', 'aadca4', 'a7dba4', 'a4daa4', 'a2d9a4', '9fd8a4', '9cd7a4', '99d6a4', '97d5a4', '94d4a4', '91d3a4', '8fd2a4', '8cd1a4', '89d0a4', '86cfa5', '84cea5', '81cda5', '7ecca5', '7ccaa5', '79c9a5', '76c8a5', '74c7a5', '71c6a5', '6ec5a5', '6bc4a5', '69c3a5', '66c2a5', '64c0a6', '62bda7', '60bba8', '5eb9a9', '5cb7aa', '5ab4ab', '58b2ac', '56b0ad', '54aead', '52abae', '50a9af', '4ea7b0', '4ba4b1', '49a2b2', '47a0b3', '459eb4', '439bb5', '4199b6', '3f97b7', '3d95b8', '3b92b9', '3990ba', '378ebb', '358bbc', '3389bd', '3387bc', '3585bb', '3682ba', '3880b9', '3a7eb8', '3b7cb7', '3d79b6', '3f77b5', '4175b4', '4273b3', '4471b2', '466eb1', '486cb0', '496aaf', '4b68ae', '4d65ad', '4e63ac', '5061aa', '525fa9', '545ca8', '555aa7', '5758a6', '5956a5', '5b53a4', '5c51a3', '5e4fa2')}

You can see that visParams has been altered, it only includes the default value, which is a tuple. This line (return palette["default"]) of _validate_palette is returning a tuple. I don't understand why it would be modifying the visParams input. Maybe a .copy() needs to be made?

So, I think two things need to be fixed:

  1. Allow tuple type - this seems valid.
  2. Don't allow input visParams dictionary to be modified - I'm not clear why this would happen.
giswqs commented

@ccsuehara Thank you for reporting. This bug has been fixed by @jdbcode in #1613. Run geemap.update_package() and restart the kernel to take effect.

BTW, your code can be simplified as follows. You can directly use Spectral as the palette. No need to import cm and use cm.palettes.Spectral.

import ee
import geemap.foliumap as geemap

Map = geemap.Map()

cover = ee.Image('MODIS/051/MCD12Q1/2012_01_01').select('Land_Cover_Type_1')
cover2 = ee.Image('MODIS/051/MCD12Q1/2011_01_01').select('Land_Cover_Type_1')

vizParams = {'min': 0, 'max': 17, 'palette': 'Spectral'}

Map.addLayer(
    cover, vizParams, 'IGBP classes 2012')
Map.addLayer(
    cover2,  vizParams,'IGBP classes 2011') 
Map

thank you very much @jdbcode and @giswqs !