{"id":1581,"date":"2026-10-27T07:29:45","date_gmt":"2026-10-27T07:29:45","guid":{"rendered":"https:\/\/helpwithmygisassignment.com\/blog\/?p=1581"},"modified":"2026-10-27T07:29:45","modified_gmt":"2026-10-27T07:29:45","slug":"google-earth-engine-drought-monitoring","status":"publish","type":"post","link":"https:\/\/helpwithmygisassignment.com\/blog\/google-earth-engine-drought-monitoring\/","title":{"rendered":"Automating Drought Monitoring with NDVI, NDWI, and NDDI Time Series in GEE"},"content":{"rendered":"<p><span style=\"font-family: inherit; font-size: 42px; font-style: inherit;\">Automating Drought Monitoring with NDVI, NDWI, and NDDI Time Series in GEE<\/span><\/p>\n<div>\n<div>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_89 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/google-earth-engine-drought-monitoring\/#Introduction\" >Introduction<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/google-earth-engine-drought-monitoring\/#1_Understand_NDVI_NDWI_and_NDDI_terminology\" >1. Understand NDVI, NDWI, and NDDI terminology<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/google-earth-engine-drought-monitoring\/#2_Select_the_satellite_dataset_and_study_area\" >2. Select the satellite dataset and study area<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/google-earth-engine-drought-monitoring\/#3_Set_up_Google_Earth_Engine\" >3. Set up Google Earth Engine<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/google-earth-engine-drought-monitoring\/#4_Complete_GEE_script_Calculate_NDVI_NDWI_and_NDDI\" >4. Complete GEE script: Calculate NDVI, NDWI, and NDDI<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/google-earth-engine-drought-monitoring\/#Important_implementation_notes\" >Important implementation notes<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/google-earth-engine-drought-monitoring\/#5_Generate_and_interpret_seasonal_anomaly_charts\" >5. Generate and interpret seasonal anomaly charts<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/google-earth-engine-drought-monitoring\/#6_Build_a_drought-stress_map_and_export_the_results\" >6. Build a drought-stress map and export the results<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/google-earth-engine-drought-monitoring\/#Export_the_raster\" >Export the raster<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/google-earth-engine-drought-monitoring\/#7_Validate_the_results_before_drawing_conclusions\" >7. Validate the results before drawing conclusions<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/google-earth-engine-drought-monitoring\/#Image_placeholder\" >Image placeholder<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/google-earth-engine-drought-monitoring\/#SEO_best_practices_and_internal_linking\" >SEO best practices and internal linking<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/google-earth-engine-drought-monitoring\/#Conclusion\" >Conclusion<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"Introduction\"><\/span>Introduction<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Agricultural drought can develop gradually as rainfall decreases, soil moisture declines, and vegetation becomes stressed. Identifying these changes early helps environmental scientists, agricultural planners, and water-resource managers evaluate potential impacts across large regions.<\/p>\n<p>Satellite remote sensing provides a repeatable way to monitor vegetation conditions without relying exclusively on field observations. Google Earth Engine (GEE) makes this process scalable by combining historical satellite imagery, cloud-based processing, temporal analysis, visualization, and raster exports in one platform.<\/p>\n<p>Three useful spectral indicators are the Normalized Difference Vegetation Index (NDVI), the Normalized Difference Water Index (NDWI), and the Normalized Difference Drought Index (NDDI).<\/p>\n<p>NDVI measures vegetation greenness. NDWI, when calculated from near-infrared and shortwave-infrared reflectance, provides information about vegetation moisture. NDDI combines NDVI and this moisture index into a relative indicator of potential drought stress.<\/p>\n<p>These indices provide complementary information, but they are not interchangeable. NDVI and NDWI describe different spectral characteristics, while NDDI combines their signals. None independently confirms that drought is occurring; harvesting, seasonal growth, land-cover change, and other environmental conditions can produce similar patterns.<\/p>\n<p>This tutorial develops a practical <strong>Google Earth Engine drought monitoring NDVI NDWI time series<\/strong> workflow using MODIS surface reflectance. The complete script calculates all three indices, compares observations against historical seasonal conditions, generates anomaly charts, creates an exploratory drought-stress classification, and exports a multi-band GeoTIFF.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"1_Understand_NDVI_NDWI_and_NDDI_terminology\"><\/span>1. Understand NDVI, NDWI, and NDDI terminology<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Before writing the script, distinguish the three indices and the two common meanings of NDWI.<\/p>\n<table>\n<tbody>\n<tr>\n<th>Index<\/th>\n<th>Formula<\/th>\n<th>Primary interpretation<\/th>\n<\/tr>\n<tr>\n<td>NDVI<\/td>\n<td>((NIR-Red)\/(NIR+Red))<\/td>\n<td>Vegetation greenness and vigor<\/td>\n<\/tr>\n<tr>\n<td>Gao NDWI, often called NDMI<\/td>\n<td>((NIR-SWIR)\/(NIR+SWIR))<\/td>\n<td>Vegetation moisture response<\/td>\n<\/tr>\n<tr>\n<td>McFeeters NDWI<\/td>\n<td>((Green-NIR)\/(Green+NIR))<\/td>\n<td>Open-water detection<\/td>\n<\/tr>\n<tr>\n<td>NDDI<\/td>\n<td>((NDVI-NDWI)\/(NDVI+NDWI))<\/td>\n<td>Combined drought-stress indicator<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The distinction between the two NDWI formulations is essential. Gao&#8217;s vegetation moisture index uses near-infrared and shortwave-infrared reflectance, whereas McFeeters&#8217; NDWI uses green and near-infrared reflectance to help identify open water. The USGS has documented the inconsistent terminology surrounding near-infrared\u2013shortwave-infrared vegetation moisture indices. See the <a href=\"https:\/\/www.usgs.gov\/publications\/terminology-spectral-vegetation-index-nir-swirnir-swir\" target=\"_blank\" rel=\"noopener\">USGS terminology review<\/a>.<\/p>\n<p>For this tutorial, <strong>NDDI is calculated using NDVI and Gao&#8217;s NDWI formulation<\/strong>:<\/p>\n<p>[<br \/>\nNDDI=\\frac{NDVI-NDWI_{\\text{Gao}}}{NDVI+NDWI_{\\text{Gao}}}<br \/>\n]<\/p>\n<p>Higher NDDI values can indicate drier vegetation conditions under suitable conditions, but interpretation depends on the index formulation, vegetation type, and local calibration. The denominator must also be sufficiently different from zero to prevent unstable calculations.<\/p>\n<p>The article therefore calculates the following outputs:<\/p>\n<ul>\n<li><strong>NDVI:<\/strong> indicates vegetation greenness.<\/li>\n<li><strong>NDWI-Gao (NDMI):<\/strong> indicates vegetation moisture response.<\/li>\n<li><strong>NDWI-McFeeters:<\/strong> provides an additional open-water indicator.<\/li>\n<li><strong>NDDI:<\/strong> combines NDVI and the Gao moisture index into a drought-screening indicator.<\/li>\n<\/ul>\n<p>This approach supports a more complete drought-monitoring workflow than calculating NDVI and NDWI without combining them.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"2_Select_the_satellite_dataset_and_study_area\"><\/span>2. Select the satellite dataset and study area<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>The workflow uses <code>MODIS\/061\/MOD09A1<\/code>, the Terra MODIS Surface Reflectance 8-Day Global 500 m product. It provides atmospherically corrected surface reflectance composites at a nominal spatial resolution of 500 metres and has a long historical record suitable for regional monitoring.<\/p>\n<p>The <a href=\"https:\/\/developers.google.com\/earth-engine\/datasets\/catalog\/MODIS_061_MOD09A1\" target=\"_blank\" rel=\"noopener\">Google Earth Engine Data Catalog<\/a> documents the available bands and their scale factors.<\/p>\n<table>\n<tbody>\n<tr>\n<th>MODIS band<\/th>\n<th>Spectral region<\/th>\n<th>Application<\/th>\n<\/tr>\n<tr>\n<td><code>sur_refl_b01<\/code><\/td>\n<td>Red<\/td>\n<td>NDVI<\/td>\n<\/tr>\n<tr>\n<td><code>sur_refl_b02<\/code><\/td>\n<td>Near-infrared<\/td>\n<td>NDVI and NDWI-Gao<\/td>\n<\/tr>\n<tr>\n<td><code>sur_refl_b04<\/code><\/td>\n<td>Green<\/td>\n<td>NDWI-McFeeters<\/td>\n<\/tr>\n<tr>\n<td><code>sur_refl_b06<\/code><\/td>\n<td>Shortwave infrared 1<\/td>\n<td>NDWI-Gao<\/td>\n<\/tr>\n<tr>\n<td><code>StateQA<\/code><\/td>\n<td>Quality flags<\/td>\n<td>Cloud and observation screening<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The reflectance bands use a scale factor of 0.0001. The ratio indices are theoretically independent of a common multiplicative scale factor, but applying the documented scaling makes the reflectance values easier to interpret and use in additional calculations.<\/p>\n<p>MODIS is appropriate for regional drought surveillance because of its frequent observations and extensive archive. Its 500-metre pixels, however, may combine cropland, soil, settlements, and other land-cover types. Sentinel-2 or Landsat may be more suitable where agricultural fields are small or detailed field-level analysis is required.<\/p>\n<p>For a study area, use an agricultural-zone boundary, county polygon, watershed, or collection of farm districts. The example script uses a rectangle over central Kenya. Replace it with your own study geometry before using the outputs for scientific interpretation.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"3_Set_up_Google_Earth_Engine\"><\/span>3. Set up Google Earth Engine<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-1683\" src=\"https:\/\/helpwithmygisassignment.com\/blog\/wp-content\/uploads\/2026\/10\/Gemini_Generated_Image_rgoojlrgoojlrgoo-1024x559.jpg\" alt=\"Google Earth Engine code editor drought monitoring script\" width=\"1024\" height=\"559\" srcset=\"https:\/\/helpwithmygisassignment.com\/blog\/wp-content\/uploads\/2026\/10\/Gemini_Generated_Image_rgoojlrgoojlrgoo-1024x559.jpg 1024w, https:\/\/helpwithmygisassignment.com\/blog\/wp-content\/uploads\/2026\/10\/Gemini_Generated_Image_rgoojlrgoojlrgoo-300x164.jpg 300w, https:\/\/helpwithmygisassignment.com\/blog\/wp-content\/uploads\/2026\/10\/Gemini_Generated_Image_rgoojlrgoojlrgoo-768x419.jpg 768w, https:\/\/helpwithmygisassignment.com\/blog\/wp-content\/uploads\/2026\/10\/Gemini_Generated_Image_rgoojlrgoojlrgoo.jpg 1408w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>Open the <a href=\"https:\/\/code.earthengine.google.com\/\" target=\"_blank\" rel=\"noopener\">Google Earth Engine Code Editor<\/a> and create a new JavaScript script.<\/p>\n<p>The example uses a historical baseline from 2001 through 2020 and a monitoring period ending in 2025. The selected target season is January\u2013March 2025.<\/p>\n<p>These dates are illustrative. Change them to match your analysis period, and use a baseline that covers the required observations. To distinguish drought anomalies from normal seasonal variation, compare the target season against the same calendar season in the historical baseline.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"4_Complete_GEE_script_Calculate_NDVI_NDWI_and_NDDI\"><\/span>4. Complete GEE script: Calculate NDVI, NDWI, and NDDI<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>The following script calculates all three primary indices and the additional open-water index. It also generates monthly anomalies, standardized anomaly layers, seasonal results, a drought-stress screening map, and a GeoTIFF export.<\/p>\n<pre><code>\/\/ ============================================================\r\n\/\/ AUTOMATED DROUGHT MONITORING WITH NDVI, NDWI AND NDDI\r\n\/\/ Dataset: MODIS\/061\/MOD09A1\r\n\/\/ Platform: Google Earth Engine JavaScript Code Editor\r\n\/\/ ============================================================\r\n\r\n\/\/ 1. CONFIGURATION\r\n\/\/ Replace with your own agricultural study boundary.\r\nvar region = ee.Geometry.Rectangle([\r\n  36.2, -1.8, 37.4, -0.3\r\n]);\r\n\r\nvar START_YEAR = 2001;\r\nvar END_YEAR = 2025;\r\n\r\nvar BASELINE_START = 2001;\r\nvar BASELINE_END = 2020;\r\n\r\nvar ANALYSIS_YEAR = 2025;\r\n\r\n\/\/ End month is exclusive: 1 to 4 means January-March.\r\nvar SEASON_START_MONTH = 1;\r\nvar SEASON_END_MONTH_EXCLUSIVE = 4;\r\n\r\nvar SCALE = 500;\r\n\r\n\/\/ 2. LOAD MODIS SURFACE REFLECTANCE\r\nvar raw = ee.ImageCollection('MODIS\/061\/MOD09A1')\r\n  .filterBounds(region)\r\n  .filterDate(\r\n    ee.Date.fromYMD(START_YEAR, 1, 1),\r\n    ee.Date.fromYMD(END_YEAR + 1, 1, 1)\r\n  );\r\n\r\n\/\/ 3. QUALITY SCREENING AND SPECTRAL INDICES\r\nfunction addIndices(image) {\r\n  var qa = image.select('StateQA');\r\n\r\n  \/\/ StateQA screening:\r\n  \/\/ Bits 0-1: cloud state\r\n  \/\/ Bit 2: cloud shadow\r\n  \/\/ Bits 6-7: aerosol quantity\r\n  \/\/ Bits 8-9: cirrus\r\n  \/\/ Bit 10: internal cloud flag\r\n  \/\/ Bit 12: snow\r\n  \/\/ Bit 13: adjacent-to-cloud flag\r\n  var clear = qa.bitwiseAnd(3).eq(0)\r\n    .and(qa.rightShift(2).bitwiseAnd(1).eq(0))\r\n    .and(qa.rightShift(6).bitwiseAnd(3).lt(3))\r\n    .and(qa.rightShift(8).bitwiseAnd(3).eq(0))\r\n    .and(qa.rightShift(10).bitwiseAnd(1).eq(0))\r\n    .and(qa.rightShift(12).bitwiseAnd(1).eq(0))\r\n    .and(qa.rightShift(13).bitwiseAnd(1).eq(0));\r\n\r\n  var reflectance = image.select([\r\n    'sur_refl_b01',\r\n    'sur_refl_b02',\r\n    'sur_refl_b04',\r\n    'sur_refl_b06'\r\n  ]).multiply(0.0001).updateMask(clear);\r\n\r\n  var red = reflectance.select('sur_refl_b01');\r\n  var nir = reflectance.select('sur_refl_b02');\r\n  var green = reflectance.select('sur_refl_b04');\r\n  var swir = reflectance.select('sur_refl_b06');\r\n\r\n  \/\/ NDVI = (NIR - RED) \/ (NIR + RED)\r\n  var ndviDenom = nir.add(red);\r\n\r\n  var ndvi = nir.subtract(red)\r\n    .divide(ndviDenom)\r\n    .updateMask(ndviDenom.abs().gt(0.001))\r\n    .rename('NDVI');\r\n\r\n  \/\/ Gao NDWI \/ NDMI:\r\n  \/\/ (NIR - SWIR1) \/ (NIR + SWIR1)\r\n  var moistureDenom = nir.add(swir);\r\n\r\n  var ndwiGao = nir.subtract(swir)\r\n    .divide(moistureDenom)\r\n    .updateMask(moistureDenom.abs().gt(0.001))\r\n    .rename('NDWI_GAO');\r\n\r\n  \/\/ McFeeters NDWI for open-water applications:\r\n  \/\/ (GREEN - NIR) \/ (GREEN + NIR)\r\n  var waterDenom = green.add(nir);\r\n\r\n  var ndwiMcF = green.subtract(nir)\r\n    .divide(waterDenom)\r\n    .updateMask(waterDenom.abs().gt(0.001))\r\n    .rename('NDWI_MCF');\r\n\r\n  \/\/ NDDI combines NDVI with the Gao vegetation moisture index.\r\n  var nddiDenom = ndvi.add(ndwiGao);\r\n\r\n  var nddi = ndvi.subtract(ndwiGao)\r\n    .divide(nddiDenom)\r\n    .updateMask(nddiDenom.abs().gt(0.05))\r\n    .rename('NDDI');\r\n\r\n  return ee.Image.cat([\r\n    ndvi, ndwiGao, ndwiMcF, nddi\r\n  ]).copyProperties(image, ['system:time_start']);\r\n}\r\n\r\nvar indices = raw.map(addIndices);\r\n\r\nprint('Input image count:', raw.size());\r\nprint('Index collection:', indices.limit(3));\r\n\r\n\/\/ 4. CREATE MONTHLY INDEX COMPOSITES\r\nvar monthly = ee.ImageCollection.fromImages(\r\n  ee.List.sequence(START_YEAR, END_YEAR).map(function(y) {\r\n    y = ee.Number(y);\r\n\r\n    return ee.List.sequence(1, 12).map(function(m) {\r\n      m = ee.Number(m);\r\n\r\n      var start = ee.Date.fromYMD(y, m, 1);\r\n      var end = start.advance(1, 'month');\r\n\r\n      return indices.filterDate(start, end)\r\n        .mean()\r\n        .set({\r\n          year: y,\r\n          month: m,\r\n          'system:time_start': start.millis()\r\n        });\r\n    });\r\n  }).flatten()\r\n);\r\n\r\n\/\/ 5. CALCULATE MONTH-SPECIFIC HISTORICAL ANOMALIES\r\nfunction addMonthlyAnomalies(image) {\r\n  var month = ee.Number(image.get('month'));\r\n\r\n  var baseline = monthly\r\n    .filter(ee.Filter.gte('year', BASELINE_START))\r\n    .filter(ee.Filter.lte('year', BASELINE_END))\r\n    .filter(ee.Filter.eq('month', month));\r\n\r\n  var bands = ['NDVI', 'NDWI_GAO', 'NDDI'];\r\n\r\n  var baselineMean = baseline.select(bands).mean();\r\n\r\n  var baselineSd = baseline.select(bands)\r\n    .reduce(ee.Reducer.stdDev());\r\n\r\n  var ndviAnom = image.select('NDVI')\r\n    .subtract(baselineMean.select('NDVI'))\r\n    .rename('NDVI_anom');\r\n\r\n  var ndwiAnom = image.select('NDWI_GAO')\r\n    .subtract(baselineMean.select('NDWI_GAO'))\r\n    .rename('NDWI_anom');\r\n\r\n  var nddiAnom = image.select('NDDI')\r\n    .subtract(baselineMean.select('NDDI'))\r\n    .rename('NDDI_anom');\r\n\r\n  \/\/ Standardized anomalies relative to historical variability.\r\n  var ndviZ = ndviAnom\r\n    .divide(baselineSd.select('NDVI').max(0.02))\r\n    .rename('NDVI_z');\r\n\r\n  var ndwiZ = ndwiAnom\r\n    .divide(baselineSd.select('NDWI_GAO').max(0.02))\r\n    .rename('NDWI_z');\r\n\r\n  var nddiZ = nddiAnom\r\n    .divide(baselineSd.select('NDDI').max(0.02))\r\n    .rename('NDDI_z');\r\n\r\n  return image.addBands([\r\n    ndviAnom, ndwiAnom, nddiAnom,\r\n    ndviZ, ndwiZ, nddiZ\r\n  ]).copyProperties(image, [\r\n    'system:time_start', 'year', 'month'\r\n  ]);\r\n}\r\n\r\nvar monthlyAnomalies = monthly.map(addMonthlyAnomalies);\r\n\r\n\/\/ 6. CHART MONTHLY NDVI AND VEGETATION MOISTURE ANOMALIES\r\nvar monitoringSeries = monthlyAnomalies\r\n  .filter(ee.Filter.gt('year', BASELINE_END));\r\n\r\nvar vegetationChart = ui.Chart.image.series({\r\n  imageCollection: monitoringSeries.select([\r\n    'NDVI_anom', 'NDWI_anom'\r\n  ]),\r\n  region: region,\r\n  reducer: ee.Reducer.mean(),\r\n  scale: SCALE,\r\n  xProperty: 'system:time_start'\r\n}).setOptions({\r\n  title: 'Monthly NDVI and vegetation moisture anomalies',\r\n  hAxis: {title: 'Date', format: 'yyyy-MM'},\r\n  vAxis: {title: 'Index anomaly'},\r\n  lineWidth: 2,\r\n  pointSize: 2\r\n});\r\n\r\nprint(vegetationChart);\r\n\r\n\/\/ NDDI has a different numerical behavior, so chart it separately.\r\nvar nddiChart = ui.Chart.image.series({\r\n  imageCollection: monitoringSeries.select(['NDDI_z']),\r\n  region: region,\r\n  reducer: ee.Reducer.mean(),\r\n  scale: SCALE,\r\n  xProperty: 'system:time_start'\r\n}).setOptions({\r\n  title: 'Standardized NDDI anomaly',\r\n  hAxis: {title: 'Date', format: 'yyyy-MM'},\r\n  vAxis: {title: 'NDDI anomaly (standard deviations)'},\r\n  lineWidth: 2,\r\n  pointSize: 2\r\n});\r\n\r\nprint(nddiChart);\r\n\r\n\/\/ 7. CREATE TARGET-SEASON COMPOSITE\r\nvar seasonStart = ee.Date.fromYMD(\r\n  ANALYSIS_YEAR, SEASON_START_MONTH, 1\r\n);\r\n\r\nvar seasonEnd = ee.Date.fromYMD(\r\n  ANALYSIS_YEAR, SEASON_END_MONTH_EXCLUSIVE, 1\r\n);\r\n\r\nvar currentSeason = indices\r\n  .filterDate(seasonStart, seasonEnd)\r\n  .mean();\r\n\r\nvar seasonalBaseline = ee.ImageCollection.fromImages(\r\n  ee.List.sequence(BASELINE_START, BASELINE_END)\r\n    .map(function(y) {\r\n      y = ee.Number(y);\r\n\r\n      var start = ee.Date.fromYMD(\r\n        y, SEASON_START_MONTH, 1\r\n      );\r\n\r\n      var end = ee.Date.fromYMD(\r\n        y, SEASON_END_MONTH_EXCLUSIVE, 1\r\n      );\r\n\r\n      return indices.filterDate(start, end)\r\n        .mean()\r\n        .set('year', y);\r\n    })\r\n);\r\n\r\nvar bands = ['NDVI', 'NDWI_GAO', 'NDDI'];\r\n\r\nvar seasonalMean = seasonalBaseline.select(bands).mean();\r\n\r\nvar seasonalSd = seasonalBaseline.select(bands)\r\n  .reduce(ee.Reducer.stdDev());\r\n\r\n\/\/ Seasonal absolute anomalies.\r\nvar ndviAnomaly = currentSeason.select('NDVI')\r\n  .subtract(seasonalMean.select('NDVI'))\r\n  .rename('NDVI_anomaly');\r\n\r\nvar ndwiAnomaly = currentSeason.select('NDWI_GAO')\r\n  .subtract(seasonalMean.select('NDWI_GAO'))\r\n  .rename('NDWI_anomaly');\r\n\r\nvar nddiAnomaly = currentSeason.select('NDDI')\r\n  .subtract(seasonalMean.select('NDDI'))\r\n  .rename('NDDI_anomaly');\r\n\r\n\/\/ Seasonal standardized anomalies.\r\nvar ndviZ = ndviAnomaly\r\n  .divide(seasonalSd.select('NDVI').max(0.02))\r\n  .rename('NDVI_z');\r\n\r\nvar ndwiZ = ndwiAnomaly\r\n  .divide(seasonalSd.select('NDWI_GAO').max(0.02))\r\n  .rename('NDWI_z');\r\n\r\nvar nddiZ = nddiAnomaly\r\n  .divide(seasonalSd.select('NDDI').max(0.02))\r\n  .rename('NDDI_z');\r\n\r\n\/\/ 8. CREATE AN EXPLORATORY STRESS CLASSIFICATION\r\n\/\/ 0 = no threshold crossed\r\n\/\/ 1 = one vegetation index is &lt;= -1 standard deviation\r\n\/\/ 2 = NDVI and NDWI-Gao are both &lt;= -1 standard deviation\r\n\/\/ 3 = strong positive NDDI anomaly plus negative vegetation\r\n\/\/     and moisture anomalies.\r\n\/\/\r\n\/\/ These are screening classes, not an official drought scale.\r\n\r\nvar valid = currentSeason.select('NDVI').mask()\r\n  .and(currentSeason.select('NDWI_GAO').mask())\r\n  .and(currentSeason.select('NDDI').mask());\r\n\r\nvar droughtClass = ee.Image.constant(0)\r\n  .updateMask(valid)\r\n  .where(ndviZ.lte(-1).or(ndwiZ.lte(-1)), 1)\r\n  .where(ndviZ.lte(-1).and(ndwiZ.lte(-1)), 2)\r\n  .where(\r\n    nddiZ.gte(1.5)\r\n      .and(ndviZ.lt(0))\r\n      .and(ndwiZ.lt(0)),\r\n    3\r\n  )\r\n  .rename('drought_class')\r\n  .toByte();\r\n\r\n\/\/ 9. VISUALIZE THE RESULTS\r\nMap.centerObject(region, 8);\r\n\r\nMap.addLayer(\r\n  currentSeason.select('NDVI'),\r\n  {\r\n    min: 0,\r\n    max: 0.8,\r\n    palette: [\r\n      '#8c510a', '#d8b365',\r\n      '#a6d96a', '#1a9850'\r\n    ]\r\n  },\r\n  'Seasonal NDVI'\r\n);\r\n\r\nMap.addLayer(\r\n  ndwiAnomaly,\r\n  {\r\n    min: -0.2,\r\n    max: 0.2,\r\n    palette: ['#b2182b', '#f7f7f7', '#2166ac']\r\n  },\r\n  'Vegetation moisture anomaly'\r\n);\r\n\r\nMap.addLayer(\r\n  nddiAnomaly,\r\n  {\r\n    min: -0.3,\r\n    max: 0.3,\r\n    palette: ['#2166ac', '#f7f7f7', '#b2182b']\r\n  },\r\n  'NDDI anomaly'\r\n);\r\n\r\nMap.addLayer(\r\n  droughtClass,\r\n  {\r\n    min: 0,\r\n    max: 3,\r\n    palette: [\r\n      '#d9e2ec', '#fdae61',\r\n      '#f46d43', '#a50026'\r\n    ]\r\n  },\r\n  'Exploratory drought-stress classes'\r\n);\r\n\r\n\/\/ 10. EXPORT MULTI-BAND GEOTIFF\r\nvar exportImage = ee.Image.cat([\r\n  ndviAnomaly,\r\n  ndwiAnomaly,\r\n  nddiAnomaly,\r\n  ndviZ,\r\n  ndwiZ,\r\n  nddiZ,\r\n  droughtClass\r\n]).clip(region);\r\n\r\nExport.image.toDrive({\r\n  image: exportImage,\r\n  description: 'Drought_Indices_' + ANALYSIS_YEAR,\r\n  folder: 'GEE_Drought',\r\n  fileNamePrefix: 'drought_indices_' + ANALYSIS_YEAR,\r\n  region: region,\r\n  scale: SCALE,\r\n  maxPixels: 1e13,\r\n  fileFormat: 'GeoTIFF'\r\n});\r\n\r\nprint('Monitoring year:', ANALYSIS_YEAR);\r\nprint('Historical baseline:', BASELINE_START, BASELINE_END);\r\nprint('Target season starts:', seasonStart);\r\nprint('Target season ends:', seasonEnd);<\/code><\/pre>\n<h3><span class=\"ez-toc-section\" id=\"Important_implementation_notes\"><\/span>Important implementation notes<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>This script is an end-to-end starting point, but the results still require validation.<\/p>\n<p>The quality-screening function uses MODIS <code>StateQA<\/code> flags to remove several types of contaminated observations. Before operational use, confirm the bit definitions against the <a href=\"https:\/\/developers.google.com\/earth-engine\/datasets\/catalog\/MODIS_061_MOD09A1\" target=\"_blank\" rel=\"noopener\">MOD09A1 product documentation<\/a> and assess whether the selected screening criteria are appropriate for your study area.<\/p>\n<p>The NDDI calculation masks pixels where the denominator is close to zero. This avoids extreme values created by unstable division, especially where vegetation is sparse or the index components have opposing values.<\/p>\n<p>For each monthly composite, the script averages the available 8-day index observations. The seasonal baseline is constructed with the same seasonal window for every baseline year, ensuring that the target is compared with a consistent time period.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"5_Generate_and_interpret_seasonal_anomaly_charts\"><\/span>5. Generate and interpret seasonal anomaly charts<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-1684\" src=\"https:\/\/helpwithmygisassignment.com\/blog\/wp-content\/uploads\/2026\/10\/Gemini_Generated_Image_3pnxdf3pnxdf3pnx-1024x559.jpg\" alt=\"Google Earth Engine vegetation health anomaly curves drought monitoring\" width=\"1024\" height=\"559\" srcset=\"https:\/\/helpwithmygisassignment.com\/blog\/wp-content\/uploads\/2026\/10\/Gemini_Generated_Image_3pnxdf3pnxdf3pnx-1024x559.jpg 1024w, https:\/\/helpwithmygisassignment.com\/blog\/wp-content\/uploads\/2026\/10\/Gemini_Generated_Image_3pnxdf3pnxdf3pnx-300x164.jpg 300w, https:\/\/helpwithmygisassignment.com\/blog\/wp-content\/uploads\/2026\/10\/Gemini_Generated_Image_3pnxdf3pnxdf3pnx-768x419.jpg 768w, https:\/\/helpwithmygisassignment.com\/blog\/wp-content\/uploads\/2026\/10\/Gemini_Generated_Image_3pnxdf3pnxdf3pnx.jpg 1408w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>Raw index values naturally vary throughout the year. A healthy crop may have high NDVI during peak growth and lower NDVI after harvesting. An anomaly analysis helps separate these expected seasonal changes from unusual conditions.<\/p>\n<p>For each month, calculate the historical mean:<\/p>\n<p>[<br \/>\n\\mu_m=\\frac{1}{N}\\sum_{y=1}^{N}I_{y,m}<br \/>\n]<\/p>\n<p>where (I_{y,m}) is the index for month (m) in historical year (y).<\/p>\n<p>The absolute anomaly is:<\/p>\n<p>[<br \/>\nA_{y,m}=I_{y,m}-\\mu_m<br \/>\n]<\/p>\n<p>A negative NDVI anomaly indicates below-average vegetation greenness for that calendar month. A negative Gao NDWI anomaly suggests lower moisture-index values. A positive NDDI anomaly may indicate a shift toward drier vegetation conditions.<\/p>\n<p>The workflow also calculates standardized anomalies:<\/p>\n<p>[<br \/>\nZ_{y,m}=\\frac{I_{y,m}-\\mu_m}{\\sigma_m}<br \/>\n]<\/p>\n<p>Here, (\\sigma_m) is the standard deviation for the matching calendar month in the baseline period.<\/p>\n<p>A standardized anomaly of (-1) means the observation is one historical standard deviation below its baseline mean. A positive NDDI standardized anomaly means NDDI is above its historical average, which can support drought screening when accompanied by negative vegetation and moisture anomalies.<\/p>\n<p>The script generates two charts: one for NDVI and vegetation moisture anomalies, and another for standardized NDDI anomalies. Separating the charts avoids assuming the indices have identical numerical behavior.<\/p>\n<p>Look for sustained anomalies rather than relying on a single observation. Several months of below-average NDVI, declining moisture-index values, and elevated NDDI provide stronger evidence of possible drought stress than an isolated fluctuation. Compare these results with local crop calendars, rainfall deficits, and other independent indicators.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"6_Build_a_drought-stress_map_and_export_the_results\"><\/span>6. Build a drought-stress map and export the results<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-1685\" src=\"https:\/\/helpwithmygisassignment.com\/blog\/wp-content\/uploads\/2026\/10\/Gemini_Generated_Image_u4j17vu4j17vu4j1-1024x559.jpg\" alt=\"Google Earth Engine exploratory drought stress classification map\" width=\"1024\" height=\"559\" srcset=\"https:\/\/helpwithmygisassignment.com\/blog\/wp-content\/uploads\/2026\/10\/Gemini_Generated_Image_u4j17vu4j17vu4j1-1024x559.jpg 1024w, https:\/\/helpwithmygisassignment.com\/blog\/wp-content\/uploads\/2026\/10\/Gemini_Generated_Image_u4j17vu4j17vu4j1-300x164.jpg 300w, https:\/\/helpwithmygisassignment.com\/blog\/wp-content\/uploads\/2026\/10\/Gemini_Generated_Image_u4j17vu4j17vu4j1-768x419.jpg 768w, https:\/\/helpwithmygisassignment.com\/blog\/wp-content\/uploads\/2026\/10\/Gemini_Generated_Image_u4j17vu4j17vu4j1.jpg 1408w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>The script produces a screening classification from three sources of evidence: standardized NDVI anomalies, standardized vegetation moisture anomalies, and standardized NDDI anomalies.<\/p>\n<table>\n<tbody>\n<tr>\n<th>Class<\/th>\n<th>Interpretation<\/th>\n<\/tr>\n<tr>\n<td>0<\/td>\n<td>No selected threshold crossed<\/td>\n<\/tr>\n<tr>\n<td>1<\/td>\n<td>At least one vegetation or moisture indicator is at or below \u22121 standard deviation<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>Both NDVI and vegetation moisture anomalies are at or below \u22121 standard deviation<\/td>\n<\/tr>\n<tr>\n<td>3<\/td>\n<td>Strong positive NDDI anomaly combined with negative NDVI and moisture anomalies<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>These categories are configurable analytical flags, not universal drought-severity levels. The threshold values should be adjusted and validated for the crops, climate, and historical variability of the region.<\/p>\n<p>The class 3 condition is designed to identify a stronger combined signal. Because it uses standardized anomalies, it emphasizes deviation from local historical conditions rather than assuming a single absolute NDDI threshold is valid everywhere.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Export_the_raster\"><\/span>Export the raster<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>After the script runs, open the <strong>Tasks<\/strong> tab and start the <code>Drought_Indices_2025<\/code> export. The resulting GeoTIFF includes:<\/p>\n<ul>\n<li><code>NDVI_anomaly<\/code><\/li>\n<li><code>NDWI_anomaly<\/code><\/li>\n<li><code>NDDI_anomaly<\/code><\/li>\n<li><code>NDVI_z<\/code><\/li>\n<li><code>NDWI_z<\/code><\/li>\n<li><code>NDDI_z<\/code><\/li>\n<li><code>drought_class<\/code><\/li>\n<\/ul>\n<p>The image export uses the nominal 500-metre resolution of MODIS. See the official <a href=\"https:\/\/developers.google.com\/earth-engine\/guides\/exporting_images\" target=\"_blank\" rel=\"noopener\">Earth Engine image export guide<\/a> for details.<\/p>\n<p>After downloading the image, open it in <a href=\"https:\/\/helpwithmygisassignment.com\/blog\/building-real-time-spatial-dashboards-in-qgis-with-geonode-and-postgis\/\">QGIS<\/a> or another GIS and verify the CRS, extent, pixel alignment, NoData regions, and class values. Use diverging color ramps for continuous anomaly layers and a discrete color table for the drought classes.<\/p>\n<p>For recurring monitoring, export one raster per month or reporting season and preserve each run&#8217;s baseline years, target dates, input dataset, and threshold configuration. This creates a reproducible archive for agricultural bulletins and regional GIS dashboards.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"7_Validate_the_results_before_drawing_conclusions\"><\/span>7. Validate the results before drawing conclusions<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Remote-sensing indices alone cannot establish that an agricultural drought is occurring. Validate the workflow with independent information wherever possible.<\/p>\n<p><strong>Observation quality:<\/strong> Inspect cloud contamination, missing pixels, and seasonal data availability. Quality screening reduces contamination but cannot eliminate every observation problem.<\/p>\n<p><strong>Seasonal comparability:<\/strong> Use the same months for the baseline and target. If the region has two growing seasons, calculate separate baselines for the relevant agricultural cycles.<\/p>\n<p><strong>Independent indicators:<\/strong> Compare the results with rainfall anomalies, soil moisture, field surveys, crop condition reports, or established drought indices.<\/p>\n<p><strong>Spatial scale:<\/strong> MODIS pixels may contain several land-cover types. Apply agricultural masks or use Sentinel-2 or Landsat imagery where finer spatial resolution is required.<\/p>\n<p><strong>Threshold calibration:<\/strong> Validate the proposed classes against documented drought events and crop impacts. Avoid presenting the example thresholds as an official or universally transferable severity standard.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Image_placeholder\"><\/span>Image placeholder<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><strong>[Image 1: Google Earth Engine time-series chart showing vegetation health anomaly curves during drought periods]<\/strong><\/p>\n<p><strong>Alt text:<\/strong> \u201cGoogle Earth Engine chart interface plotting multi-year NDVI, NDWI, and NDDI vegetation health anomaly curves highlighting regional drought stress periods.\u201d<\/p>\n<p>The illustration should display monthly vegetation and moisture anomalies alongside the NDDI anomaly curve, with sustained periods of potential drought stress clearly marked.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"SEO_best_practices_and_internal_linking\"><\/span>SEO best practices and internal linking<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Use the primary keyword naturally in the title, introduction, and one relevant heading. Supplement it with related terms such as \u201cautomated agricultural drought monitoring,\u201d \u201csatellite vegetation moisture anomalies,\u201d and \u201cmulti-year remote sensing analysis.\u201d<\/p>\n<p>Add contextual internal links to related tutorials:<\/p>\n<ul>\n<li><a href=\"https:\/\/chatgpt.com\/c\/time-series-analysis-gee-python-api\/\" target=\"_blank\" rel=\"noopener\">Time-Series Analysis Using the GEE Python API<\/a> \u2014 automate data retrieval, spatial summaries, and chart generation.<\/li>\n<li><a href=\"https:\/\/chatgpt.com\/c\/multi-temporal-remote-sensing-change-detection\/\" target=\"_blank\" rel=\"noopener\">Multi-Temporal Remote Sensing Change Detection<\/a> \u2014 extend the workflow to land-cover change and long-term environmental monitoring.<\/li>\n<\/ul>\n<p>Replace the example paths with the actual published URLs on your website.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Conclusion\"><\/span>Conclusion<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Google Earth Engine provides a scalable environment for automated drought monitoring using satellite imagery and historical time series. NDVI measures vegetation greenness, Gao&#8217;s NDWI formulation provides information about vegetation moisture, and NDDI combines the two into an additional drought-screening indicator.<\/p>\n<p>The workflow in this guide calculates these indices from MODIS surface reflectance, builds seasonal anomalies, charts historical deviations, and exports a multi-band drought-monitoring raster.<\/p>\n<p>The central analytical principle is to interpret the indices together, using consistent historical baselines and independent evidence. Correctly distinguishing the vegetation moisture formulation of NDWI from the open-water formulation\u2014and explicitly calculating NDDI\u2014makes the workflow clearer, more reproducible, and better suited to agricultural drought analysis.<\/p>\n<p><strong>Technical references:<\/strong> <a href=\"https:\/\/developers.google.com\/earth-engine\/datasets\/catalog\/MODIS_061_MOD09A1\" target=\"_blank\" rel=\"noopener\">MODIS MOD09A1 Data Catalog<\/a>, <a href=\"https:\/\/developers.google.com\/earth-engine\/guides\/charts_image_collection\" target=\"_blank\" rel=\"noopener\">Earth Engine image collection charts<\/a>, <a href=\"https:\/\/developers.google.com\/earth-engine\/guides\/exporting_images\" target=\"_blank\" rel=\"noopener\">Earth Engine image export<\/a>, <a href=\"https:\/\/www.usgs.gov\/publications\/terminology-spectral-vegetation-index-nir-swirnir-swir\" target=\"_blank\" rel=\"noopener\">USGS vegetation moisture-index terminology<\/a>, and <a href=\"https:\/\/www.mdpi.com\/2073-445x\/14\/12\/2431\" target=\"_blank\" rel=\"noopener\">NDDI application in agricultural drought monitoring<\/a>.<\/p>\n<\/div>\n<div>\n<div>\n<div>Clarify the NDDI formula terminologySeparate article guidance from tutorial content<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Automating Drought Monitoring with NDVI, NDWI, and NDDI Time Series in GEE Introduction Agricultural drought can develop gradually as rainfall decreases, soil moisture declines, and vegetation becomes stressed. Identifying these changes early helps environmental scientists, agricultural planners, and water-resource managers evaluate potential impacts across large regions. Satellite remote sensing provides a repeatable way to monitor &#8230; <a title=\"Automating Drought Monitoring with NDVI, NDWI, and NDDI Time Series in GEE\" class=\"read-more\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/google-earth-engine-drought-monitoring\/\" aria-label=\"Read more about Automating Drought Monitoring with NDVI, NDWI, and NDDI Time Series in GEE\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":1683,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,4],"tags":[],"class_list":["post-1581","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","category-gis-articles"],"_links":{"self":[{"href":"https:\/\/helpwithmygisassignment.com\/blog\/wp-json\/wp\/v2\/posts\/1581","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/helpwithmygisassignment.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/helpwithmygisassignment.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/helpwithmygisassignment.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/helpwithmygisassignment.com\/blog\/wp-json\/wp\/v2\/comments?post=1581"}],"version-history":[{"count":4,"href":"https:\/\/helpwithmygisassignment.com\/blog\/wp-json\/wp\/v2\/posts\/1581\/revisions"}],"predecessor-version":[{"id":1686,"href":"https:\/\/helpwithmygisassignment.com\/blog\/wp-json\/wp\/v2\/posts\/1581\/revisions\/1686"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/helpwithmygisassignment.com\/blog\/wp-json\/wp\/v2\/media\/1683"}],"wp:attachment":[{"href":"https:\/\/helpwithmygisassignment.com\/blog\/wp-json\/wp\/v2\/media?parent=1581"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/helpwithmygisassignment.com\/blog\/wp-json\/wp\/v2\/categories?post=1581"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/helpwithmygisassignment.com\/blog\/wp-json\/wp\/v2\/tags?post=1581"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}