The overall goal of the project is to extend the Revised Universal Soil Loss Equation RUSLE (Renard, 1997) by including the effects of snowfall and snowmelt on soil erosion. The first step is to distinguish between precipitation in the form of rain (erosive) or snow (non-erosive). Additionally, snow-covered areas are detected at the end of each month using freely available satellite data (e.g. Sentinel-2). These two steps precede the presented code and have already been automated.
The aim of the presented code is to calculate monthly snowpack dynamics and to identify monthly snowmelt to later incorporate its erosive forces. The results are written as georeferenced raster files (.tif format) and can be accessed by all common GIS programs. Optionally, the user can plot various statistical values (e.g. snow cover) over time. If only a subarea is of interest, this can be defined by a shapefile. The previously calculated snowfall (mm) and the identified snow cover serve as input data. The following figure provides a highly simplified overview. Details can be found in the code diagram and the code description.
Python libraries: geo_utils, gdal, matplotlib.pyplot, numpy, pandas, rasterstats, scipy
The geo_utils package can be downloaded here and/or the path where the package is saved can be defined in the config.py file.
Standard libraries: glob, logging, os, sys, time
The following rasters have to be provided to run the code:
- Raster of measured snow depth
- Raster of satellite data of the snow cover with the values 0 and 1, describing if there is snow (1) or if there is not (0)
- Shapefile defining the zone for the statistical calculations
Both rasters listed in 1. and 2. have to be provided as .tif
rasters and have to include the month and the year in the following way:
*yy_mm.tif
File where all required libraries and global variables are loaded. The following input arguments can be defined by the user:
Input argument | Type | Description |
---|---|---|
snow_path_mm |
STRING | Path of measured snow depth rasters |
snow_cover_path |
STRING | Path of rasters of satellite data describing the snow cover |
path_results |
STRING | Path of the results folders |
path_geo_utils |
STRING | Path where geo_utils package is stored |
shape_zone |
STRING | Path of shapefile used for zonal statistics |
statistical_param |
STRING | Statistical parameter which is/are plotted |
plot_statistics |
BOOL | Dis- or enable plotting |
plot_result |
STRING | Path of folder for the plotting result |
File where the logger and its streamhandler are set up and the basic logging configurations can be changed. The following three functions are defined to record when an arbitrary function is entered and exited.
Wrapper function to define which functions are called before and after another function.
Input argument | Type | Description |
---|---|---|
pre |
STRING | Function which is called before the wrapped function |
post |
STRING | Function which is callled after the wrapped function |
Logs at what time a function is entered.
Logs at what time a function is exited.
File where DataManagement
class is stored. This class contains useful and robust methods for managing output folders, extracting information from raster files and writing raster files using the previously extracted information.
The class provides the following methods:
Assigns values to class attributes when a new instance is initiated.
Input argument | Type | Description |
---|---|---|
path |
STRING | Path needed to manage output folders |
filename |
STRING | Filename |
Method creates folder at instantiated path, if it does not already exists.
return: None
Method gets the month and the year from the instantiated filenames.
return: INTEGERs sm_year
,sm_month
Method which returns a date string by calling the get_date method.
return: STRING datestring
Method which get the projection and geotransformation from a raster file (osgeo.gdal.Dataset)
return: TUPLE gt
, STRING proj
Static Method which creates and saves raster-file (.tif) from an existing array using a defined projection and geotransformation data.
Input argument | Type | Description |
---|---|---|
res_path |
STRING | Path and result filename |
array |
ARRAY | Values to rasterize |
gt |
TUPLE | gdal.DataSet.GetGeoTransform object |
proj |
STRING | gdal.DataSet.GetProjection object |
return: None
File where ArrayCalculations
class is stored. This class is for mathematical operations on arrays to calculate snow depths. It provides the following methods:
Assigns values to class attributes when a new instance is initiated.
Input argument | Type | Description |
---|---|---|
snow_start_of_period |
ARRAY | Snow depth at start of period |
snow_cover |
ARRAY | Satellite data of snow cover |
snow_measured |
ARRAY | Measured snow depth |
Calculates snow depth at the end of the period by multiplying the snow depth at the start of the period with the satellite data of the snow cover.
return: ARRAY snow_end_of_period
Calculates snow depth acting as snowmelt by substracting the actual snow depth at the end of the period from the calculated snowsum at the beginning of the period.
Input argument | Type | Description |
---|---|---|
snow_end_of_period |
ARRAY | Actual snow depth at end of a period |
return: ARRAY snowmelt
Calculates snow depth at the beginning of a period by summing up the actual snow depth transferred from the previous month and the measured snow depth.
Input argument | Type | Description |
---|---|---|
snow_end_of_period |
ARRAY | Actual snow depth at end of a period |
return: ARRAY snow_start_of_period
File where CompareData
class is stored. This class is for comparing different properties of arrays, objects and rasters. It provides the following methods:
Assigns values to class attributes when new instance is initiated.
Input argument | Type | Description |
---|---|---|
array_one |
ARRAY | Arbitrary array to be compared |
array_two |
ARRAY | Abitrary array to be compared |
raster_one_path |
STRING | Path of arbitrary raster to be compared |
raster_two_path |
STRING | Path of arbitrary raster to be compared |
Compares the number of columns and the number of rows of two arrays.
Static method which compared the number of items of two objects.
Input argument | Type | Description |
---|---|---|
object_one |
LIST, STRING, etc. | Object on which the len() function can be applied |
object_two |
LIST, STRING, etc. | Object on which the len() function can be applied |
Rounds geotransformation values of two rasters off to four decimal places and compares them.
Compares the projection of two rasters.
File where ZonStatistics
class is stored. This Class contains useful methods to calculate and plot zonal statistics, including a custom statistic for calculating the (snow) cover of a user-defined zone.
It provides following methods:
Assigns values to class attributes when new instance is initiated.
Input argument | Type | Description |
---|---|---|
path_raster |
LIST | Paths to raster files |
shape |
STRING | Path to shapefile defining the zone for calculating the statistics |
datelist |
LIST | Datestrings, format yy_mm |
parameter |
STRING | Definition of statistical parameter to be plotted |
Method which creates a dataframe containing necessary information to plot the results. User defines the statistical value which should be plotted in config.py (here: Coverage).
return: DATAFRAME df_statistics
Method which calculates several statistical values.
Input argument | Type | Description |
---|---|---|
list_entry |
INTEGER | Identification of the raster to calculate the statistical values |
return: LIST stats
Method which plots the desired statistical value over time and writes a .png-image.
Method can be disabled in config.py
(plot_statistic=False
).
Custom statistic to calculate the percentage of values above zero (e.g. snow coverage, or areas of snow melt).
Input argument | Type | Description |
---|---|---|
raster_array |
MASKED ARRAY | Contains raster array |
return: INTEGER calc_coverage
The following basic functions and functions wrapping up different class methods are stored in this file:
Calculates the snow depth acting as snowmelt, the snow depth at the end of a period and the snow depth at the beginning of the next period by instanciating an object of the RasterCalculations
class.
Input argument | Type | Description |
---|---|---|
snow_at_start |
ARRAY | Snow depth at beginning of the period |
measured_snow_next_period |
ARRAY | Measured snow depth at the beginning of the next period |
satellite_data |
ARRAY | Satellite data of the snow cover |
return: ARRAYs snow_at_end_array
, snowmelt_array
, snow_start_array
Compares the size of two arrays, the geotransformation and projections of two rasters and the number of items in two objects by instanciating an object of the CompareData
class.
Input argument | Type | Description |
---|---|---|
array_one |
ARRAY | Arbitrary array to be compared |
array_two |
ARRAY | Arbitrary array to be compared |
raster_one_path |
STRING | Path of arbitrary raster to be compared |
raster_two_path |
STRING | Path of arbitrary raster to be compared |
object_one |
LIST, STRING, etc. | Object on which the len() function can be applied |
object_two |
LIST, STRING, etc. | Object on which the len() function can be applied |
Extracts the dates from the filenames of two rasters and compares them by instantiating an object of the DataManagement
class.
Input argument | Type | Description |
---|---|---|
filename_one |
STR | Filename of raster one |
filename_two |
STR | Filename of raster two |
Function which creates three empty lists.
return: LISTs list1
, list2
, list3
Appends objects to lists.
Input argument | Type | Description |
---|---|---|
list1 |
LIST | Arbitrary list |
list2 |
LIST | Arbitrary list |
list3 |
LIST | Arbitrary list |
object1 |
ARRAY, INT, etc. | Object which is appendable to a list |
object2 |
ARRAY, INT, etc. | Object which is appendable to a list |
object3 |
ARRAY, INT, etc. | Object which is appendable to a list |
return: LISTs list1
, list2
, list3
Function receives 2 list objects and returns two file paths.
Input argument | Type | Description |
---|---|---|
list1_object |
STRING | Indexed string object from list |
list2_object |
STRING | Indexed string object from list |
return: STRINGs path1
, path2
File where the most relevant functions are stored, including the main()
function.
Reads an arbitrary number of raster files from 2 different folders, extracts the date and the corresponding raster arrays and saves them into lists for further calculations.
Input argument | Type | Description |
---|---|---|
list_rasterpaths1 |
LIST | Paths to raster files |
list_rasterpaths2 |
LIST | Paths to raster files |
return: LISTs date_list
, array_list1
, array_list2
Calculates snow depths for different time periods by iterating over arrays stored in lists.
Input argument | Type | Description |
---|---|---|
initial_snow |
ARRAY | Snow depth at start of first time period |
satellite_data |
LIST | Arrays of snow cover data |
measured_snow_next_period |
LIST | Arrays of measured snow depths |
return: LISTs snow_end_month
, snow_melt