opengeos / leafmap

A Python package for interactive mapping and geospatial analysis with minimal coding in a Jupyter environment
https://leafmap.org
MIT License
3.17k stars 374 forks source link

NDVI colortable range from [-1, 1] and usage #692

Closed anikaweinmann closed 6 months ago

anikaweinmann commented 6 months ago

Environment Information

Description

The colormap of NDVI ranges from 0 to 1 (see cm.plot_colormap(colors=cm.palettes.ndvi)), but for NDVI this makes no sense. It is defined from -1 to 1.

Trying to use the NDVI colormap failed.

What I Did

I was not able to use it by m.add_cog_layer(...) and the plot of the colormap failed:

cm.plot_colormap("ndvi")"
  File "<stdin>", line 1
    cm.plot_colormap("ndvi")"
                            ^
SyntaxError: unterminated string literal (detected at line 1)
>>> cm.plot_colormap("ndvi")
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/matplotlib/cm.py", line 131, in __getitem__
    return self._cmaps[item].copy()
KeyError: 'ndvi'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/aweinmann/.local/lib/python3.10/site-packages/leafmap/colormaps.py", line 238, in plot_colormap
    col_map = mpl.colormaps[cmap]
  File "/usr/lib/python3/dist-packages/matplotlib/cm.py", line 133, in __getitem__
    raise KeyError(f"{item!r} is not a known colormap name")
KeyError: "'ndvi' is not a known colormap name"

The terrain colormap works: cm.plot_colormap("terrain").

giswqs commented 6 months ago

Can you provide a complete code example that can reproduce issue?

giswqs commented 6 months ago

The add_cog_layer only supports matplotlib colormaps. You can use the greens colormap use render ndvi.

import leafmap

m = leafmap.Map()
url = "https://open.gishub.org/data/raster/landsat.tif"
m.add_cog_layer(url, bands=[4, 1, 2], name="Landsat")
m.add_cog_layer(url, expression='(b4-b1)/(b4+b1)', rescale='-1, 1', colormap_name='greens', name="NDVI")
m.add("inspector")
m

image

anikaweinmann commented 6 months ago

I tried it in https://github.com/mundialis/fossgis2024/blob/actinia-ws/notebooks/actinia_fossgis.ipynb. Using colormap_name="greens" is working. When I try the following:

result_url = jsonResponse["urls"]["resources"][0]
print(result_url)
raster_url = result_url.replace("//", f"//{actinia_user}:{actinia_pw}@")

# visualization with leafmap
m = leafmap.Map()
m.add_basemap("Esri.WorldImagery")
m.add_cog_layer(
    raster_url,
    label="NDVI map",
    colormap_name="ndvi",
)
# show map
m

I get the error message:

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
~/tmp/ipykernel_322494/2862253705.py in <module>
      6 m = leafmap.Map()
      7 m.add_basemap("Esri.WorldImagery")
----> 8 m.add_cog_layer(
      9     raster_url,
     10     label="NDVI map",

~/.local/lib/python3.10/site-packages/leafmap/leafmap.py in add_cog_layer(self, url, name, attribution, opacity, shown, bands, titiler_endpoint, zoom_to_layer, **kwargs)
    998         vis_bands = [available_bands[idx - 1] for idx in indexes]
    999 
-> 1000         tile_url = cog_tile(url, bands, titiler_endpoint, **kwargs)
   1001         bounds = cog_bounds(url, titiler_endpoint)
   1002         self.add_tile_layer(tile_url, name, attribution, opacity, shown)

~/.local/lib/python3.10/site-packages/leafmap/stac.py in cog_tile(url, bands, titiler_endpoint, **kwargs)
    209         f"{titiler_endpoint}/cog/{TileMatrixSetId}/tilejson.json", params=kwargs
    210     ).json()
--> 211     return r["tiles"][0]
    212 
    213 

KeyError: 'tiles'

I also tried to add rescalling of my Tif to [-1 , 1] or [0, 1], but it leads to the same error.