Skip to content

Add CLMS LST sharpening with Landsat notebook - #132

Merged
mariiaShevchuk merged 3 commits into
mainfrom
add-clms-lst-landsat-sharpening
Oct 29, 2026
Merged

mariiaShevchuk merged 3 commits into
mainfrom
add-clms-lst-landsat-sharpening

Conversation

@azlinszkysinergise

Copy link
Copy Markdown
Collaborator

Adds sentinelhub/clms_lst_landsat_sharpening.ipynb. This is an end to end use case, It sharpens the hourly 3 km CLMS LST V3 to 100 m with a Landsat 8/9 residual field, using the Sentinel Hub Process API on CDSE. It then evaluates the method:

  • temporal stability of the residual pattern (Budapest, 2022–2024);
  • portability of the Landsat–CLMS bias across ten cities in different climate zones;
  • adequacy of the additive model;
  • an error budget from a leave-one-date-out validation.

Notes

  • Executed with outputs on the CDSE JupyterLab sentinelhub kernel; formatted with black 23.3.0; kernelspec sentinelhub.
  • Credentials: uses SHConfig(), and asks with getpass only when no credentials are configured. None are stored.
  • Not added to sentinelhub/.tests: a full run makes several hundred Process API requests and takes a long time.
  • Size ~7.4 MB (embedded figures), within the range of existing notebooks.
  • Archived on Zenodo: https://doi.org/10.5281/zenodo.22944002. This file is identical to the archived version.
  • Companion custom script: sentinel-hub/custom-scripts, data-fusion/clms_lst_sharpening_with_landsat.

🤖 Generated with Claude Code - fully checked and creation guided by me

Description:

PR Checklist:

  • Code is formatted and linted (Python linting action)
  • Kernel spec metadata was correctly set (check_kernelspec action)
  • Tests pass (test-samples action)
  • If applicable, documentation has been updated to reflect changes

Sharpens the hourly 3 km CLMS Land Surface Temperature V3 to 100 m with a
Landsat 8/9 residual field, and evaluates the method (residual stability,
cross-city bias portability, additive-model adequacy, leave-one-date-out
error budget). Executed on the CDSE JupyterLab sentinelhub kernel and
formatted with black. Archived on Zenodo: 10.5281/zenodo.22944002.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@azlinszkysinergise

Copy link
Copy Markdown
Collaborator Author

this is the pr for the custom script sentinel-hub/custom-scripts#375

@mariiaShevchuk mariiaShevchuk left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Really nice notebook, well thought-out!

I just found one thing that affects the city results in Part 3:
night -time Landsat images have cloud cover -1, so they get through the eo:cloud_cover < max_cloud filter. The notebook can't use them because B04 and B05 are empty at night, so there's no NDVI and every pixel comes back invalid.
I ran the same search and it looks like 3 cities are affected

  • London: 7 of 20 are night images
  • Brasilia: 7 of 20
  • Alicante: 3 of 20

Could you change the filter to eo:cloud_cover >= 0 AND eo:cloud_cover < {max_cloud} & rerun Part 3?
It would probably take quite some effort to update the city numbers in the text, and maybe conclusion, but I think it is worth it and London might make it into the comparison too then 🙂

Night-time Landsat acquisitions have eo:cloud_cover = -1 and passed the
scene search, wasting slots in the evenly spaced city subsets. The Catalog
filter now requires eo:cloud_cover >= 0. Re-executed on CDSE: Budapest is
unchanged, London now passes the thresholds (9 of 10 cities), and the
Result paragraphs and conclusions are updated, including the negative
skill found for London and Alicante.

Also: version 1.1 with the Zenodo concept DOI, the companion script's
cloud mask, an OAuth client link in the prerequisites, a land-mask note
in 10.1, advice to check skill on a second Landsat date, and an outlook
sentence on night-time calibration.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@azlinszkysinergise

Copy link
Copy Markdown
Collaborator Author

Thanks for catching the night-time scenes as an error source, I was not aware they existed! Now we have change the catalog filter, to eo:cloud_cover >= 0 AND eo:cloud_cover < {max_cloud} and re-ran the whole notebook on the CDSE Jupyter Lab.

  • Budapest (Parts 1-2) is unchanged: its 14 night scenes were already being dropped as empty, so the same 28 daytime pairs were used.
  • London now passes with 13 pairs, so 9 of 10 cities are in the comparison (only Novosibirsk is excluded). Brasilia and Alicante also gained pairs.
  • The bias conclusion holds (between-city spread 1.55 K vs 1.52 K within cities).
  • New finding: in London and Alicante the sharpened maps are on average worse than plain CLMS (skill -0.20 and -0.10). The text now discusses why, and the recommendations include checking the skill on a second same-season Landsat date before relying on the method for a new area.

All Result paragraphs and the conclusions are updated, and the notebook is now version 1.1 (also on Zenodo).

@mariiaShevchuk mariiaShevchuk left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you, looks great!

One small thing I noticed: the notebook is outside the sentinelhub/use_cases/ folder -is that intentional?
Otherwise looks ready to merge. (the failing checks aren't from this PR)

@azlinszkysinergise

Copy link
Copy Markdown
Collaborator Author

No, it should actually merge to the sentinelhub/use_cases folder - do I have to change something on my side?

Place the notebook in the use_cases folder like the other end-to-end
examples, and list it in sentinelhub/README.md. Content unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@azlinszkysinergise

Copy link
Copy Markdown
Collaborator Author

PR updated, content moved to sentinelhub/use_cases/ and added to the list in sentinelhub/README.md. The notebook content itself is unchanged.
ready to be merged on my side - if this is published by 4 November I can also show it at the Climate Visualization Conference

@mariiaShevchuk

mariiaShevchuk commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

Thanks, the latest commit covers it!

@mariiaShevchuk
mariiaShevchuk merged commit 189c3c8 into main Oct 29, 2026
2 of 5 checks passed
@mariiaShevchuk

Copy link
Copy Markdown
Contributor

Merged.
Since the notebook moved to use_cases/, the notebook link in the custom script README is now broken. I'll fix it, and update the citation to v1.1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants