diff --git a/.gitignore b/.gitignore
index aeeb83c..8d9ee25 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,6 @@
.DS_Store
+# Temporary Tutorial Content
+.book/tutorials/snowex-core/Downloads
# Jupyter Book things
.bash_history
diff --git a/book/_toc.yml b/book/_toc.yml
index d5e5aab..6584b73 100644
--- a/book/_toc.yml
+++ b/book/_toc.yml
@@ -20,10 +20,12 @@ parts:
- file: tutorials/index
sections:
- file: tutorials/example/tutorial-notebook
- - file: tutorials/albedo/index
- title: Albedo
+ - file: tutorials/snowex-core/index
+ title: Data Overview
sections:
- - file: tutorials/albedo/aviris-ng-data
+ - file: tutorials/snowex-core/01_snowex_data_overview
+ - file: tutorials/snowex-core/02_snowex_data_descriptions
+ - file: tutorials/snowex-core/03_snowex_data_preview
- file: tutorials/Data_access/index.md
title: Data Access
sections:
@@ -36,6 +38,10 @@ parts:
title: SWESARR
sections:
- file: tutorials/swesarr/swesarr_tut
+ - file: tutorials/albedo/index
+ title: Albedo
+ sections:
+ - file: tutorials/albedo/aviris-ng-data
- caption: Projects
chapters:
- file: projects/index
@@ -45,3 +51,5 @@ parts:
- file: reference/bibliography
- file: reference/questions
+
+
diff --git a/book/tutorials/snowex-core/01_snowex_data_overview.ipynb b/book/tutorials/snowex-core/01_snowex_data_overview.ipynb
new file mode 100644
index 0000000..c1998e4
--- /dev/null
+++ b/book/tutorials/snowex-core/01_snowex_data_overview.ipynb
@@ -0,0 +1,175 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "9a64ec36-bdfb-46e1-af66-77e0a1572c61",
+ "metadata": {},
+ "source": [
+ "![](./content/01_banner.png)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3d490f3b-f45b-41a0-b6fe-8e0ffc98fda6",
+ "metadata": {},
+ "source": [
+ "# SnowEx Field Campaigns Overview \n",
+ "(5 minutes)\n",
+ "\n",
+ "By: **Megan Mason** (NASA Goddard / SSAI) megan.a.mason@nasa.gov\n",
+ " \n",
+ "Support by: **Carrie Vuyovich** (NASA Goddard), **Hans-Peter Marshall** (Boise State), **Svetlana Stuefer** (University of Alaska Fairbanks)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "34c2b5cb-f193-41c5-816b-d7eecdb522ad",
+ "metadata": {},
+ "source": [
+ "```{admonition} Learning Objectives\n",
+ "* Visual overview of the NASA SnowEx field campaigns\n",
+ "* Get a sense for the extent of data coverage\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "dff0f23b-fd37-497f-9938-536e476dbba4",
+ "metadata": {},
+ "source": [
+ "![](./content/01_teaser.png)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e8861543-a4aa-4425-9b82-773e0ec56c45",
+ "metadata": {},
+ "source": [
+ "## Data Coverage\n",
+ "Each year we build upon our efforts to further investigate snow remote sensing science gaps identified in the NASA SnowEx Science Plan [(Durand et al., 2016)](https://snow.nasa.gov/sites/default/files/SnowEx_Science_Plan_v1.6.pdf). The summary table lists the focus for each campaign by year and type. There are two different campaign types (IOP vs. TS); both result in the same types of measurements and data products. Depending on the research application it may not matter at all which you choose to work with, or even combine! The important thing to grasp is the difference in spatial and temporal extent of the campaign periods. If the sampling protocols or data products change over time, it is for the sake of improvement. When possible, we aim to keep things consistent to continue to build a legacy data set. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ac7b22dd-1ebe-49f8-9cb8-8c990ef2c9b8",
+ "metadata": {},
+ "source": [
+ "| **Year** | **Campaign Type** | **Measurement Focus** |\n",
+ "| :----------- | :--------- |:------------------- |\n",
+ "| 2017 | IOP | Colorado, focused on multiple instruments in a forest gradient. |\n",
+ "| 2020 | IOP, TS | Western US, focused on Time Series of L-band InSAR, active/passive microwave for SWE and thermal IR for snow surface temp.|\n",
+ "| 2021 | TS | Western US, continued Time Series of L-band InSAR, also addressed prairie & snow albedo questions. |\n",
+ "| 2023 | IOP | Alaska Tundra & Boreal forest, focused on addressing SWE/snow depth and albedo objectives. |\n",
+ "\n",
+ "\n",
+ "*IOP=Intense Observation Period (~2-3 week, daily observations) *; *TS=Time Series (~3-5 month winter, weekly observations)*\n",
+ "_____"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "522552d1-cb33-4c69-b38f-df674b933183",
+ "metadata": {},
+ "source": [
+ "### Where has SnowEx Been?\n",
+ "Campaign efforts are focused on various snow climates in the Western United States. SnowEx partnerships and expertise are spread across the U.S and international.\n",
+ " \n",
+ "![](./content/01_snowex-map.png)\n",
+ "**Figure 1.** Map showing the locations of SnowEx field campaign areas (red dot). Base map shows snow classes defined in [Sturm and Liston, 2021](https://journals.ametsoc.org/view/journals/hydr/22/11/JHM-D-21-0070.1.xml). The snow pit images show a representative pit in each of the class types visited by SnowEx. "
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "id": "ef5f6870-65e3-4173-be33-6739b2bc7822",
+ "metadata": {},
+ "source": [
+ "**Table 1. Number of manual depths and snow pits associated with NASA SnowEx measurement periods.**\n",
+ "\n",
+ "| **SnowEx** | **Field Campaign Location** | **Temporal Coverage** | **Manual Depths** | **Snow Pits** |\n",
+ "|------------|-----------------------------|-----------------------|:-----------------:|:-------------:|\n",
+ "| **S17** | Grand Mesa & Senator Beck Basin, Colorado | February 6-25, 2017 | 23,432 | 265 |\n",
+ "| **S20** | Grand Mesa, Colorado
Western U.S Time Series (13 sites) | November 4-7, 2019
January 27-February 12, 2020
October 24-May 20, 2020* | 16,212
37,921
TBD | 21
154
454 |\n",
+ "| **S21** | Western U.S Time Series (7 sites) | November 16-May 27, 2021 | 12,536 | 247 |\n",
+ "| **S23** | Tundra & Boreal Forest, Alaska (pre-campaign site visit)
Tundra & Boreal Forest, Alaska
Tundra & Boreal Forest, Alaska
Boreal Forest, Alaska
Tundra & Boreal Forest, Alaska
| March 7-17, 2022
October 22-27, 2022
March 7-16, 2023
April 5-May 6, 2023
October 17-28, 2023 | 10,728
9,049
26,750
TBD
6,350 | 18
186
170
13
127 |\n",
+ "\n",
+ "_*The majority of sites in 2020 have a temporal coverage of January-March due to the Covid-19 pandemic._ "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2f41eea6-692d-4b12-9761-527f52d573f6",
+ "metadata": {},
+ "source": [
+ "_____\n",
+ "### Snow Classification Coverage\n",
+ "\n",
+ "\n",
+ "\n",
+ "As part of the mission statement, SnowEx aims to quantify snow estimation uncertainty across a range of snow classes, terrain and vegetration types. This is important to determine what areas and time periods have high SWE uncertainty across the ensemble of instrument techniques. \n",
+ "\n",
+ " \n",
+ "![](./content/01_map-n-barchart.png)\n",
+ "**Figure 2.** Map of the in situ field visits for the duration of SnowEx field campaigns (2017-2023). At this scale, points are overlapping, especially in the eastern Rocky Mountain region around Colorado. The total number of unique visits with recorded SWE are listed in the legend. Upper Right Bar chart of snow classes over the four SnowEx field campagin years. Counts represent in situ field visits. A range of sites in Boreal and Montane Forests occured in open areas such as meadows and clearings. The snow classification colors match those used in [Sturm and Liston, 2021](https://journals.ametsoc.org/view/journals/hydr/22/11/JHM-D-21-0070.1.xml).\n",
+ "\n",
+ "\n",
+ "\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "313fc52a-a81e-424a-9592-4452c03b1dd0",
+ "metadata": {},
+ "source": [
+ "### Recap\n",
+ "* SnowEx campaigns are structured based on the objectives set out in the SnowEx Science Plan. Some of those objectives are meet by conducting an all hands-on, short and intense observation period (IOP), while others are addressed by studying the evolution of the snowpack over a much longer time series (TS) style campaign. \n",
+ "\n",
+ "* The coincident field and airborne campaigns are designed to directly respond to the current knowledge gaps in remote sensing of seasonal snow, thus the participant-driven SnowEx effort targets a range of snow classes, terrain and vegetation types. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "96cfee5c-28e2-42cd-9fba-af2eba15c0da",
+ "metadata": {},
+ "source": [
+ "### References \n",
+ "SnowEx Experimental Plans: 2017, [2020](https://snow.nasa.gov/sites/default/files/NASA_SnowEx_Experiment_Plan_v15_draft.pdf), [2021](https://snow.nasa.gov/sites/default/files/users/user354/SNEX-Campaigns/2021/NASASnowEx21_ExperimentPlan_draft_v02.pdf), [2023](https://snow.nasa.gov/sites/default/files/users/user354/SNEX-Campaigns/2023/NASA_SnowEx_Experiment_Plan_2023_draft_20June2024.pdf)\n",
+ "\n",
+ "[SnowEx Science Plan](https://snow.nasa.gov/sites/default/files/SnowEx_Science_Plan_v1.6.pdf)\n",
+ "\n",
+ "[Sturm and Liston, 2021](https://journals.ametsoc.org/view/journals/hydr/22/11/JHM-D-21-0070.1.xml)"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.9"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/book/tutorials/snowex-core/02_snowex_data_descriptions.ipynb b/book/tutorials/snowex-core/02_snowex_data_descriptions.ipynb
new file mode 100644
index 0000000..499c892
--- /dev/null
+++ b/book/tutorials/snowex-core/02_snowex_data_descriptions.ipynb
@@ -0,0 +1,334 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "ea44ef26-d44d-4996-85f7-d49de94fdb59",
+ "metadata": {},
+ "source": [
+ "# Data Descriptions\n",
+ "(10 minutes)\n",
+ "\n",
+ "Campaigns are participant driven and produce community wide data. Without our vast community, we wouldn't have the robust ground-based observations that are part of the SnowEx collection. See the ground-based calibration and validation measurements central to the SnowEx field campaigns."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5a317d75-1253-45bc-a55d-d030c8356a14",
+ "metadata": {},
+ "source": [
+ "```{admonition} Learning Objectives\n",
+ "* Become familiar with measurements available for calibration/validation\n",
+ "* Know the sampling strategy and naming conventions behind the campaign design\n",
+ "* Learn where to find and search for SnowEx data\n",
+ "```"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "id": "eb62a206-50a1-4f88-83b2-051551c58844",
+ "metadata": {},
+ "source": [
+ "## Ground Observations\n",
+ "### What ground-based data sets are central for snow field campaigns? \n",
+ "\n",
+ "![](./content/02_measurement-types.png)\n",
+ "**Figure 1.** Ground-based measurements central to the SnowEx campaigns. (Left to Right panels) 1). Depth Transects: Observer uses the MagnaProbe to measure snow depths.\n",
+ "2). Snow Pit: Vertical density cuts show the dual profile sampling protocol. 3). Interval Board/SWE Tube: Overnight snow being measured in a snow tube to record the daily change during the IOP campaign. 4). Specific Surface Area (SSA) being collected at a shallow tundra snow pit with the IceCube. 5). SnowMicroPen (SMP) penatrating the snowpack to record snow stratigraphy over a range of intervals (10-50m) away from the centralized snow pit.\n",
+ "\n",
+ "Here you can see a summary of some of the depth sampling patterns you might discover in the snow depth data sets. Typically the pattern is a result of what instrument collection technique is deployed. \n",
+ "\n",
+ "![](./content/02_depth_spirals.png)\n",
+ "\n",
+ "**Figure 2.** Examples of snow depth measurements taken in different spatial patterns, representing different spatial extents. a). shows pit-depth, square-depths with L-depths from one of the plots. b). captures spiral-depths collected using a MagnaProbe. c). Includes spiral-depths and a single transect, ~10km in total length. Note the difference in scale across each panel. Background images are courtesy of @ 2020 Maxar Technologies Inc., Alaska Geospatial Office, USGS. \n",
+ "\n",
+ "\n",
+ "There are a lot of measurements in a single snow pit. This diagram helps explain what all is measured at a snow pit. \n",
+ "\n",
+ "![](./content/02_pit-parameters.png)\n",
+ "**Figure 3.** Description of parameters that come from a single snow pit visit. The colored ovals on the images correspond to the colored measurements on the left side.\n",
+ "\n",
+ "_____"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4050375a-66dd-4ae1-adfb-f1997ce2b954",
+ "metadata": {},
+ "source": [
+ "## Sampling Strategy and Naming Conventions\n",
+ "### I: 2020 Grand Mesa, CO IOP\n",
+ "\n",
+ "\n",
+ "![](./content/02_matrix.png)\n",
+ "**Figure 4.** Nine-member snow and vegetation matrix used to sample and name snow pits during the Grand Mesa IOP campaign \n",
+ " \n",
+ "**Vegetation Classes**\n",
+ "- 1-3 = treeless (0% tree cover)\n",
+ "- 4-6 = sparse (1-30% tree cover)\n",
+ "- 7-9 = dense (31-100% tree cover)\n",
+ "\n",
+ "**Snow Depth Classes**\n",
+ "- 1, 4, 7 = shallow (<90cm)\n",
+ "- 2, 5, 8 = medium (90-122cm)\n",
+ "- 3, 6, 9 = deep (>122cm)\n",
+ "\n",
+ "**Flight Lines**\n",
+ "- 'C' = Crossline\n",
+ "- 'N' = North\n",
+ "- 'S' = South\n",
+ " \n",
+ "\n",
+ "\n",
+ "![](./content/02_GMpitMap.jpg)\n",
+ "\n",
+ "**Figure 5.** Grand Mesa IOP 2020 sampling design. The rectangles are the lidar, UAVSAR, SWESARR, Thermal IR, and Gamma flight lines. The point markers are the locations of snow pits. \n",
+ "___\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "03fd9706-1bea-4a68-8784-c5c9ce4e4646",
+ "metadata": {},
+ "source": [
+ "### II: 2020/2021 Western U.S Time Series \n",
+ "\n",
+ "- Location ⇨ Regional Location with existing long-term monitoring infrastructure.\n",
+ "- Site ⇨ Averaged unique snow pit site to represent the progression of Time Series snow pits.\n",
+ "- PitID ⇨ 6-letter code unique to all snow pit sites; 2-letter state, 2-letter Location; 2-letter site name (e.g **Id**aho, **B**oise **R**iver, **B**ogus **U**pper = IDBRBU\n",
+ "- Unique PitID ⇨ 6-letter site code and timestamp (e.g. format: XXXXXX_yyyymmdd_hhmm, example: IDBRBU_20200116_1345)\n",
+ "\n",
+ "**Table 1. Comprehensive Site Summary for 2020 and 2021 Time Series Campaign**\n",
+ "|State|Location |Site |PitID |Latitude|Longitude |Pit Count|Snow Class|\n",
+ "|-----|--------------------------|------------------|------|--------|----------|:-------:|:--------:|\n",
+ "|CA |American River Basin |Caples Lake |CAAMCL|38.71029|-120.04186|7 |3 |\n",
+ "|CA |Mammoth Lakes |CUES |CAMLCP|37.64324|-119.02906|9 |5 |\n",
+ "|CA |Mammoth Lakes |Panorama Dome |CAMLPD|37.61964|-119.00029|6 |6 |\n",
+ "|CA |Sagehen Creek |Forest |CASHFO|39.42956|-120.24211|7 |6 |\n",
+ "|CA |Sagehen Creek |Open |CASHOP|39.43037|-120.23982|7 |6 |\n",
+ "|CA |Sagehen Creek |Tower 4 |CASHT4|39.42216|-120.29898|6 |3 |\n",
+ "|CO |Cameron Pass |Cameron Peak |COCPCP|40.56381|-105.86761|16 |6 |\n",
+ "|CO |Cameron Pass |Joe Wright |COCPJW|40.52406|-105.89345|8 |2 |\n",
+ "|CO |Cameron Pass |Michigan River |COCPMR|40.51864|-105.89193|22 |2 |\n",
+ "|CO |East River |Aspen |COERAP|38.92529|-106.97109|9 |6 |\n",
+ "|CO |East River |Forest 12 |COER12|38.92973|-106.97824|12 |2 |\n",
+ "|CO |East River |Forest 13 |COER13|38.92943|-106.97777|9 |6 |\n",
+ "|CO |East River |Forest 14 |COER14|38.92894|-106.97757|12 |6 |\n",
+ "|CO |East River |Gothic |COERGT|38.95925|-106.99053|9 |6 |\n",
+ "|CO |East River |Irwin Barn |COERIB|38.88812|-107.10796|13 |2 |\n",
+ "|CO |East River |Open 2 |COERO2|38.92661|-106.97848|9 |2 |\n",
+ "|CO |East River |Open 4 |COERO4|38.92627|-106.97907|12 |2 |\n",
+ "|CO |East River |Open 6 |COERO6|38.92669|-106.97988|9 |2 |\n",
+ "|CO |East River |Trench 13 |COERTR|38.92920|-106.97770|5 |6 |\n",
+ "|CO |East River |Upper |COERUP|38.93331|-106.98994|12 |2 |\n",
+ "|CO |Fraser Experimental Forest|JPL 1 |COFEJ1|39.90556|-105.88282|35 |6 |\n",
+ "|CO |Fraser Experimental Forest|JPL 2 |COFEJ2|39.90612|-105.88255|26 |6 |\n",
+ "|CO |Fraser Experimental Forest|SNB 1 |COFEB1|39.90699|-105.87786|23 |6 |\n",
+ "|CO |Fraser Experimental Forest|SNB 2 |COFEB2|39.90703|-105.87904|18 |6 |\n",
+ "|CO |Grand Mesa |County Line Open |COGMCO|39.03053|-108.03220|12 |2 |\n",
+ "|CO |Grand Mesa |County Line Tree |COGMCT|39.03223|-108.03438|10 |2 |\n",
+ "|CO |Grand Mesa |Mesa West Open |COGMWO|39.03399|-108.21390|10 |2 |\n",
+ "|CO |Grand Mesa |Mesa West Trees |COGMWT|39.03282|-108.21291|7 |2 |\n",
+ "|CO |Grand Mesa |Skyway Open |COGMSO|39.04511|-108.06209|21 |2 |\n",
+ "|CO |Grand Mesa |Skyway Tree |COGMST|39.04565|-108.06333|18 |2 |\n",
+ "|CO |Niwot Ridge |C1 |CONWC1|40.03317|-105.54616|9 |6 |\n",
+ "|CO |Niwot Ridge |Forest Flat |CONWFF|40.03186|-105.54667|12 |6 |\n",
+ "|CO |Niwot Ridge |Forest North |CONWFN|40.03337|-105.55380|11 |2 |\n",
+ "|CO |Niwot Ridge |Forest South |CONWFS|40.04021|-105.55701|13 |2 |\n",
+ "|CO |Niwot Ridge |Open Flat |CONWOF|40.03579|-105.55205|15 |6 |\n",
+ "|CO |Niwot Ridge |Saddle |CONWSA|40.05497|-105.59065|7 |1 |\n",
+ "|CO |Senator Beck |Senator Beck |COSBSB|37.90705|-107.72626|5 |1 |\n",
+ "|CO |Senator Beck |Swamp Angel |COSBSA|37.90714|-107.71121|19 |2 |\n",
+ "|ID |Boise River Basin |Banner Open |IDBRBO|44.30456|-115.23601|11 |6 |\n",
+ "|ID |Boise River Basin |Banner Snotel |IDBRBS|44.30362|-115.23457|23 |6 |\n",
+ "|ID |Boise River Basin |Bogus Lower |IDBRBL|43.76434|-116.10660|17 |6 |\n",
+ "|ID |Boise River Basin |Bogus Lower Trees |IDBRBT|43.76057|-116.08979|13 |6 |\n",
+ "|ID |Boise River Basin |Bogus Upper |IDBRBU|43.75881|-116.09019|11 |6 |\n",
+ "|ID |Boise River Basin |LDP Open |IDBRLO|43.73707|-116.12179|19 |6 |\n",
+ "|ID |Boise River Basin |LDP Tree |IDBRLT|43.73634|-116.12053|17 |6 |\n",
+ "|ID |Boise River Basin |Mores Creek Summit|IDBRMC|43.94735|-115.67666|3 |6 |\n",
+ "|MT |Central Ag Research Center|SnowEx-1 |MTCASX|47.05836|-109.95688|4 |5 |\n",
+ "|MT |Central Ag Research Center|Wheat |MTCAWH|47.05942|-109.95176|1 |5 |\n",
+ "|MT |Central Ag Research Center|Wx |MTCAWX|47.06062|-109.95693|4 |5 |\n",
+ "|NM |Jemez River |BA Flux Tower |NMJRBA|35.88859|-106.53184|8 |5 |\n",
+ "|NM |Jemez River |HQ Met Station |NMJRHQ|35.85791|-106.52137|8 |5 |\n",
+ "|UT |Little Cottonwood Canyon |Alta Collins |UTLCAC|40.57210|-111.62997|17 |2 |\n",
+ "|UT |Little Cottonwood Canyon |Atwater |UTLCAW|40.59125|-111.63759|20 |5 |\n",
+ "\n",
+ "Note - If a site was repeated (e.g. Cameron Pass, Michigan River) then the Pit Count column is the sum of the observations for two years). The Snow Class column was extracted from the 300 m Snow Classification data set (Liston, 2021 and can be accessed [here](https://nsidc.org/data/NSIDC-0768/versions/1) at NSIDC). See the previous notebook to characterize the Snow Classes. \n",
+ "\n",
+ "This table can be accessed as a geojson from [Megan's github gists](https://gist.github.com/meganmason/dde13c46a90875e364b1c25a31bff1d8) \n",
+ "\n",
+ "To use this as a geojson in your project:\n",
+ "1. Navigate to the link above\n",
+ "2. Check out the map of data (zoom in, zoom out, etc.)\n",
+ "3. Select the 'Raw' button from the top right corner\n",
+ "4. Copy/Paste the URL (it's longer now)\n",
+ "5. Use the code block below to import"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "47105493-02fe-4970-8dd0-967e627f5121",
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [],
+ "source": [
+ "import geopandas as gpd\n",
+ "import requests\n",
+ "url = \"https://gist.githubusercontent.com/meganmason/dde13c46a90875e364b1c25a31bff1d8/raw/d361e1a56eeb867bd89c87b4dc13ed431ffff6f6/SNEX_TS_SP_avg_prelim_Hackweek.geojson\"\n",
+ "gdf = gpd.read_file(url)\n",
+ "gdf.head()"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "id": "e3e60c8b-d24b-43fc-969c-e5740f4a18a9",
+ "metadata": {},
+ "source": [
+ "___\n",
+ "### III: Arctic Tundra and Boreal Forest, Alaska\n",
+ "\n",
+ "\n",
+ "\n",
+ "![](./content/02_ak-sites.png)\n",
+ "\n",
+ "**Figure 6.** SnowEx 2023 site locations in Interior Alaska and on the North Slope of Alaska. The flight lines for SWESARR (turquoise areas) and lidar/stereo (red boxes). SWE/snow depth measurement periods studied 5 locations: 3 in the boreal forest and 2 in the arctic tundra. The albedo/snow melt campaign period studied 3 sites in the boreal forest.\n",
+ "\n",
+ "#### SWE/snow depth focused campaign (Oct 2022, March 2023, Oct 2023)\n",
+ "**Fairbanks area / Interior Alaska --> Boreal Forest**\n",
+ "- FLCF - Farmer’s Loop and Creamer’s Field (001-108)\n",
+ "- CPCRW - Caribou-Poker Creek Research Watershed (200-283)\n",
+ "- BCEF - Bonanza Creek Experimental Forest (300-482)\n",
+ "\n",
+ "**Vegetation Classes** [National Land Cover Dataset](add link)\n",
+ "- D - Deciduous\n",
+ "- E - Evergreen\n",
+ "- S - Shrub\n",
+ "- W - Wetland\n",
+ "- C - Crop\n",
+ "\n",
+ "**Snow Depth Classes**\n",
+ "- B - Below Average\n",
+ "- N - Average (neutral)\n",
+ "- A - Above Average\n",
+ "\n",
+ "**North Slope Alaska --> Arctic Tundra**\n",
+ "- UKT - Upper Kuparuk-Toolik (500-566)\n",
+ "- ACP - Alaska Coastal Plain (600-800)\n",
+ "\n",
+ "**Vegetation Classes**\n",
+ "- (Not used for Tundra sites)\n",
+ " \n",
+ "**Snow Depth Classes** (Lidar?? and SnowModel results)\n",
+ "- N - Neutral (windward)\n",
+ "- A - Above Neutral (leeward)\n",
+ "- D - Snow Drift\n",
+ "- I - Ice Cover (lake/river) - only visited March 2023\n",
+ "\n",
+ "**Flight Lines**\n",
+ "- FLCF (2): North, SW\n",
+ "- BCEF (3): NE, SW, North\n",
+ "- CPCRW (1): East\n",
+ "- UKT (3): North, East, South\n",
+ "- ACP (1): NNE\n",
+ "\n",
+ "#### Albedo/snow melt focused campaign (Apr/May 2023)\n",
+ "**Interior Alaska --> Boreal Forest**\n",
+ "- FLCF - Farmer’s Loop and Creamer’s Field\n",
+ "- CPCRW - Caribou-Poker Creek Research Watershed\n",
+ "- DEJU - Delta Junction Research Area\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "![](./content/02_ak-sites-n-flights.png)\n",
+ "\n",
+ "**Figure X.** SWESARR science lines (yellow boxes) and associated flight lines (red line) over each site. \n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "![](./content/02_ak-boreal-vegclass.png)\n",
+ "\n",
+ "**Figure X.** Represenative land cover classes for the boreal forests taken from the Southeast corner of the 5x5 m study plot. \n",
+ "\n",
+ "![](./content/02_ak-sampling-design.png)\n",
+ "\n",
+ "**Figure X.** The study plot sampling design for the SWE/snow depth focused campaign. Field crews marked the Southeast corner and measured square-depths around the 5x5 m perimeter on a 1m interval. Snow depths were collected on a north and west transect of 20 m (15 m addition to the study plot perimeter) or a spiral pattern was used depending on depth instrument availability. The snow pit was excavated in the center of the study plot. SSA measurements were collected inside the ~1x1 m snow pit. SMP measurments were taken at the front of the snow pit and up to 50 m from the snow pit. \n",
+ "\n",
+ "____"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b2cec933-106a-43c3-b0b7-0928ad9e459d",
+ "metadata": {},
+ "source": [
+ "### Where can I find data?\n",
+ "\n",
+ "![](./content/02_nsidc-banner.png)\n",
+ "\n",
+ "#### 1. SnowEx data sets are stored and archived at the National Snow and Ice Data Center (NSIDC) in Boulder, Colorado. \n",
+ "\n",
+ "**Table 2. Summary of Core Data Sets with DOI links for applicable data sets**\n",
+ "| **Core Data Sets** | **Parameters Available** | **Instruments** | **NSIDC Access** |\n",
+ "|--------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n",
+ "| **Snow Pits** | Depth, Density, Temp., LWC, Stratigraphy, Grain Size, Wetness, Hand Hardness, Qualitative Environment, SWE | Standard pit kit | [SNEX17_SP_GMIOP](https://nsidc.org/data/snex17_snowpits/versions/1)
[SNEX20_SP_GMIOP](https://nsidc.org/data/snex20_gm_sp/versions/1)
[SNEX20_SP_TS](https://nsidc.org/data/snex20_ts_sp/versions/2)
[SNEX21_SP_TS](https://nsidc.org/data/snex21_ts_sp/versions/1)
SNEX23_SP_Oct22
SNEX23_SP_Mar23 (prelim. avail.)
SNEX23_SP_Oct23 |\n",
+ "| **Depth Transects** | Snow Depth - various sampling designs | MagnaProbe, Mesa2/Geode, Pit Ruler | [SNEX17_SD](https://nsidc.org/data/snex17_sd/versions/1)
[SNEX20_SD](https://nsidc.org/data/snex20_sd/versions/1)
SNEX20_SD_TS
SNEX21_SD_TS (in prep.)
[SNEX23_SD_Mar22](https://nsidc.org/data/snex23_mar22_sd/versions/1)
SNEX23_SD_Oct22 (prelim. avail.)
[SNEX23_SD_Mar23](https://nsidc.org/data/snex23_mar23_sd/versions/1)
SNEX23_SD_Oct23 |\n",
+ "| **Interval Boards/ SWE Tubes** | New (or total) snow, SWE, density | Tube, ruler and scale | [SNEX20_ST_GMIOP](https://nsidc.org/data/snex20_a19_swe/versions/1)
SNEX20_IB_GMIOP
SNEX20_IB_TS
SNEX21_IB_TS
SNEX23_IB_Mar23
[SNEX23_ST_Mar23](https://nsidc.org/data/snex23_swe/versions/1) |\n",
+ "| **SSA** | Snow reflectance, Specific surface area | IceCube, IRIS, InfraSnow | [SNEX17_SSA_GMIOP](https://nsidc.org/data/snex17_ssa/versions/1)
[SNEX20_SSA_GMIOP](https://nsidc.org/data/snex20_ssa/versions/1)
SNEX23_SSA_Oct22
[SNEX23_SSA_Mar23](https://nsidc.org/data/snex23_ssa/versions/1)
[SNEX23_SSA_Oct23](https://nsidc.org/data/snex23_ssa_so/versions/1)
|\n",
+ "| **SMP** | Depth, Force (snow microstructure) | SnowMicroPen | [SNEX17_SMP_GMIOP](https://nsidc.org/data/snex17_smp/versions/1)
[SNEX17_SMP_SBIOP](https://nsidc.org/data/snex17_smp2/versions/1)
[SNEX20_SMP_GMIOP](https://nsidc.org/data/snex20_smp/versions/1)
[SNEX20_SMP_BoiseRiver](https://nsidc.org/data/snex20_br_bsu_smp/versions/1)
SNEX23_SMP_Mar23 |\n",
+ "\n",
+ "Visit [NSIDC's SnowEx Overview page](https://nsidc.org/data/snowex) to see a full table of all available [2017](https://nsidc.org/data/snowex/data?field_data_set_keyword_value=2), [2020](https://nsidc.org/data/snowex/data?field_data_set_keyword_value=3), [2021](https://nsidc.org/data/snowex/data?field_data_set_keyword_value=4) and [2023](https://nsidc.org/data/snowex/data?field_data_set_keyword_value=5) products."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ed2abd91-9a1e-4cbe-b5e5-dc812bbc65f6",
+ "metadata": {},
+ "source": [
+ "#### 2. SnowEx SQL Database (preview in next tutorial!)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a5b924bc-10ae-4bef-90cf-651cf1c721ff",
+ "metadata": {},
+ "source": [
+ "## Recap\n",
+ "\n",
+ "* You know which measurements we have a LOT of and are consistent between multiple field campaigns\n",
+ "* You are aware of the basic sampling strategy for the various campaigns\n",
+ "* You have a few tools at your finger tips to access and learn more about the data"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.9"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/book/tutorials/snowex-core/03_snowex_data_preview.ipynb b/book/tutorials/snowex-core/03_snowex_data_preview.ipynb
new file mode 100644
index 0000000..bb6b802
--- /dev/null
+++ b/book/tutorials/snowex-core/03_snowex_data_preview.ipynb
@@ -0,0 +1,822 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "622d4e72-7cc0-4a52-91b4-9b643fef8e31",
+ "metadata": {},
+ "source": [
+ "# Data Exploration \n",
+ "(15 minutes)\n",
+ "\n",
+ "![](./content/03_snow-sculpture.jpg)\n",
+ "\n",
+ "Prerequisites: an EarthData Login "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7b34ac2f-82dc-4423-9c30-86f1cd737244",
+ "metadata": {},
+ "source": [
+ "```{admonition} Learning Objectives\n",
+ "- Experience a variety of SnowEx data across different spatial and temporal domains\n",
+ "- Preview code snippets to help you extract and prep data \n",
+ "- Get a first taste of the database! \n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e7d2ed75-2386-4178-a03d-da4bc2509ec7",
+ "metadata": {},
+ "source": [
+ "## Spatial Focused Data\n",
+ "Let's take a look at data collected during the Intense Observation Periods (IOP) campaigns via EarthAcess data downloads. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "22cf11b1-e5c9-453b-8d23-d97df8f0bb03",
+ "metadata": {},
+ "source": [
+ "### I: 2017/2020 - Grand Mesa & Senator Beck, Colorado\n",
+ "Objective - Visualize SWE from Grand Mesa field campaigns.\\\n",
+ "Data description - SnowEx 2017 & 2020 IOP derived SWE from snow pits.\\\n",
+ "Datasets -\n",
+ "1. [SnowEx17 Community Snow Pit Measurements, Version 1](https://nsidc.org/data/snex17_snowpits/versions/1) (Grand Mesa + Senator Beck, CO)\n",
+ "2. [SnowEx20 Grand Mesa Intensive Observation Period Snow Pit Measurements, Version 1](https://nsidc.org/data/snex20_gm_sp/versions/1) (Grand Mesa, CO)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2974712c-3555-4f56-bbd6-d71037a737d7",
+ "metadata": {},
+ "source": [
+ "We will begin by importing python packages we will need to explore data. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "36ef0083-ff1f-4e49-a978-920e6e55912e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# standard imports\n",
+ "import pandas as pd\n",
+ "import pyproj\n",
+ "\n",
+ "# plotting imports\n",
+ "import matplotlib.pyplot as plt\n",
+ "# from matplotlib import gridspec # do I use?\n",
+ "import matplotlib.dates as mdates\n",
+ "# import matplotlib.patches as patches # do I use?\n",
+ "import seaborn as sns\n",
+ "\n",
+ "# mapping imports\n",
+ "import folium\n",
+ "from pyproj import Transformer\n",
+ "import branca.colormap as cm\n",
+ "from folium import IFrame\n",
+ "from folium.plugins import MeasureControl\n",
+ "\n",
+ "# Earthaccess imports\n",
+ "import earthaccess"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "bb8ff033-1080-4798-bc96-de83b60da6bc",
+ "metadata": {},
+ "source": [
+ "Now we continue by accessing data with our EarthData accounts"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "824b209b-7f8a-4c43-9e6a-7d33d0766720",
+ "metadata": {},
+ "source": [
+ "### Download data from NASA's NSIDC DAAC "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "dd5a71dd-80d8-42d7-93a9-f662aa1eff16",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# connect to Earthaccess\n",
+ "auth = earthaccess.login()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f4000c97-fc42-4171-8d95-5fb7bf94e4f0",
+ "metadata": {},
+ "source": [
+ "From [EarthData](https://search.earthdata.nasa.gov/search?fpj=SnowEx&fst0=cryosphere) we can glean information about the files we are interested in. For example, we learn that the SnowEx 2017 snow pit data are a multi-file granule, which will require one extra step to download. \n",
+ "![](./content/03_granules.png)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "21d6145a-aada-4104-a787-44c33c7350a8",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# pull SnowEx 2017 snow pit data - Summary_SWE file\n",
+ "results_gm17 =earthaccess.search_data(\n",
+ " short_name='SNEX17_SNOWPITS',\n",
+ " granule_name = 'SnowEx17_SnowPits_GM')\n",
+ "\n",
+ "# some extra code to filter a multi-file granule (2017 IOP granules: 1). SnowEx17_SnowPits_GM, 2). SnowEx17_SnowPits_SBB\n",
+ "filtered_urls = []\n",
+ "\n",
+ "for granule in results_gm17:\n",
+ " links = granule.data_links()\n",
+ " for link in links:\n",
+ " if link == 'https://n5eil01u.ecs.nsidc.org/DP1/SNOWEX/SNEX17_SnowPits.001/2017.02.06/SnowEx17_SnowPits_GM_201702_v01.csv':\n",
+ " filtered_urls.append(link) # Knowing the name of the file I wanted helped here\n",
+ "\n",
+ "earthaccess.download(filtered_urls, \n",
+ " local_path='./Downloads')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "249a6f94-7f21-45cc-898b-28d40e0ba255",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# pull SnowEx 2020 snow pit data - Summary_SWE file\n",
+ "results_gm20 =earthaccess.search_data(\n",
+ " short_name='SNEX20_GM_SP',\n",
+ " granule_name = 'SnowEx20_SnowPits_GMIOP_Summary_SWE_2020_v01.csv')\n",
+ "\n",
+ "downloaded_file_gm20 = earthaccess.download(\n",
+ " results_gm20,\n",
+ " local_path='./Downloads',\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "96ab2d80-f1c8-4f51-90bf-c623eb98b0d6",
+ "metadata": {},
+ "source": [
+ "```{note}\n",
+ "The downside to this method is you have to know the specific filename you are interested in. That can require more time to familiarize yourself with the dataset. A great resource is to read the User Guide provided for most SnowEx data sets and accessed from the NSIDC data landing page. The User Guides provide information about filenames.\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6799a5ba-2e1a-4d60-8288-ff3fffa8c4e0",
+ "metadata": {},
+ "source": [
+ "Look over to the left in your files and see that we added a ***./Downloads*** folder to store the EarthData download.\n",
+ "\n",
+ "Next, let's use Python's pandas package to open the CSV file that contains Summary SWE data.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "0d0282a3-29c0-489b-8fee-1d2a7d396338",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# open summary SWE files from our ./Downloads folder\n",
+ "s17 = pd.read_csv('./Downloads/SnowEx17_SnowPits_GM_201702_v01.csv')\n",
+ "s20 = pd.read_csv('./Downloads/SnowEx20_SnowPits_GMIOP_Summary_SWE_2020_v01.csv')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "ae4e2225-78a3-4e32-9957-5282df384b3e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "print(s17.info())\n",
+ "s17.describe()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f1e9361d-abd6-4841-9ac0-5906f6302267",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# some dataframe clean up\n",
+ "s17 = s17[s17['#Location'] == 'GM-CO'] # keep the GM points only for now\n",
+ "s20 = s20[s20['Easting (m)'] < 750000] # removes point at GM lodge (n=1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "de618f73-1aa7-4343-a02b-5e4096d8d5ab",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Convert UTM to Lat/Lon\n",
+ "transformer = pyproj.Transformer.from_crs(\"EPSG:32613\", \"EPSG:4326\") # UTM Zone 13N \n",
+ "s17['latitude'], s17['longitude'] = zip(*s17.apply(lambda row: transformer.transform(row['UTM13 Easting [m]'], row['UTM13 Northing [m]']), axis=1))\n",
+ "\n",
+ "transformer = pyproj.Transformer.from_crs(\"EPSG:32612\", \"EPSG:4326\") # UTM Zone 12N\n",
+ "s20['latitude'], s20['longitude'] = zip(*s20.apply(lambda row: transformer.transform(row['Easting (m)'], row['Northing (m)']), axis=1))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "43b66540-34cd-4705-9ae1-e3b2a4ba1aad",
+ "metadata": {},
+ "source": [
+ "Now that we have added Latitude and Longitude columns, let's look at the spatial extent of the data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "2ede844a-8d77-4a53-a5e6-dcad880325bd",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "fig, ax = plt.subplots(figsize=(8,4))\n",
+ "s17.plot.scatter('latitude', 'longitude', color='blueviolet', ax=ax, label='GrandMesa 2017')\n",
+ "s20.plot.scatter('latitude', 'longitude', color='orange', ax=ax, label='GrandMesa 2020')\n",
+ "plt.legend(loc='lower right')\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7b3e254e-f954-445f-998c-844d4233feb4",
+ "metadata": {},
+ "source": [
+ "We see that during the 2017 IOP the sampling area covered a greater extent. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1bd5eb38-9758-4627-aee9-79c191251354",
+ "metadata": {},
+ "source": [
+ "### Let's add some context to these data points\n",
+ "By using an interactive map [(Folium)](https://autogis-site.readthedocs.io/en/2021/notebooks/L5/02_interactive-map-folium.html) we can move around the Mesa. Here we plot Latitude and Longitude on the y- and x-axes, respectively and add plot SWE as the 3rd dimension with the additional of a colorbar. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "3ca5ca23-5cb0-4bb6-b5f2-16adcfdee448",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Create a map using lat/lon mean\n",
+ "m = folium.Map(width=500, height=400,location=[s17['latitude'].mean(), s17['longitude'].mean()], zoom_start=10)\n",
+ "m"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6e9e4f8a-4819-4760-b609-a67372a7f240",
+ "metadata": {},
+ "source": [
+ "I used the dataframe's lat/lon mean to center my map. I choose the 2017 dataframe because of the greater spatial extent we discovered above. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "df9b381e-ffef-4439-8b6a-3104e5c71b7a",
+ "metadata": {},
+ "source": [
+ "Let's now modify the map imagery "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f884b167-3858-4b0b-8880-628602c60f31",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Add aerial imagery (ESRI World Imagery)\n",
+ "folium.TileLayer(\n",
+ " tiles='https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',\n",
+ " attr='Esri',\n",
+ " name='Esri Satellite',\n",
+ " overlay=False,\n",
+ " control=True,\n",
+ " opacity=0.9\n",
+ ").add_to(m)\n",
+ "\n",
+ "m"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4aad9b7b-582a-4755-b4cd-aa41fe0f0433",
+ "metadata": {},
+ "source": [
+ "Oh goody, I can see the Mesa! Did you know this is the largest flat-topped mountain in the world? See for yourself [right here](https://en.wikipedia.org/wiki/Grand_Mesa)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7fd319d0-13fc-4f9f-a2b8-9a1e3a0be67d",
+ "metadata": {},
+ "source": [
+ "Moving on, let's add the SWE values to the map!"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "46d6a22a-5fc3-4e7a-bb43-5c269e674b17",
+ "metadata": {},
+ "source": [
+ "### Map + Imagery + Data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "8f44baca-ea50-41ec-8b13-1a4b5f3155a8",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Create a Folium map \n",
+ "m = folium.Map(width=1000, height=600, location=[s17['latitude'].mean(), s17['longitude'].mean()], zoom_start=10)\n",
+ "\n",
+ "# Add aerial imagery (ESRI World Imagery)\n",
+ "folium.TileLayer(\n",
+ " tiles='https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',\n",
+ " attr='Esri',\n",
+ " name='Esri Satellite',\n",
+ " overlay=False,\n",
+ " control=True,\n",
+ " opacity=0.9\n",
+ ").add_to(m)\n",
+ "\n",
+ "# Create a colormap \n",
+ "colormap1 = cm.linear.Purples_09.to_step(12).scale(50,800)\n",
+ "colormap2 = cm.linear.YlOrBr_04.to_step(12).scale(50,800)\n",
+ "\n",
+ "# Plot the scatter plot for s17\n",
+ "for index, row in s17.iterrows():\n",
+ " folium.CircleMarker(location=[row['latitude'], row['longitude']], radius=3, fill=True, fill_opacity=1, color=colormap1(row['SWE [mm]'])).add_to(m)\n",
+ "\n",
+ "# Plot the scatter plot for s20\n",
+ "for index, row in s20.iterrows():\n",
+ " folium.CircleMarker(location=[row['latitude'], row['longitude']], radius=3, fill=True, fill_opacity=1, color=colormap2(row['SWE Mean (mm)'])).add_to(m)\n",
+ "\n",
+ "# Add colorbar legend to the map\n",
+ "colormap1.add_to(m)\n",
+ "colormap1.caption = '2017 SWE (mm)'\n",
+ "colormap1.stroke_color = '#ffffff' # White color for the text buffer\n",
+ "\n",
+ "colormap2.add_to(m)\n",
+ "colormap2.caption = '2020 SWE (mm)'\n",
+ "colormap2.stroke_color = '#ffffff' # White color for the text buffer\n",
+ "\n",
+ "# Define custom CSS for the colorbar legend\n",
+ "custom_css = \"\"\"\n",
+ "\n",
+ "\"\"\"\n",
+ "\n",
+ "m.add_child(MeasureControl(position='bottomleft', primary_length_unit='meters', secondary_length_unit='miles', primary_area_unit='sqmeters', secondary_area_unit='acres'))\n",
+ "\n",
+ "# Add the custom CSS to the map\n",
+ "m.get_root().html.add_child(folium.Element(custom_css))\n",
+ "\n",
+ "# Save the map as an HTML file or display it in Jupyter notebook\n",
+ "# m.save(path_out.joinpath('GMIOP_20_swe_map.html'))\n",
+ "\n",
+ "# Display the map\n",
+ "m"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8d145add-35d1-4e55-85ca-0940548f4b30",
+ "metadata": {},
+ "source": [
+ "```{note}\n",
+ "The Grand Mesa plateau splits the 12 & 13 UTM zone. That means the western portion of the Mesa is Zone 12 while the eastern portion is Zone 13. Due to the sampling design, the SnowEx 2017 data were collected as Zone 13 (majority of points were east of the divide) and SnowEx 2020 data were collected as Zone 12 (majority of points focused on the western portion of the plateau).\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7b529c15-097d-4128-97da-acd2a0388145",
+ "metadata": {},
+ "source": [
+ "#### What variability is there during the different sampling years? "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e3d95229-bb79-494a-b1b3-b46ef7663e8b",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# open again to reset (recall, we filtered out Senator Beck data before, let's keep that this time!)\n",
+ "s17 = pd.read_csv('./Downloads/SnowEx17_SnowPits_GM_201702_v01.csv')\n",
+ "s20 = pd.read_csv('./Downloads/SnowEx20_SnowPits_GMIOP_Summary_SWE_2020_v01.csv')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "3174d9e6-3109-43b9-b19c-1384dc2c73c1",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# subdataframes for GM and SB for 2017\n",
+ "s17_gm = s17[s17['#Location'] == 'GM-CO'] \n",
+ "s17_sb = s17[s17['#Location'] == 'SBB-CO'] "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f36125b4-f952-4731-88e3-bf1f17b3b2d9",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "fig, axs = plt.subplots(1, 2, figsize=(12, 5))\n",
+ "\n",
+ "# ~~~~ Plot 1: Scatter plot of density and SWE for S17 and S20\n",
+ "\n",
+ "# Count the number of observations\n",
+ "n_s17_sb = s17_sb['SWE [mm]'].count()\n",
+ "n_s17_gm = s17_gm['SWE [mm]'].count()\n",
+ "n_s20 = s20['SWE Mean (mm)'].count()\n",
+ "\n",
+ "# Plot data for 2017 SBB\n",
+ "sns.scatterplot(data=s17_sb, x='Density Mean [kg/m^3]', y='Snow Depth [cm]', s=60, label=f'2017 SBB-CO (n={n_s17_sb})', marker='^', ax=axs[0])\n",
+ "\n",
+ "# Plot data for 2017 GM\n",
+ "sns.scatterplot(data=s17_gm, x='Density Mean [kg/m^3]', y='Snow Depth [cm]', s=60, label=f'2017 GM-CO (n={n_s17_gm})', marker='^', ax=axs[0])\n",
+ "\n",
+ "# Plot data for 2020 GM\n",
+ "sns.scatterplot(data=s20, x='Density Mean (kg/m^3)', y='Snow Depth (cm)', s=40, label=f'2020 GM-CO (n={n_s20})', ax=axs[0])\n",
+ "\n",
+ "# Adding labels and legends\n",
+ "axs[0].set_xlabel('Snow Density (kg/m$^3$)')\n",
+ "axs[0].set_ylabel('Snow Depth (cm)')\n",
+ "axs[0].legend()\n",
+ "axs[0].set_title('S17 and S20 Snow Pit Bulk Density and Depth')\n",
+ "axs[0].grid(True)\n",
+ "\n",
+ "\n",
+ "# ~~~~ Plot 2: PDF for S17 (Grand Mesa + Senator Beck) and S20 (Grand Mesa 2020)\n",
+ "\n",
+ "# Plot the PDF for 2017 SBB\n",
+ "sns.kdeplot(s17_sb['SWE [mm]'], label='2017 SBB-CO', linewidth=5, ax=axs[1])\n",
+ "\n",
+ "# Plot the PDF for 2017 GM\n",
+ "sns.kdeplot(s17_gm['SWE [mm]'], label='2017 GM-CO', linewidth=5, ax=axs[1])\n",
+ "\n",
+ "# Plot the PDF for 2020 GM\n",
+ "sns.kdeplot(s20['SWE Mean (mm)'], label='2020 GM-CO', linewidth=5, ax=axs[1])\n",
+ "\n",
+ "# Add title and labels\n",
+ "axs[1].set_title('S17 and S20 Snow Pit SWE')\n",
+ "axs[1].set_xlabel('SWE (mm)')\n",
+ "axs[1].set_ylabel('PDF')\n",
+ "axs[1].legend()\n",
+ "\n",
+ "# Save figure if needed\n",
+ "# plt.savefig(path_fig.joinpath('S17_n_S20_GMIOP_pdf.jpg'), bbox_inches='tight', pad_inches=0.1)\n",
+ "\n",
+ "# Show the plot\n",
+ "plt.tight_layout()\n",
+ "plt.show()\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "94cf4d8b-043b-4680-9286-6f47614f407f",
+ "metadata": {},
+ "source": [
+ "There is so much more we could dig into. Just ask HP, he'll say you could spend a lifetime studying snow on Grand Mesa :)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b8c94689-8366-4b22-aca2-3e94ca08775c",
+ "metadata": {},
+ "source": [
+ "Alas, let us continue our spatial exploration but move it up to Alaska."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a950c906-c8e8-4d68-86ef-d896a2d7466c",
+ "metadata": {},
+ "source": [
+ "### II: 2023 Arctic Tundra and Boreal Forest, Alaska\n",
+ "Objective - Compare snow depth, density and SWE data from the Adirondack snow sampler (n=84) and snow pits (n=170)\\\n",
+ "Data description - SnowEx 2023 March 2023 IOP Snow Water Equivalent and Snow Pit Measurements\\\n",
+ "Datasets -\n",
+ "1. [SnowEx23 Snow Water Equivalent, Version 1](https://nsidc.org/data/snex23_swe/versions/1) (2-days of Adirondack snow sampler measurements North Slope (tundra) and Fairbanks (boreal forest))\n",
+ "2. SnowEx23 Snow Pit Measurements, Version 1 (in prep., available on the `snowexsql` database)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "494e1616-3015-4dc9-88b4-75eefcde36f2",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Adirondack SWE download\n",
+ "results_swe = earthaccess.search_data(\n",
+ " short_name='SNEX23_SWE')\n",
+ "\n",
+ "downloaded_files_swe = earthaccess.download(\n",
+ " results_swe,\n",
+ " local_path='./Downloads',\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "11ca7ed6-b6bc-49c4-9e8b-69b08bcf5429",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# datasets from Alaska contain more header rows. skipping 42 rows for now and dropping the numbered row under the columns names\n",
+ "s23 = pd.read_csv('./Downloads/SNEX23_SWE_Mar23IOP_AK_20230313_20230316_v01.0.csv', header=42, na_values=-9999)\n",
+ "s23 = s23.iloc[1:] # selects the row below the header number cols(1, 2, 3, ... etc.)\n",
+ "s23 = s23.reset_index(drop=True)\n",
+ "s23.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "721743ab-8ff5-4e2c-bf2c-2241fed86d21",
+ "metadata": {},
+ "source": [
+ "At each coordinate pair, the Adirondack snow sampler (i.e a large SWE tube, cross-sectional area A = 35.7 cm2) is used to collect 3 samples each of depth (cm) and mass (g). Bulk snow density and SWE are then computed afterwards using the equations from [Stuefer et al., 2020](https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2019WR025621). Here is the device being used on the North Slope in Alaska. \n",
+ "\n",
+ "![](./content/03_adirondack-sampler.jpg)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e7d6142e-3429-4180-9c2a-61bdf2b98252",
+ "metadata": {},
+ "source": [
+ "Okay, back to some analysis. We need to get the mean of all three samples (containted in three different columns)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "75ea9c55-66f8-41eb-acae-04059f706b49",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# CREATE DEPTH, DENSITY, and SWE Boxplots with the SWE Adirondack snow sampler\n",
+ "\n",
+ "# Combine the SWE, Depth, and Density columns for plotting\n",
+ "df_melted = pd.melt(s23, id_vars=['State', 'County'], value_vars=['SWE1', 'SWE2', 'SWE3', 'Depth1', 'Depth2', 'Depth3', 'Density1', 'Density2', 'Density3'],\n",
+ " var_name='Measurement', value_name='Value')\n",
+ "\n",
+ "# Create sub-dataframes for SWE, Depth, and Density\n",
+ "swe_df = df_melted[df_melted['Measurement'].str.contains('SWE')]\n",
+ "depth_df = df_melted[df_melted['Measurement'].str.contains('Depth')]\n",
+ "density_df = df_melted[df_melted['Measurement'].str.contains('Density')]\n",
+ "\n",
+ "# Initialize the figure and axes\n",
+ "fig, axs = plt.subplots(1, 3, figsize=(14, 6))\n",
+ "\n",
+ "# Define the custom order and labels\n",
+ "custom_order = ['Fairbanks', 'North Slope']\n",
+ "\n",
+ "# Plot the SWE boxplot\n",
+ "sns.boxplot(data=swe_df, x='County', y='Value', ax=axs[0], color='gray', order=custom_order)\n",
+ "axs[0].set_title('SWE')\n",
+ "axs[0].set_ylabel('SWE (mm)')\n",
+ "\n",
+ "# Plot the Depth boxplot\n",
+ "sns.boxplot(data=depth_df, x='County', y='Value', ax=axs[1], color='gray', order=custom_order)\n",
+ "axs[1].set_title('Depth')\n",
+ "axs[1].set_ylabel('Depth (cm)')\n",
+ "\n",
+ "# Plot the Density boxplot\n",
+ "sns.boxplot(data=density_df, x='County', y='Value', ax=axs[2], color='gray', order=custom_order)\n",
+ "axs[2].set_title('Density')\n",
+ "axs[2].set_ylabel('Density (kg/m$^3$)')\n",
+ "\n",
+ "# Adjust the layout\n",
+ "plt.tight_layout()\n",
+ "plt.show()\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "97c7d3d2-ed6a-415c-b352-0ab1e7d7d9ba",
+ "metadata": {},
+ "source": [
+ "We can compare our Adirondack snow sampler results to the snow pit measurement. The boxplots below were generated during the review and data submission preparation work for the March 2023 snow pits. Notice, the snow pit trends match those of the snow sampler tube. The median SWE is higher in the boreal forest (Fairbanks sites) as a result of the deeper snow. Overall, the tundra (North Slope sites) has greater density.\n",
+ "\n",
+ "![](./content/03_ak-pits-boxplots.png)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1dd0e2f5-1289-4972-b433-99d43e86522d",
+ "metadata": {},
+ "source": [
+ "What are other ways to look at the data? Recall that the Boreal Forest has a land cover classification enbedded in the plot name. Why not look at SWE, depth, and density by land cover type? Recall, the Land Classification information is embedded in the pitID name (e.g. WB241 the 'W' stands for wetland, or EA221 the 'E' stands for Evergreen). \n",
+ "\n",
+ "![](./content/03_ak-pits-landcov-boxplots.png)\n",
+ "\n",
+ "Does this mean that all Evergreen sites have more snow!?\n",
+ "\n",
+ "Careful now, there is a lot to consider when interpreting results. This plot alone looks like we have deeper, denser snow in the Evergreen forests, but keep in mind you may not know the other environmental and terrain factors that might cause you to jump to this conclusion. Keep in mind relative location and elevation when looking at data. The Alaska study sites are all relativily flat compared to traditional complex terrain areas, but the majority of our Evergreen sites were sampled in the Caribou-Poker Creek Research Watershed, which is higher in elevation that the sites closer to Fairbanks. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c7ef28f8-5632-4c02-8c96-2770e5ba6eb0",
+ "metadata": {},
+ "source": [
+ "Alaska was the last stop for SnowEx field campaigns, that means the data collection was easy-breezy. \n",
+ "\n",
+ "WRONG. \n",
+ "\n",
+ "Here are some challenges we encountered daily:\n",
+ "1. Ground vegetation - where is 0?? Often, the bottom of the snowpack varied more than the snow surface! \n",
+ "2. Tussocks, what are they and why are there so many? (NOTE - tussocks were better quantified during the October sampling periods when snow was low.\n",
+ "3. Snow Voids - snowpack bottoms were not always flush to the ground surface and could be overestimated. Grassy vegetation mats, downed brush and shrubs, or other vegetation creates air pockets or vegetation gaps near the ground surface. Sometimes, the snow was suspended by 10-25 cm depending on the site. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "835c7b48-a5d2-469d-bda5-9d94ff5ee128",
+ "metadata": {},
+ "source": [
+ "These data are really exiting to look at because it's the newest in the SnowEx collection following the Alaska campaign. \n",
+ "\n",
+ "Let's make sure we cover some of the Time Series data as that has matured since the last SnowEx Hackweek event. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "32a2a1d5-1b04-40d2-b58a-fa78bc6eca73",
+ "metadata": {},
+ "source": [
+ "_____\n",
+ "\n",
+ "![](https://ugokawaii.com/wp-content/uploads/2023/02/gears.gif)\n",
+ "## Temporal Focused Data\n",
+ "Let's take a look at data collected during the weekly Time Series (TS) campaigns using the `snowexsql` database for data access."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fa05e6a4-51b0-4a1a-aed0-02c1fa880b6c",
+ "metadata": {},
+ "source": [
+ "### III: 2020/2021 Western U.S Time Series \n",
+ "Objective - Explore data within the `snowexsql` database\\\n",
+ "Data description - [specify here] \\\n",
+ "Datasets -\n",
+ "1. [SnowEx20 Time Series Snow Pit Measurements, Version 2 ](https://nsidc.org/data/snex20_ts_sp/versions/2)\n",
+ "2. [SnowEx21 Time Series Snow Pit Measurements, Version 1](https://nsidc.org/data/snex21_ts_sp/versions/1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d539b2c9-454a-48b5-8ac2-cb2d090ec93b",
+ "metadata": {},
+ "source": [
+ "Let me start by sharing a teaser of what's we can do with weekly snow pit observations from multiple sites around the Western U.S. \n",
+ "\n",
+ "![](./content/03_pitprogression-BogusBasin.png)\n",
+ "\n",
+ "**Figure X** (cap here)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f1483c77-fc80-4f38-8ad3-d458f85446bc",
+ "metadata": {},
+ "source": [
+ "To do this, we are going to use the snowexsql database. Here are the imports we need to gain access. \n",
+ "#### Set Up Computing Environment"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "0982d0cc-1950-44e6-9cb0-b033bc5eb6f4",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#database imports\n",
+ "from snowexsql.db import get_db\n",
+ "from snowexsql.data import PointData, LayerData, ImageData, SiteData\n",
+ "from snowexsql.conversions import query_to_geopandas"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c8347590-f21f-4482-9ad8-746cb8a91496",
+ "metadata": {},
+ "source": [
+ "### The Basics\n",
+ "#### How are the data contained?\n",
+ "![](./content/03_db-layers.png)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "a3f7e310-368d-499b-bcbb-65d8972da711",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "89d66b97-fff0-4bb9-802d-43777dff7e79",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# decide how much to use from 2022 tutorial\n",
+ "\n",
+ "# mini leadup examples (1a, 1b, 1c, 1d - mini queries, very helpful to introduce!)\n",
+ "\n",
+ "# plot snow temp profiles\n",
+ "# find where we have liquid water content (LWC) data "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "ee8f7b32-5a0f-4c63-b268-534290b2d1bb",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# wrap it all up nicely!"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "46aab5fd-ba59-4cd2-8e5c-e6d6974471a3",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.9"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/book/tutorials/snowex-core/content/01_banner.png b/book/tutorials/snowex-core/content/01_banner.png
new file mode 100644
index 0000000..14274ab
Binary files /dev/null and b/book/tutorials/snowex-core/content/01_banner.png differ
diff --git a/book/tutorials/snowex-core/content/01_map-n-barchart.png b/book/tutorials/snowex-core/content/01_map-n-barchart.png
new file mode 100644
index 0000000..9e1b3f6
Binary files /dev/null and b/book/tutorials/snowex-core/content/01_map-n-barchart.png differ
diff --git a/book/tutorials/snowex-core/content/01_snow-class-map.png b/book/tutorials/snowex-core/content/01_snow-class-map.png
new file mode 100644
index 0000000..e06345e
Binary files /dev/null and b/book/tutorials/snowex-core/content/01_snow-class-map.png differ
diff --git a/book/tutorials/snowex-core/content/01_snow-classes-barchart.png b/book/tutorials/snowex-core/content/01_snow-classes-barchart.png
new file mode 100644
index 0000000..68f913d
Binary files /dev/null and b/book/tutorials/snowex-core/content/01_snow-classes-barchart.png differ
diff --git a/book/tutorials/snowex-core/content/01_snow-classes-sturm.png b/book/tutorials/snowex-core/content/01_snow-classes-sturm.png
new file mode 100644
index 0000000..a89f8da
Binary files /dev/null and b/book/tutorials/snowex-core/content/01_snow-classes-sturm.png differ
diff --git a/book/tutorials/snowex-core/content/01_snowex-map.png b/book/tutorials/snowex-core/content/01_snowex-map.png
new file mode 100644
index 0000000..51dd0c8
Binary files /dev/null and b/book/tutorials/snowex-core/content/01_snowex-map.png differ
diff --git a/book/tutorials/snowex-core/content/01_teaser.png b/book/tutorials/snowex-core/content/01_teaser.png
new file mode 100644
index 0000000..4f870ea
Binary files /dev/null and b/book/tutorials/snowex-core/content/01_teaser.png differ
diff --git a/book/tutorials/snowex-core/content/02_GMpitMap.jpg b/book/tutorials/snowex-core/content/02_GMpitMap.jpg
new file mode 100644
index 0000000..c7e0738
Binary files /dev/null and b/book/tutorials/snowex-core/content/02_GMpitMap.jpg differ
diff --git a/book/tutorials/snowex-core/content/02_ak-boreal-vegclass.png b/book/tutorials/snowex-core/content/02_ak-boreal-vegclass.png
new file mode 100644
index 0000000..3313541
Binary files /dev/null and b/book/tutorials/snowex-core/content/02_ak-boreal-vegclass.png differ
diff --git a/book/tutorials/snowex-core/content/02_ak-codes.png b/book/tutorials/snowex-core/content/02_ak-codes.png
new file mode 100644
index 0000000..c369289
Binary files /dev/null and b/book/tutorials/snowex-core/content/02_ak-codes.png differ
diff --git a/book/tutorials/snowex-core/content/02_ak-sampling-design.png b/book/tutorials/snowex-core/content/02_ak-sampling-design.png
new file mode 100644
index 0000000..760d381
Binary files /dev/null and b/book/tutorials/snowex-core/content/02_ak-sampling-design.png differ
diff --git a/book/tutorials/snowex-core/content/02_ak-sites-n-flights.png b/book/tutorials/snowex-core/content/02_ak-sites-n-flights.png
new file mode 100644
index 0000000..efde632
Binary files /dev/null and b/book/tutorials/snowex-core/content/02_ak-sites-n-flights.png differ
diff --git a/book/tutorials/snowex-core/content/02_ak-sites.png b/book/tutorials/snowex-core/content/02_ak-sites.png
new file mode 100644
index 0000000..cafeb5d
Binary files /dev/null and b/book/tutorials/snowex-core/content/02_ak-sites.png differ
diff --git a/book/tutorials/snowex-core/content/02_data-package.png b/book/tutorials/snowex-core/content/02_data-package.png
new file mode 100644
index 0000000..afb2b14
Binary files /dev/null and b/book/tutorials/snowex-core/content/02_data-package.png differ
diff --git a/book/tutorials/snowex-core/content/02_depth_spirals.png b/book/tutorials/snowex-core/content/02_depth_spirals.png
new file mode 100644
index 0000000..e685663
Binary files /dev/null and b/book/tutorials/snowex-core/content/02_depth_spirals.png differ
diff --git a/book/tutorials/snowex-core/content/02_matrix.png b/book/tutorials/snowex-core/content/02_matrix.png
new file mode 100644
index 0000000..e130187
Binary files /dev/null and b/book/tutorials/snowex-core/content/02_matrix.png differ
diff --git a/book/tutorials/snowex-core/content/02_measurement-types.png b/book/tutorials/snowex-core/content/02_measurement-types.png
new file mode 100644
index 0000000..25f350f
Binary files /dev/null and b/book/tutorials/snowex-core/content/02_measurement-types.png differ
diff --git a/book/tutorials/snowex-core/content/02_nsidc-banner.png b/book/tutorials/snowex-core/content/02_nsidc-banner.png
new file mode 100644
index 0000000..6b4370b
Binary files /dev/null and b/book/tutorials/snowex-core/content/02_nsidc-banner.png differ
diff --git a/book/tutorials/snowex-core/content/02_pit-parameters.png b/book/tutorials/snowex-core/content/02_pit-parameters.png
new file mode 100644
index 0000000..42ce140
Binary files /dev/null and b/book/tutorials/snowex-core/content/02_pit-parameters.png differ
diff --git a/book/tutorials/snowex-core/content/03_adirondack-sampler.jpg b/book/tutorials/snowex-core/content/03_adirondack-sampler.jpg
new file mode 100644
index 0000000..8b9f603
Binary files /dev/null and b/book/tutorials/snowex-core/content/03_adirondack-sampler.jpg differ
diff --git a/book/tutorials/snowex-core/content/03_ak-pits-boxplots.png b/book/tutorials/snowex-core/content/03_ak-pits-boxplots.png
new file mode 100644
index 0000000..46a2b28
Binary files /dev/null and b/book/tutorials/snowex-core/content/03_ak-pits-boxplots.png differ
diff --git a/book/tutorials/snowex-core/content/03_ak-pits-landcov-boxplots.png b/book/tutorials/snowex-core/content/03_ak-pits-landcov-boxplots.png
new file mode 100644
index 0000000..d723e3f
Binary files /dev/null and b/book/tutorials/snowex-core/content/03_ak-pits-landcov-boxplots.png differ
diff --git a/book/tutorials/snowex-core/content/03_db-layers.png b/book/tutorials/snowex-core/content/03_db-layers.png
new file mode 100644
index 0000000..5ea9b2b
Binary files /dev/null and b/book/tutorials/snowex-core/content/03_db-layers.png differ
diff --git a/book/tutorials/snowex-core/content/03_granules.png b/book/tutorials/snowex-core/content/03_granules.png
new file mode 100644
index 0000000..f3e9b0c
Binary files /dev/null and b/book/tutorials/snowex-core/content/03_granules.png differ
diff --git a/book/tutorials/snowex-core/content/03_pitprogression-BogusBasin.png b/book/tutorials/snowex-core/content/03_pitprogression-BogusBasin.png
new file mode 100644
index 0000000..863344b
Binary files /dev/null and b/book/tutorials/snowex-core/content/03_pitprogression-BogusBasin.png differ
diff --git a/book/tutorials/snowex-core/content/03_snow-sculpture.jpg b/book/tutorials/snowex-core/content/03_snow-sculpture.jpg
new file mode 100644
index 0000000..3cf3439
Binary files /dev/null and b/book/tutorials/snowex-core/content/03_snow-sculpture.jpg differ
diff --git a/book/tutorials/snowex-core/index.md b/book/tutorials/snowex-core/index.md
new file mode 100644
index 0000000..244af73
--- /dev/null
+++ b/book/tutorials/snowex-core/index.md
@@ -0,0 +1,4 @@
+# SnowEx Data Overview
+
+```{tableofcontents}
+```