Skip to main content

Nadir BRDF Adjusted Reflectance (NBAR) for Sentinel-2 in Python

Project description

cubo

Nadir BRDF Adjusted Reflectance (NBAR) for Sentinel-2 in Python

PyPI conda-forge Documentation Status arXiv Tests License GitHub Sponsors Buy me a coffee Ko-fi Twitter Black isort


GitHub: https://github.com/ESDS-Leipzig/sen2nbar

Documentation: https://sen2nbar.readthedocs.io/

PyPI: https://pypi.org/project/sen2nbar/

Conda-forge: https://anaconda.org/conda-forge/sen2nbar

Tutorials: https://sen2nbar.readthedocs.io/en/latest/tutorials.html

Paper: https://doi.org/10.5194/isprs-archives-XLVIII-4-W12-2024-105-2024


[!IMPORTANT]
Our sen2nbar paper is out! Check it here: Montero, D., Mahecha, M.D., Aybar, C., Mosig, C., & Wieneke, S. (2024). Facilitating Advanced Sentinel-2 Analysis Through a Simplified Computation of Nadir BRDF Adjusted Reflectance.

Overview

First, a super small glossary:

  • BRDF: Bidirectional Reflectance Distribution Function.
  • DN: Digital Number.
  • NBAR: Nadir BRDF Adjusted Reflectance.
  • SR: Surface Reflectance.
  • STAC: SpatioTemporal Assets Catalogs.

Second, the amazing bibliography by David P. Roy et al., used to create this package:

Third, the super useful bibliography by Lucht et al.,:

Given this, and in a few words, sen2nbar converts the Sentinel-2 SR (i.e., L2A) to Sentinel-2 NBAR via the c-factor method.

SAFE

You can use sen2nbar to convert complete images via SAFE:

from sen2nbar.nbar import nbar_SAFE

# Converted images are saved inside the SAFE path
nbar_SAFE("S2A_MSIL2A_20230223T075931_N0509_R035_T35HLC_20230223T120656.SAFE")

Note

Note that sen2nbar automatically shifts the DN of images with a processing baseline >= 04.00. This includes data cubes obtained via stackstac or cubo.

stackstac

Or, if you are using STAC and retrieving images via stackstac:

import pystac_client
import stackstac
import planetary_computer as pc
from sen2nbar.nbar import nbar_stackstac

# Important infor for later
endpoint = "https://planetarycomputer.microsoft.com/api/stac/v1"
collection = "sentinel-2-l2a"
bounds = (-148.565368, 60.800723, -147.443389, 61.183638)

# Open the STAC
catalog = pystac_client.Client.open(endpoint, modifier=pc.sign_inplace)

# Define your area
area_of_interest = {
    "type": "Polygon",
    "coordinates": [
        [
            [bounds[0], bounds[1]],
            [bounds[2], bounds[1]],
            [bounds[2], bounds[3]],
            [bounds[0], bounds[3]],
            [bounds[0], bounds[1]],
        ]
    ],
}

# Search the items
items = catalog.search(
    collections=[collection],
    intersects=area_of_interest,
    datetime="2019-06-01/2019-08-01",
    query={"eo:cloud_cover": {"lt": 10}},
).get_all_items()

# Retrieve all items as a xr.DataArray
stack = stackstac.stack(
    items,
    assets=["B05","B06","B07"], # Red Edge here, but you can use more!
    bounds_latlon=bounds,
    resolution=20
)

# Convert it to NBAR!
da = nbar_stackstac(
    stack,
    stac=endpoint,
    collection=collection
)

Warning

These examples are done using Planetary Computer. If you are using data cubes retrieved via STAC (e.g., by using stackstac or cubo), we recommend you to use this provider. The provider Element84 is not supported at the moment.

cubo

And going deeper, if you are using cubo:

import cubo
import xarray as xr
from sen2nbar.nbar import nbar_cubo

# Get your cube
da = cubo.create(
    lat=47.84815,
    lon=13.37949,
    collection="sentinel-2-l2a",
    bands=["B02","B03","B04"], # RGB here, but you can add more bands!
    start_date="2020-01-01",
    end_date="2021-01-01",
    edge_size=64,
    resolution=10,
    query={"eo:cloud_cover": {"lt": 3}}
)

# Convert it to NBAR (This a xr.DataArray)
da = nbar_cubo(da)

Bands

sen2nbar converts the following bands (if available in the input data):

  • RGB Bands: 02, 03, 04.
  • Red Edge Bands: 05, 06, 07.
  • Broad NIR Band: 08.
  • SWIR Bands: 11, 12.

Installation

Install the latest version from PyPI:

pip install sen2nbar

Upgrade sen2nbar by running:

pip install -U sen2nbar

Install the latest version from conda-forge:

conda install -c conda-forge sen2nbar

Install the latest dev version from GitHub by running:

pip install git+https://github.com/davemlz/sen2nbar

Citation

If you use this work, please consider citing the following paper:

@article{montero2024sen2nbar,
  title = {Facilitating advanced Sentinel-2 analysis through a simplified computation of Nadir BRDF Adjusted Reflectance},
  volume = {XLVIII-4/W12-2024},
  ISSN = {2194-9034},
  url = {http://dx.doi.org/10.5194/isprs-archives-XLVIII-4-W12-2024-105-2024},
  DOI = {10.5194/isprs-archives-xlviii-4-w12-2024-105-2024},
  journal = {The International Archives of the Photogrammetry,  Remote Sensing and Spatial Information Sciences},
  publisher = {Copernicus GmbH},
  author = {Montero,  David and Mahecha,  Miguel D. and Aybar,  César and Mosig,  Clemens and Wieneke,  Sebastian},
  year = {2024},
  month = jun,
  pages = {105–112}
}

License

The project is licensed under the MIT license.

RSC4Earth

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sen2nbar-2024.6.0.tar.gz (15.2 kB view details)

Uploaded Source

File details

Details for the file sen2nbar-2024.6.0.tar.gz.

File metadata

  • Download URL: sen2nbar-2024.6.0.tar.gz
  • Upload date:
  • Size: 15.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.0

File hashes

Hashes for sen2nbar-2024.6.0.tar.gz
Algorithm Hash digest
SHA256 4ed08e0c229765d36360c15172e8bd7cf99ef84c006df0a3fb8d15de6abd3dc1
MD5 0370543c642f0cd9dbf72978d61a6b43
BLAKE2b-256 0c159ba4d6481e99e265c3218ddf1c27012f70c862322269e4cff5323c67fb88

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page