Checking for missing content type metadata ...
This resource contains content types with missing metadata required to make it public or discoverable. Show missing content type metadata.
Click on the edit button ( ) below to edit this resource.
Checking for non-preferred file/folder path names (may take a long time depending on the number of files/folders) ...
This resource contains some files/folders that have non-preferred characters in their name. Show non-conforming files/folders.
This resource contains content types with files that need to be updated to match with metadata changes. Show content type files that need updating.
| Authors: |
|
|
|---|---|---|
| Owners: |
|
This resource does not have an owner who is an active HydroShare user. Contact CUAHSI (help@cuahsi.org) for information on this resource. |
| Type: | Resource | |
| Storage: | The size of this resource is 792.4 MB | |
| Created: | Aug 24, 2026 at 3:48 a.m. (UTC) | |
| Last updated: | Aug 24, 2026 at 7:59 p.m. (UTC) | |
| Citation: | See how to cite this resource | |
| Content types: | Geographic Raster Content CSV Content |
| Sharing Status: | Public |
|---|---|
| Views: | 68 |
| Downloads: | 1 |
| +1 Votes: | Be the first one to this. |
| Comments: | No comments (yet) |
Abstract
This resource contains the code, notebooks, pinned software environment, regenerated training samples, validation outputs, run manifest and provenance records, annual conifer-area tables, derived GeoTIFFs, figures, and comparison-run evidence supporting the analysis of coniferous forest change in tributary basins of the Great Salt Lake, Utah, USA, from 1986–2025. The analysis uses Landsat Collection 2 Level-2 surface reflectance, National Land Cover Database training labels, a 100-member random-forest ensemble, and a fixed 30 m EPSG:5070 analysis grid. The deposited materials reproduce the reported area estimates, accuracy assessment, spatial agreement and change products, and trend analyses. Public source datasets are not redistributed; their use and provenance are documented in the notebooks and run records. Earth Engine asset identifiers are retained as provenance for the completed run but are not transferable to other accounts. The README provides the archive structure, software setup, and instructions for adapting the code to a reuser’s own Earth Engine project.
Subject Keywords
Coverage
Spatial
Temporal
| Start Date: | |
|---|---|
| End Date: |
Content
readme.md
Conifer encroachment in the Great Salt Lake tributary basins, 1986-2025
Data, code and derived map products for the associated article.
Run rev3_median_20260818 · released 2026-08-23 · 217 files, 412.4 MB
DOI: to be inserted on publication
What this is
Annual conifer (NLCD class 42) extent across the twelve HUC8 tributary basins of the Great Salt Lake, 1986-2025, mapped from Landsat Collection 2 Level 2 surface reflectance with a 100-member random-forest ensemble trained on NLCD labels. The archive contains everything needed to reproduce the published numbers: the notebooks and analysis code, the pinned environment, the regenerated training samples, all 52,000 annual-area rows, the spatially blocked validation tables, the map products as GeoTIFFs, the study-area geometry, and the six published figures.
Headline result: a Sen's slope of 27.17 km2/yr (Mann-Kendall Z = 3.41, p = 0.00064), a trend-derived change of +1,060 km2 over the record, and a held-out class-42 F1 of 0.638.
Folder guide
| Folder | What is in it |
|---|---|
code/ |
The analysis modules, the terminal scripts, and the test suite. Start with code/README.md. |
notebooks/ |
The three run notebooks, executed in order, one checkpoint at a time. Outputs are cleared. |
environment/ |
Pinned Conda and pip environment records. |
runs/rev3_median_20260818/ |
Every output of the run. See RUN_README.md inside it. |
comparison_runs/ |
Two alternatives the article says were evaluated and rejected. Evidence, not results. |
Supporting files at this level: FILE_MANIFEST.csv (every file with its size, checksum and a
one-line description), SHA256SUMS.txt (checkable with sha256sum -c), as_run.patch (see
Verifying the code below), LICENSE and LICENSE-DATA.md.
Reproducing the analysis
```bash conda env create -f environment/environment-lock.yml # creates the gsl-rev3 environment conda activate gsl-rev3
earthengine authenticate # your own credentials python code/verify_setup.py # expects 21/21 jupyter lab notebooks/ ```
Set your own Earth Engine project first. The code is archived exactly as it ran, so it still
names the cloud project that produced these results, ee-guspwilliams, in each script and at the top
of each notebook:
python
EE_PROJECT = "ee-guspwilliams" # <-- change this to your own project
It is not a credential and it grants nothing; it is simply the record of what ran. You cannot use
it — Earth Engine projects are per-account — so replace it with yours in code/verify_setup.py,
code/verify_area_grids.py, and the Rev3Config(...) construction near the top of
code/check_area_csvs.py, apply_basin_mask.py, run_composite_stats.py,
analyse_composite_stats.py, analyse_fire_overlap.py and fetch_figure_context.py, plus the
first code cell of each notebook. A find-and-replace across code/ and notebooks/ does it.
Run the notebooks in order and never use Run All: every launch cell needs its CONFIRM string
and a reset afterwards. Select the gsl-rev3 kernel — the default python3 kernel has no rasterio.
To regenerate the figures from what is already here, with no Earth Engine account at all:
bash
python code/make_publication_figures.py
Earth Engine assets are not transferable. The asset IDs recorded throughout — in
runs/rev3_median_20260818/manifests/run_manifest.json, in the classifier column of every raw area table, and
in the map tables — are a record of what ran, not an endpoint you can read. The notebooks therefore reproduce the pipeline
against your own project rather than re-reading the original assets. Everything downstream of the
exports reproduces exactly from the files here.
How the exports arrive
Earth Engine writes to Google Drive, and the transfer to the local run directory is a manual
copy, by design: the work ran on a machine that could launch tasks but not be relied on to stay
up, so nothing was allowed to fail unattended. GSL_DRIVE_DIR names the folder to copy from.
The alternative, if you would rather not do that by hand, is to run the whole thing in Google Colab from a Drive-mounted folder, so exports land beside the code. That works and removes the copy step; it is simply not how these results were produced, and the record should say so.
Verifying the code
runs/rev3_median_20260818/manifests/run_manifest.json records a SHA-256 for each analysis module as it ran.
The code here is that code. The only edits made when this archive was staged were paths, so that
the archive runs from its own directory instead of from the author's machine: one path segment
dropped in rev3_config.py, a parents[2] that became parents[1] in six scripts and in the
notebook preamble, and the working-tree paths in a few usage docstrings. Nothing else was touched —
not the logic, not the parameters, and not the Earth Engine project name.
Those few files therefore do not match their recorded hashes. as_run.patch is the short public
source-path diff. It deliberately excludes removed notebook execution output and one private local
usage path, so it is an audit trail rather than a way to recreate those private bytes:
bash
git apply --reverse as_run.patch # or: patch -R -p1 < as_run.patch
FILE_MANIFEST.csv carries both hashes per file: sha256 for the file as deposited, and
sha256_as_run for the working-tree original where staging changed it. The original hashes retain
the provenance record without disclosing the removed private content.
What the products are
- Annual area tables (
annual_area_raw/) — one row per basin, year and ensemble seed: conifer area and valid analysis area in m2, with the CRS and grid transform on every row. 40 years x 100 seeds x 13 regions (twelve basins plus their union) = 52,000 rows. - Vote rasters (
rasters/gee_exports/*_votes_y*.tif) — per-pixel count, 0-100, of ensemble members classifying the pixel as conifer, for each of the four map years. - Change raster (
*_change_y1986_2025_masked.tif) — endpoint change classified as stable non-conifer, loss, gain, and stable conifer, at a 51-vote consensus threshold. - Validation tables (
validation/) — spatially blocked five-fold precision, recall and F1 for class 42, per fold and per seed, with the pooled summary. - Training samples (
training_backups/) — the eight per-epoch GeoJSONs the classifiers were trained on. - Study-area geometry (
provenance/tributary_union.geojson) — the dissolved boundary every reported area was reduced over. Until this archive it existed only as twelve HUC8 codes in a configuration file.
Everything is on one grid: EPSG:5070 (NAD83 / Conus Albers), 30 m, transform
[30, 0, -2493045, 0, -30, 3310005]. Areas are computed with ee.Image.pixelArea() on that grid.
Limitations
- Class 42 in NLCD is evergreen forest, not a species map. The article discusses what that does and does not support.
- 2024 is the largest single-year excursion in the record, flagged at 4.7 median absolute deviations by a pre-registered screen. It is not used as an endpoint; Section 3.2 explains why.
- The seasonal composites are sensitive to Landsat availability in the sparsest early years. The
composite statistics in
provenance/are the evidence for how much. - Accuracy is assessed against NLCD, which is itself a model product. The agreement tables in
manuscript_tables/should be read as concordance, not as ground truth.
Sources and licences
Code is MIT; the derived data products are CC0 1.0. See LICENSE and LICENSE-DATA.md.
The public inputs — Landsat Collection 2 Level 2, NLCD, SRTM, the Watershed Boundary Dataset, JRC Global Surface Water, MTBS and SNOTEL — are cited as sources, are not redistributed here, and are not covered by either licence.
Data Services
Credits
Funding Agencies
This resource was created using funding from the following sources:
| Agency Name | Award Title | Award Number |
|---|---|---|
| U.S. National Science Foundation | None | 2135732 |
How to Cite
This resource is shared under the Creative Commons Attribution CC BY.
http://creativecommons.org/licenses/by/4.0/
Comments
There are currently no comments
New Comment