GEE Dataset - DynQual Global Surface Water Quality Dataset

DynQual Global Surface Water Quality Dataset
Maintaining optimal surface water quality is critical to protecting ecosystems and ensuring safe water for humans. However, our knowledge of surface water quality mainly relies on data from monitoring stations, which are limited in space and fragmented in time. To address these limitations, we introduce a dynamic model of surface water quality (DynQual). The model simulates water temperature (Tw) as well as concentrations of total dissolved solids (TDS), biological oxygen demand (BOD) and fecal coliforms (FC). DynQual has a time step of day and a spatial resolution of 5 arc minutes (∼10 km). Foreword – Artificial Intelligence Tutorial

This comprehensive global model allows us to evaluate its performance against real-world water quality observations. In addition, we present the spatial patterns and temporal trends of TDS, BOD, and FC concentrations from 1980 to 2019. Our analysis identified the main industries responsible for surface water pollution. Notably, DynQual identified widespread, multiple pollution hotspots, especially in northern India and eastern China, although water quality problems spanned all regions of the globe. The areas with the greatest decline in water quality are developing regions, especially sub-Saharan Africa and South Asia. Researchers have access to open-source model code (Jones et al., 2023) as well as global datasets that include simulated hydrology, Tw, TDS, BOD, and FC at 5 arcmin-per-month resolution (Jones et al., 2022b). These datasets have the potential to enhance research ranging from ecological studies to human health and water scarcity assessments. For more information visit DynQual Model Code UU-Hydro/DYNQUAL: DynQual v1.0 | Zenodo and Global Surface Water Quality DatasetGlobal monthly hydrology and water quality datasets, derived from the dynamical surface water quality model (DynQual) at 10 km spatial resolution | Zenodo . You can read the full paper here GMD - DynQual v1.0: a high-resolution global surface water quality model

For guidance on displaying concentration plots in the original paper, the authors recommend plotting concentrations only above a specific drainage/channel storage threshold picture.

Disclaimer: Full or partial descriptions of datasets are provided by the authors or their works.

Dataset preprocessing
Download the dataset and convert it from NetCDF to Geotiff format for input. Since this is a multi-band monthly aggregated image, and I want to allow the user to slice by time period, the image bands are separated as a single image, and the overall result is a collection of images with date range information attached.

Citation¶ _

Jones, E. R., Bierkens, M. F. P., Wanders, N., Sutanudjaja, E. H., van Beek, L. P. H., and van Vliet, M. T. H.:
DynQual v1.0: a high-resolution global surface water quality model, Geosci. Model Dev., 16, 4481–4500, https://doi.
org/10.5194/gmd-16-4481-2023, 2023.

Dataset citation¶

Jones, E. R., Bierkens, M. F. P., Wanders, N., Sutanudjaja, E. H., van Beek, L. P. H., & van Vliet, M. T. H.
(2022). Global monthly hydrology and water quality datasets, derived from the dynamical surface water quality
model (DynQual) at 10 km spatial resolution [Data set]. In Geoscientific Model Development (Vol. 16, pp.
4481–4500). Zenodo. https://doi.org/10.5281/zenodo.7139222

  

fc_constrained

Earth Engine Snippet

var fc = ee.ImageCollection("projects/sat-io/open-datasets/DYNQUAL/fecal-coliform");
var discharge = ee.ImageCollection("projects/sat-io/open-datasets/DYNQUAL/discharge");
var tds = ee.ImageCollection("projects/sat-io/open-datasets/DYNQUAL/total-dissolved-solids");
var bod = ee.ImageCollection("projects/sat-io/open-datasets/DYNQUAL/biological-oxygen-demand");
var water_temp = ee.ImageCollection("projects/sat-io/open-datasets/DYNQUAL/water-temperature");

var discharge = ee.ImageCollection("projects/sat-io/open-datasets/DYNQUAL/discharge"),
    fc = ee.ImageCollection("projects/sat-io/open-datasets/DYNQUAL/fecal-coliform");
    var joinFilter = ee.Filter.equals({
  leftField: 'system:time_start',
  rightField: 'system:time_start'
});

// Define the join type
var joinType = 'inner';

// Join the image collections based on system:time_start
var joinedCollection = ee.Join.inner().apply({
  primary: fc,
  secondary: discharge,
  condition: joinFilter
});

print('Joined Collection:', joinedCollection);

var multibandCollection = joinedCollection.map(function(image) {
  var fc_band = ee.Image(image.get('primary'));
  var discharge_band = ee.Image(image.get('secondary'));

  // Merge the bands from both collections
  var multibandImage = fc_band.select('b1').rename('fc').addBands(discharge_band.select('b1').rename('discharge'));

  return multibandImage;
});
print(multibandCollection)
var conditional = function(image){
  var fc_masked = image.select('fc').mask(image.select('discharge').gt(10))
  return fc_masked
}

var fc_constrained = ee.ImageCollection(multibandCollection).map(conditional)

var popcount_intervals =
'<RasterSymbolizer>' +
' <ColorMap type="intervals" extended="false" >' +
    '<ColorMapEntry color="#4E99BB" quantity="0" label="No Data"/>' +
    '<ColorMapEntry color="#97BB5F" quantity="10" label="Population Count (Estimate)"/>' +
    '<ColorMapEntry color="#DBA03A" quantity="100" label="Population Count (Estimate)"/>' +
    '<ColorMapEntry color="#E1622D" quantity="1000" label="Population Count (Estimate)"/>' +
    '<ColorMapEntry color="#B51F1D" quantity="10000" label="Population Count (Estimate)"/>' +
    '<ColorMapEntry color="#531412" quantity="100000" label="Population Count (Estimate)"/>' +

  '</ColorMap>' +
'</RasterSymbolizer>';

// Define a dictionary which will be used to make legend and visualize image on map
//4E99BB,97BB5F,DBA03A,E1622D,B51F1D,531412
var dict = {
  "names": [
    "<10",
    "10-100",
    "100-1000",
    "1000-10000",
    "10000-100000",
    ">100000",
  ],
  "colors": [
    "#4E99BB",
    "#97BB5F",
    "#DBA03A",
    "#E1622D",
    "#B51F1D",
    "#531412",
  ]};
  
  // Create a panel to hold the legend widget
var legend = ui.Panel({
  style: {
    position: 'bottom-left',
    padding: '8px 15px'
  }
});

// Function to generate the legend
function addCategoricalLegend(panel, dict, title) {
  
  // Create and add the legend title.
  var legendTitle = ui.Label({
    value: title,
    style: {
      fontWeight: 'bold',
      fontSize: '18px',
      margin: '0 0 4px 0',
      padding: '0'
    }
  });
  panel.add(legendTitle);
  
  var loading = ui.Label('Loading legend...', {margin: '2px 0 4px 0'});
  panel.add(loading);
  
  // Creates and styles 1 row of the legend.
  var makeRow = function(color, name) {
    // Create the label that is actually the colored box.
    var colorBox = ui.Label({
      style: {
        backgroundColor: color,
        // Use padding to give the box height and width.
        padding: '8px',
        margin: '0 0 4px 0'
      }
    });
  
    // Create the label filled with the description text.
    var description = ui.Label({
      value: name,
      style: {margin: '0 0 4px 6px'}
    });
  
    return ui.Panel({
      widgets: [colorBox, description],
      layout: ui.Panel.Layout.Flow('horizontal')
    });
  };
  
  // Get the list of palette colors and class names from the image.
  var palette = dict['colors'];
  var names = dict['names'];
  loading.style().set('shown', false);
  
  for (var i = 0; i < names.length; i++) {
    panel.add(makeRow(palette[i], names[i]));
  }
  
  Map.add(panel);
}

addCategoricalLegend(legend, dict, 'FC conc. in CFU/100ml');
var snazzy = require("users/aazuspan/snazzy:styles");
snazzy.addStyle("https://snazzymaps.com/style/132/light-gray", "Grayscale");

Map.addLayer(fc_constrained.sort('system:time_start').first().sldStyle(popcount_intervals), {}, 'FC 1980-01-01');
Map.addLayer(fc_constrained.sort('system:time_start',false).first().sldStyle(popcount_intervals), {}, 'FC 2019-12-31');

 

Code link Sample Code:  https://code.earthengine.google.com/?scriptPath=users/sat-io/awesome-gee-catalog-examples:hydrology/DYNQUAL-EXAMPLE

License

Creative Commons Attribution 4.0 International Public License

Created by: Jones, ER, Bierkens, MFP, Wanders, N., Sutanudjaja, EH, van Beek, LPH, and van Vliet, MTH

Curated in GEE by: Samapriya Roy

Keywords: water quality, discharge, water temperature, total dissolved solids, TDS, salinity, biological oxygen demand, BOD, fecal coliform, FC

Guess you like

Origin blog.csdn.net/qq_31988139/article/details/132514486