Skip to content

Defani/NBRplus-Lawu-Geemap-Python

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 

Repository files navigation

Burned Area Mapping of Mount Lawu Using NBR+ and Sentinel-2

Open In Colab Open in Earth Engine GitHub

LinkedIn Medium TikTok Instagram Kaggle RPubs Behance Email

download (57)

Overview

This project maps and analyzes burned areas resulting from the Mount Lawu forest fire (August 30 – September 29, 2023) using the Normalized Burn Ratio Plus (NBR+) index applied to Sentinel-2 Surface Reflectance imagery via Google Earth Engine. The bi-temporal approach computes the difference between pre-fire and post-fire NBR+ composites (dNBR+) to classify burn severity across the affected area.

NBR+ was proposed by Alcaras et al. (2022) as an enhancement over the classical NBR. By incorporating Sentinel-2 Blue (B2) and Green (B3) bands alongside NIR (B8A) and SWIR2 (B12), NBR+ inherently suppresses false positives from water bodies and clouds without requiring external masking layers.


Study Area

Parameter Description
Location Mount Lawu, Central Java / East Java border, Indonesia
Coordinates 111°11'39" E, 7°37'37" S
Fire period August 30 – September 29, 2023
Satellite Sentinel-2A SR Harmonized
Pre-fire composite August 1–29, 2023 (median)
Post-fire composite October 1–31, 2023 (median)
Spatial resolution 20 m

Spectral Index

NBR+ (Normalized Burn Ratio Plus)

NBR+ extends the classical NBR by incorporating the Blue (B2) and Green (B3) bands of Sentinel-2 in addition to NIR (B8A) and SWIR2 (B12) (Alcaras et al., 2022):

NBR+ = (B12 - B8A - B3 - B2) / (B12 + B8A + B3 + B2)

The spectral rationale is as follows. Water bodies exhibit strong reflectance in blue-green wavelengths, so including B2 and B3 in the subtraction drives NBR+ values for water pixels toward negative. Clouds also yield strongly negative NBR+ due to their low SWIR2 (B12) reflectance relative to the other three bands. Burned areas, characterized by high SWIR reflectance and low NIR and visible reflectance, produce distinctively high positive NBR+ values. This spectral separation allows burned areas to be identified without reliance on external water or cloud masks.

Bi-temporal Delta Index (dNBR+)

The bi-temporal approach isolates fire-induced spectral change by differencing pre- and post-fire composites:

dNBR+ = NBR+_postfire - NBR+_prefire

Positive dNBR+ values indicate pixels where NBR+ decreased after the fire, consistent with vegetation loss and increased bare ground exposure.



Project Structure

NBRplus-Lawu-Geemap-Python/
├── notebook.ipynb      # Main analysis notebook (GEE + geemap + cartoee)
└── README.md

Workflow

1. Authenticate and initialize Google Earth Engine
        |
2. Define AOI — Mount Lawu polygon
        |
3. Load Sentinel-2 SR Harmonized collection
   - Cloud masking via Cloud Score+ (cs_cdf >= 0.6)
   - Filter by CLOUDY_PIXEL_PERCENTAGE < 20
        |
4. Build pre-fire and post-fire median composites
        |
5. Compute NBR+ for pre-fire and post-fire images
        |
6. Compute dNBR+ = NBR+_post - NBR+_pre
        |
7. Apply burn threshold (dNBR+ >= 0.3) to extract burned area mask
        |
8. Generate 2x3 visualization panel:
   A. Pre-fire false color composite  (B11 / B8 / B4)
   B. Post-fire false color composite (B11 / B8 / B4)
   C. Post-fire composite with burned area overlay
   D. Pre-fire NBR+ raster
   E. Post-fire NBR+ raster
   F. Burned area mask

Requirements

pip install geemap cartopy earthengine-api
Package Purpose
earthengine-api Google Earth Engine Python client
geemap EE image processing and cartoee map export
cartopy Cartographic projections and coordinate systems
matplotlib Figure layout, colorbar, and export
numpy Numerical operations

Quick Start

import ee
import geemap

ee.Authenticate()
ee.Initialize(project='your-project-id')

# Define AOI
lawu = ee.Geometry.Polygon([[
    [111.17372873826915, -7.647583870310043],
    [111.24342325731212, -7.647583870310043],
    [111.24342325731212, -7.55587155368799],
    [111.17372873826915, -7.55587155368799],
    [111.17372873826915, -7.647583870310043]
]])

# Cloud masking via Cloud Score+
def mask_s2(image):
    cs = image.select('cs_cdf')
    return image.updateMask(cs.gte(0.6))

# Load Sentinel-2 SR and build composites
s2 = (ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')
    .filterBounds(lawu)
    .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))
    .linkCollection(ee.ImageCollection('GOOGLE/CLOUD_SCORE_PLUS/V1/S2_HARMONIZED'), ['cs_cdf'])
    .map(mask_s2))

pre_fire  = s2.filterDate('2023-08-01', '2023-08-29').median().clip(lawu)
post_fire = s2.filterDate('2023-10-01', '2023-10-31').median().clip(lawu)

# NBR+ calculation
def calc_nbr_plus(image):
    num = (image.select('B12').subtract(image.select('B8A'))
                              .subtract(image.select('B3'))
                              .subtract(image.select('B2')))
    den = (image.select('B12').add(image.select('B8A'))
                              .add(image.select('B3'))
                              .add(image.select('B2')))
    return num.divide(den).rename('nbr_plus')

nbr_plus_pre  = calc_nbr_plus(pre_fire)
nbr_plus_post = calc_nbr_plus(post_fire)

# Bi-temporal delta and burned area mask
d_nbr_plus = nbr_plus_post.subtract(nbr_plus_pre).rename('d_nbr_plus')
burn_mask  = d_nbr_plus.gte(0.3).selfMask()

References


License

This project is for academic and research purposes. Sentinel-2 imagery is provided by ESA through the Copernicus programme and is freely available for scientific use.


Last updated: June 2026

About

This project maps and analyzes burned areas resulting from the Mount Lawu forest fire (August 30 – September 29, 2023) using the Normalized Burn Ratio Plus (NBR+) index applied to Sentinel-2 Surface Reflectance imagery via Google Earth Engine.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors