FormalPara Overview

The purpose of this chapter is to demonstrate how to produce annual maps representing the first day within a year on which a given pixel reaches 0% snow cover. It also provides suggestions for summarizing and visualizing the results over time and space.

FormalPara Learning Outcomes
  • Generating and using a date band in image compositing.

  • Applying temporal filtering to an ImageCollection.

  • Identifying patterns of seasonal snowmelt.

Helps if you know how to:

  • Import images and image collections, filter, and visualize (Part 1).

  • Perform basic image analysis: select bands, compute indices, create masks (Part 2).

  • Work with time-series data in Earth Engine (Part 4).

  • Fit linear and nonlinear functions with regression in an ImageCollection time series (Chap. 18).

1 Introduction to Theory

The timing of annual seasonal snowmelt (Fig. 45.1) and any potential change in that timing have broad ecological implications and thus impact human livelihoods, particularly in and around high-latitude and mountainous systems. The annual melting of accumulated winter snowfall, one of the most important phases of the hydrologic cycle within these regions, provides the dominant source of water for streamflow and groundwater recharge for approximately one sixth of the global population (Musselman et al. 2017; Barnhart et al. 2016; Bengtsson 1976). The timing of snowmelt in the Arctic and Antarctic influences the length of the growing season, and consistent snow cover throughout the winter insulates vegetation from harsh temperatures and wind (Duchesne et al. 2012; Kudo et al. 1999). In mountainous regions, such as the Himalayas, snowmelt is a major source of freshwater downstream (Barnhart et al. 2016) and is essential in recharging groundwater.

Fig. 45.1
A map highlights the pattern of annual seasonal snowmelt timing in the Northern Hemisphere shaded in different colors and darker at the center.

Arctic polar stereographic projection showing the pattern of snowmelt timing in the Northern Hemisphere. The image shows the first day in 2018 on which each pixel no longer contained snow, as detected by the Moderate Resolution Imaging Spectroradiometer (MODIS) Snow Cover Daily Global product. The color grades from purple (earlier) to yellow (later)

This seasonal water resource is one of the fastest-changing hydrologic systems under Earth’s warming climate, and these changes will broadly impact regional economies and ecosystem functioning and increase the potential for flood hazards (Musselman et al. 2017; IPCC 2007; Beniston 2012; Allan and Casillo 2007; Barnett and Lettenmaier 2005). An analysis focusing on the Yamal Peninsula in the northwestern Siberian tundra found that the timing of snowmelt (calculated using the methods outlined here) was an important predictor of differences in ecosystem functioning across the landscape (Tassone et al. 2020).

The anticipated warmer temperatures will alter the type and onset of precipitation. Multiple regions, including the Rocky Mountains of North America, have already measured a reduction in snowpack volume, and warmer temperatures have shifted precipitation from snowfall to rain, causing snowmelt to occur earlier (Barnhart et al. 2016; Clow 2010; Harpold et al. 2012).

This tutorial demonstrates how to calculate the first day of no snow annually at the pixel level, providing the user with the ability to track the seasonal and interannual variability in the timing of snowmelt toward a better understanding of how the hydrological cycles of higher-latitude and mountainous regions are responding to climate change.

2 Practicum

2.1 Section 1: Identifying the First Day of 0% Snow Cover

This section covers building an ImageCollection where each image is a mosaic of pixels that describe the first day in a given year that 0% snow cover was recorded. Snow cover is defined by the MODIS Normalized Difference Snow Index (NDSI) Snow Cover Daily Global product. The general workflow is as follows.

  1. 1.

    Define the date range to consider for analysis.

  2. 2.

    Define a function that adds date information as bands to snow cover images.

  3. 3.

    Define an analysis mask.

  4. 4.

    For each year:

    1. a.

      Filter the ImageCollection to observations from the given year.

    2. b.

      Add date bands to the filtered images.

    3. c.

      Identify the first day of the year without any snow per pixel.

    4. d.

      Apply an analysis mask to the image mosaic.

    5. e.

      Summarize the findings with a series of visualizations.

2.1.1 Section 1.1: Define the Date Range

First, we specify the day of year (DOY) on which to start the search for the first day with 0% snow cover. For applications in the Northern Hemisphere, you will likely want to start with January 1 (DOY 1). However, if you are studying snowmelt timing in the Southern Hemisphere (e.g., the Andes), where snowmelt can occur on dates on either side of January 1, it is more appropriate to start the year on July 1 (DOY 183), for instance. In this calculation, a year is defined as the 365 days beginning from the specified startDoy.

A single-line code reads, var start D o y =1, semicolon.

Then, we define the years to start and end tracking snow cover fraction. All years in the range will be included in the analysis.

A two-line code reads, var start year = 2000 semicolon, var end year = 2019 semicolon.

2.1.2 Section 1.2: Define the Date Bands

Next, we will define a function to add several date bands to the images; the added bands will be used in a future step. Each image has a metadata timestamp property, but since we will be creating annual image mosaics composed of pixels from many different images, the date needs to be encoded per pixel as a value in an image band so that it is retained in the final mosaics. The function encodes:

  • Calendar DOY (calDoy): enumerated DOY from January 1.

  • Relative DOY (relDoy): enumerated DOY from a given startDoy.

  • Milliseconds elapsed since the Unix epoch (millis).

  • Year (year): Note that the year is tied to the startDoy. For example, if the startDoy is set at 183, the analysis will cross into the next calendar year, and the year given to all pixels will be the earlier year, even if a particular image was collected on or after January 1 of the subsequent year.

Additionally, two global variables are initialized (startDate and startYear) that will be redefined iteratively in a subsequent step.

A code is written to do the following tasks. Get image date, get calendar day-of-year, get relative day-of-year; enumerate user-defined start D O Y, get the date as milli seconds from Unix epoch, add all of the above data info as bands to the snow fraction image, and so on.

2.1.3 Section 1.3: Define an Analysis Mask

Here is the opportunity to define a mask for your analysis. This mask can be used to constrain the analysis to certain latitudes, land cover types, geometries, etc. In this case, we will (1) mask out water so that the analysis is confined to pixels over landforms only, (2) mask out pixels that have very few days of snow cover, and (3) mask out pixels that are snow covered for a good deal of the year (e.g., glaciers).

Import the MODIS Land/Water Mask dataset, select the ‘water_mask’ band, and set all land pixels to value 1.

A code reads, var water mask equals e e dot image, left parenthesis, M O D I S slash M O D 44 W slash M O D 44 W underscore 005 underscore 2000 underscore 02 underscore 24, right parenthesis. Select, left parenthesis, water underscore mask, right parenthesis. Not parentheses, semicolon.

Import the MODIS Snow Cover Daily Global 500 m product and select the ‘NDSI_Snow_Cover’ band.

A code reads, var complete col equals e e dot image collection, left parenthesis M O D I S slash 006 slash M O D 10 A 1, right parenthesis, select, left parenthesis, N D S I underscore snow underscore cover, right parenthesis, semicolon.

Mask pixels based on the frequency of snow cover.

A code is written to do the following tasks. Pixels must have been 10 percent snow-covered for at least 2 weeks in 2028 and pixels must not be 10 percent snow-covered for more than 124 days in 2018.

Combine the water mask and the snow cover frequency masks.

A code reads, var analysis mask equals water mask dot multiply, left parenthesis, snow cover Ephem, right parenthesis, multiply, left parenthesis, snow cover const, right parenthesis, semicolon.

2.1.4 Section 1.4: Identify the First Day of the Year Without Snow per Pixel, per Year

Make a list of the years to process. The input variables were defined in Sect. 45.2.1.1.

A code reads, var years equals e e dot list dot sequence, left parenthesis, start year, end year, right parenthesis, semicolon.

Map the following function over the list of years. For each year, identify the first day with 0% snow cover.

  1. 1.

    Define the start and end dates to filter the dataset for the given year.

  2. 2.

    Filter the ImageCollection by the date range.

  3. 3.

    Add the date bands to each image in the filtered collection.

  4. 4.

    Sort the filtered collection by date. (Note: To determine the first day with snow accumulation in the fall, reverse sort the filtered collection.)

  5. 5.

    Make a mosaic using the min reducer to select the pixel with 0 (minimum) snow cover. Since the collection is sorted by date, the first image with 0 snow cover is selected. This operation is conducted per pixel to build the complete image mosaic.

  6. 6.

    Apply the analysis mask to the resulting mosaic.

An ee.List of images is returned.

A code is written to do the following tasks. Set the global start year variable as the year being worked on so that, it will be accessible to the add date bands mapped to the collection below, get the first day-of-yar for this year as an e e. Date object, and so on.
A code is written to do the following tasks. Construct an image where pixels represent the first day within the date, range that the lowest snow fraction is observed, mask by minimum snow fraction- only include pixels that reach, and percent cover, return the resulting image.

Convert the ee.List of images to an ImageCollection.

A code reads, var annual col equals e e dot image collection dot from images, left parenthesis annual list, right parenthesis.

Code Checkpoint A26a. The book’s repository contains a script that shows what your code should look like at this point.

2.2 Section 2: Data Summary and Visualization

The following is a series of examples for how to display and explore the “first DOY with no snow” dataset you just generated.

  • These examples refer to the calendar date (calDoy band) when displaying and incorporating date information in calculations. If you are using a date range that begins on any day other than January 1 (DOY 1) you may want to replace calDoy with relDoy in all cases below.

  • Results may appear different as you zoom in and out of the Map because of tile aggregation, which is described in the Earth Engine documentation. It is best to view Map data interactively with a relatively high zoom level. Additionally, for any analysis where a function provides a scale parameter (e.g., region reduction, exporting results), it is best to define it with the native resolution of the dataset (500 m).

  • MODIS cloud masking can influence results. If there are a number of sequentially masked image pixel observations (e.g., clouds, poor quality), the actual date of the first observation with 0% snow cover may be earlier than identified in the image time series. Regional patterns may be less influenced by this bias than local results. For local results, please inspect image masks to understand their influence on the dates near snowmelt timing.

2.2.1 Section 2.1: Single-Year Map

Filter a single year from the collection (2018 in the example below) and display the image to the Map to see spatial patterns of snowmelt timing. Setting the min and max parameters of the visArgs variable to a narrow range around expected snowmelt timing is important for getting a good color stretch.

A code is written to do the following tasks. Define a year to visualize, define visualization arguments, subset the year of interest, and display it on the map.

Running this code produces something similar to Fig. 45.2. The color represents the DOY when 0% snow cover was first observed per pixel (blue is earlier, yellow is later).

Fig. 45.2
A close-up of a thematic map of North America. It highlights the first D O Y with 0 percent snow cover in Canada.

Thematic map representing the first DOY with 0% snow cover. Color grades from blue to yellow as the DOY increases

One can notice a number of interesting patterns. Frozen lakes have been shown to decrease air temperatures in adjacent pixels, resulting in delayed snowmelt (Rouse et al. 1997; Salomonson and Appel 2004; Wang and Derksen 2008). Additionally, the protected estuaries of the Northwest Passages have earlier dates of no snow compared to the landscapes exposed to the currents and winds of the Northern Atlantic. Latitude, elevation, and proximity to ocean currents are the strongest determinants in this region.

Note that pixels representing glaciers that did not get removed by the analysis mask can produce anomalies in the data. Since glaciers are generally snow covered, the DOY with the least snow cover according to the MODIS Snow Cover Daily Global product is presented in the Map. In Fig. 45.2, this is evident in the abrupt transition within alpine areas of Baffin Island (white pixels represent glaciers in this case).

2.2.2 Section 2.2: Year-to-Year Difference Map

Compare year-to-year difference in snowmelt timing by selecting two years of interest from the collection and subtracting them. Here, we are calculating the difference in snowmelt timing between 2005 and 2015.

A code is written to do the following tasks. Define the years to difference, calculate the difference image, define visualization arguments, and display it on the map.

Running this code produces something similar to Fig. 45.3. The color represents the difference, in each pixel, between the 2005 and 2015 DOY when 0% snow cover was first observed. Red represents a negative change (an earlier no-snow date in 2015), blue represents a positive change (a later no-snow date in 2015), and white represents a negligible or no change in the no-snow dates for 2005 and 2015.

Fig. 45.3
A map that highlights the Himalayas on the Nepal-China border. The borders on the map are shaded in different colors and resemble the roots of a tree.

Year-to-year (2005–2015) difference map of the Himalayas on the Nepal–China border. Color grades from red to blue, with red indicating an earlier date of no snow in 2015 and blue indicating a later date of no snow in 2015. White areas indicate little or no change

2.2.3 Section 2.3: Trend Analysis Mapping

It is also possible to identify trends in the shifting first DOY with no snow by calculating the slope through a pixel’s time-series points. Here, the slope for each pixel is calculated with year as the x variable and the first DOY with no snow as the y variable.

A code is written to do the following tasks. Calculate the slope image, define visualization arguments, and display it on the map.

The result is a map (Fig. 45.4) where red represents a negative slope (progressively earlier first DOY with no snow), white represents a slope of 0, and blue represents a positive slope (progressively later first DOY with no snow). In southern Norway and Sweden, the trend in the first DOY with no snow between 2002 and 2019 appears to be influenced by various factors. Coastal areas exhibit progressively earlier first DOY of no snow than inland areas; however, high variability in slopes can be observed around fjords and in mountainous regions. This map reveals the complexity of seasonal snow dynamics in these areas.

Fig. 45.4
A close-up view of a map of North-West Asia. It highlights the slope of the first D O Y with no snow cover between 2000 and 2019 in Norway and Sweden.

Map representing the slope of the first DOY with no snow cover between 2000 and 2019. The slope represents the overall trend. Color grades from red (negative slope) to blue (positive slope). White indicates areas of little to no change

Note that goodness-of-fit calculations are not measured here, nor is significance considered. While a slope can indicate regional trends, more local trends should be investigated using a time-series chart (see the next section). Interannual variability can be influenced by masked pixels, as described above.

2.2.4 Section 2.4: Time-Series Chart

To visually understand the temporal patterns of the first DOY with no snow through time, we can display our results in a time-series chart. In this case, we have defined a circle with a radius of 500 m around a point of interest and calculated the annual mean first DOY with no snow for pixels within that circle.

A code is written to do the following tasks. Define an A O I, calculate the annual mean D O Y of A O I, and print chart to console.
A code is written to do the following tasks. Define an A O I, calculate the annual mean D O Y of A O I, and print chart to console.

Code Checkpoint A26b. The book’s repository contains a script that shows what your code should look like at this point.

As is evident in the displayed results (Fig. 45.5), the first DOY with no snow was mostly stable from 2000 to 2012; following this, it has become more erratic.

Fig. 45.5
A line graph plots day-of-year versus year. Some of the estimated values are as follows. (2000, 175), (2006, 173), (2012, 177), (2018, 168). It has a fluctuation over years.

Annual mean first DOY with no snow time series for pixels within a small region of interest

3 Synthesis

Assignment 1. In Sect. 45.2.2.4, a time-series chart for a region of interest was generated. Suppose you wanted to compare several regions in the same chart; how would you change the code to achieve this? For instance, try plotting the first DOY of no snow at points (− 69.271, 65.532) and (− 104.484, 65.445) in the same chart. Some helpful functions include ee.Image.reduceRegions, ee.FeatureCollection.flatten, and ui.Chart.feature.groups.

Assignment 2. The objective of this chapter was to identify the first DOY of 0% snow cover. However, Sect. 45.2.1.4 provides a suggestion for altering the code to identify the last day of 0% snow cover. Can you modify the code to achieve this result?

Assignment 3. How could you determine regions that are often masked during the time of year when snowmelt occurs? (The results from such regions might not be reliable.) Hint: Think about how you can use the mask function on images and investigate the ‘NDSI_Snow_Cover_Class’ and ‘Snow_Albedo_Daily_Tile_Class’ bands.

4 Conclusion

In this chapter, we provided a method to identify the annual, per pixel, first DOY with no snow from MODIS snow cover image data. The result can be used to investigate patterns of seasonal snowmelt spatially and temporally. The method relied on adding a date band to each image in the collection, temporal sorting, and ImageCollection reduction. We demonstrated several different ways to analyze the results using map and chart interpretation, image differencing, and linear regression.