In [1]:
%store -r
In In February 2019, massive forest fires erupted in several parts of Bandipur National Park, located in Chamarajanagar district of Karnataka, India..
This workflow focuses on analyzing vegetation cover changes in Chamarajanagar district between 2017 and 2021, with the aim of assessing the impact of the Bandipur forest fire.
In [38]:
# Import libraries
import json
import os
import pathlib
import shutil
from glob import glob
import earthpy.api.appeears as eaapp
import earthpy
import geopandas as gpd
import hvplot.pandas
import hvplot.xarray
import pandas as pd
import rioxarray as rxr
import xarray as xr
import holoviews as hv
In [2]:
data_dir = os.path.join(pathlib.Path.home(), 'bandipur')
# Make the data directory
os.makedirs(data_dir, exist_ok=True)
In [3]:
#To visualize the directory path
data_dir
Out[3]:
'/home/jovyan/bandipur'
In [5]:
from osmnx import features as osm # Search for locations by name
import geopandas as gpd
import hvplot.pandas
In [6]:
# Search for your site
Chamarajanagar_gdf = osm.features_from_address(
'Bandipur National park, Karnataka',
{'name':'Chamarajanagar'},
dist=1000)
Chamarajanagar_gdf
Out[6]:
geometry | name | name:kn | name:ml | name:ta | wikidata | wikipedia | type | admin_level | boundary | official_name | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|
element | id | |||||||||||
relation | 2019940 | POLYGON ((76.40394 11.70685, 76.40352 11.7072,... | Chamarajanagar | ಚಾಮರಾಜನಗರ ಜಿಲ್ಲೆ | ചാമരാജനഗർ ജില്ല | சாமராசநகர் மாவட்டம் | Q862912 | en:Chamarajanagar district | boundary | 5 | administrative | Chamarajanagar District |
In [46]:
Chamarajanagar_gdf.explore()
Out[46]:
Make this Notebook Trusted to load map: File -> Trust Notebook
In [8]:
# Plot the results with web tile images
Chamarajanagar_gdf.hvplot(geo=True,tiles='EsriImagery')
Out[8]:
In [9]:
# Initialize AppeearsDownloader for MODIS NDVI data
ndvi_downloader = eaapp.AppeearsDownloader(
download_key='Chamarajanagar-ndvi',
# ea_dir=project.project_dir,
product='MOD13Q1.061',
layer='_250m_16_days_NDVI',
start_date="06-01",
end_date="10-01",
recurring=True,
year_range=[2017,2021],
polygon=Chamarajanagar_gdf
)
# Download the prepared download -- this can take some time!
ndvi_downloader.download_files(cache=True)
**Final Configuration Loaded:** {} Found 'data_home' in environment variables. No stored credentials found for urs.earthdata.nasa.gov. Please log in.
/opt/conda/lib/python3.11/site-packages/earthpy/api/auth.py:192: UserWarning: Setting credentials not supported for 'netrc' backend. warnings.warn( /opt/conda/lib/python3.11/site-packages/earthpy/api/auth.py:196: UserWarning: Failed to store credentials with 'keyring': No recommended backend was available. Install a recommended 3rd party backend package; or, install the keyrings.alt package if you want to use the non-recommended backends. See https://pypi.org/project/keyring for details. warnings.warn(
Credentials stored using 'env' backend.
In [12]:
# Get a sorted list of NDVI tif file paths
#ndvi_paths = sorted(list(project.project_dir.rglob('ndvi-pattern')))
ndvi_paths = sorted(list(ndvi_downloader.download_dir.rglob('*NDVI*.tif')))
len(ndvi_paths)
Out[12]:
45
In [20]:
scale_factor = 10000
d_start = -25
d_end = -18
In [30]:
doy_start = -25
doy_end = -18
ndvi_Chamarajanagar = []
for ndvi_path in ndvi_paths:
# Get date from file name
print(ndvi_path)
# doy = ndvi_path[d_start:d_end]
date = pd.to_datetime(ndvi_path.name[doy_start:doy_end], format='%Y%j')
# Open dataset
da = rxr.open_rasterio(ndvi_path, mask_and_scale=True).squeeze()
# Add date dimension and clean up metadata
da = da.assign_coords({'date': date})
da = da.expand_dims({'date': 1})
da.name = 'NDVI'
# Prepare for concatenation
ndvi_Chamarajanagar.append(da)
# Open dataset
# da = rxr.open_rasterio(ndvi_path, masked=True).squeeze()
# Add date dimension and clean up metadata
# da = da.assign_coords({'date': date})
# da = da.expand_dims({'date': 1})
# da.name = 'NDVI'
# Multiple by scale factor
# da = da / scale_factor
# Prepare for concatenation
# ndvi_Chamarajanagar.append(da)
len(ndvi_Chamarajanagar)
/workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2017145000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2017161000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2017177000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2017193000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2017209000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2017225000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2017241000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2017257000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2017273000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2018145000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2018161000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2018177000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2018193000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2018209000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2018225000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2018241000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2018257000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2018273000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2019145000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2019161000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2019177000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2019193000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2019209000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2019225000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2019241000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2019257000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2019273000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2020145000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2020161000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2020177000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2020193000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2020209000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2020225000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2020241000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2020257000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2020273000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2021145000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2021161000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2021177000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2021193000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2021209000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2021225000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2021241000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2021257000000_aid0001.tif /workspaces/data/earthpy-downloads/Chamarajanagar-ndvi/MOD13Q1.061_2017137_to_2021274/MOD13Q1.061__250m_16_days_NDVI_doy2021273000000_aid0001.tif
Out[30]:
45
In [31]:
# Combine NDVI images from all dates
annual_ndvi_da = (
xr.combine_by_coords(ndvi_Chamarajanagar)
.resample(dict(date='YS')).mean())
annual_ndvi_da
Out[31]:
<xarray.Dataset> Size: 5MB Dimensions: (date: 5, y: 346, x: 662) Coordinates: band int64 8B 1 * x (x) float64 5kB 76.4 76.41 76.41 76.41 ... 77.78 77.78 77.78 * y (y) float64 3kB 12.31 12.31 12.31 12.31 ... 11.6 11.6 11.59 spatial_ref int64 8B 0 * date (date) datetime64[ns] 40B 2017-01-01 2018-01-01 ... 2021-01-01 Data variables: NDVI (date, y, x) float32 5MB 0.4124 0.4299 0.4426 ... 0.5837 0.592
In [33]:
# Combine NDVI images from all dates
da = xr.combine_by_coords(ndvi_Chamarajanagar, coords=['date'])
da
Out[33]:
<xarray.Dataset> Size: 41MB Dimensions: (date: 45, y: 346, x: 662) Coordinates: band int64 8B 1 * x (x) float64 5kB 76.4 76.41 76.41 76.41 ... 77.78 77.78 77.78 * y (y) float64 3kB 12.31 12.31 12.31 12.31 ... 11.6 11.6 11.59 spatial_ref int64 8B 0 * date (date) datetime64[ns] 360B 2017-05-25 2017-06-10 ... 2021-09-30 Data variables: NDVI (date, y, x) float32 41MB 0.6256 0.5689 0.5466 ... 0.661 0.661
In [34]:
# plot before
pre_ndvi = (
da
.sel(date=slice('2017', '2019'))
.mean(dim='date')
.NDVI
)
pre_ndvi.plot()
Out[34]:
<matplotlib.collections.QuadMesh at 0x7d1711aeee10>
In [35]:
# plot after
post_ndvi = (
da
.sel(date=slice('2020', '2021'))
.mean(dim='date')
.NDVI
)
post_ndvi.plot()
Out[35]:
<matplotlib.collections.QuadMesh at 0x7d171162efd0>
In [39]:
# Compute the difference in NDVI before and after
ndvi_diff = post_ndvi - pre_ndvi
# Plot the difference
ndvi_diff_plot = (
ndvi_diff.hvplot(x='x', y='y', cmap='PiYG', geo=True,
title='Difference in NDVI 2017-2019 vs. 2020-2021')
*
Chamarajanagar_gdf.hvplot(geo=True, fill_color=None, line_color='black')
)
hv.save(ndvi_diff_plot, 'NDVI_Difference_Chamarajanagar.html')
ndvi_diff_plot
WARNING:bokeh.core.validation.check:W-1005 (FIXED_SIZING_MODE): 'fixed' sizing mode requires width and height to be set: figure(id='p1187', ...)
Out[39]:
In [40]:
# Apply NDVI threshold
# Create a composite of NDVI values for each year
composite_da = (
annual_ndvi_da
.groupby('date.year')
.mean(dim=['date'])
)
In [43]:
# Plot difference inside and outside the boundary
annual_veg_da = (
composite_da
# Identify vegetated pixels
.where(composite_da> 0.3)
# Count pixels in each annual image
.count(dim=['x', 'y'])
)
annual_veg_da
Out[43]:
<xarray.Dataset> Size: 96B Dimensions: (year: 5) Coordinates: band int64 8B 1 spatial_ref int64 8B 0 * year (year) int64 40B 2017 2018 2019 2020 2021 Data variables: NDVI (year) int64 40B 227973 227578 227842 228252 227878
In [44]:
# Plot number of vegetated pixels over time
plot = (
annual_veg_da
.hvplot(
title=f'Vegetation over time in Chamarajanagar, Karnataka',
ylabel='Vegetated pixels',
xlabel='Year')
)
In [45]:
hv.save(plot, 'Vegetation_over_time_in_Chamarajanagar_Karnatak_India.html')
plot
Out[45]:
In [12]:
%store var1 var2
In [ ]:
%%capture
%%bash
#Coverting to HTML
jupyter nbconvert vegetation-92-download-ndvi.ipynb --to html
Finally, be sure to Restart
and Run all
to make sure your notebook
works all the way through!