Efficient Satellite Image Processing for Remote Sensing
Bloomy ETL is a lightweight Python tool developed for NASA Space Apps Challenge 2025 that automates satellite image processing for vegetation monitoring. It downloads and processes NASA's HLS (Harmonized Landsat Sentinel-2) data to calculate NDVI and EVI vegetation indices.
Why Bloomy?
- β Fast: Asynchronous downloads (10x faster than manual)
- β Simple: One command to process months of data
- β Free: 100% open-source
- β Smart: Automatic cloud masking and quality filtering
Use Cases: Forest monitoring, fire detection, agriculture, drought analysis, urban planning.
# Clone repository
git clone https://github.com/TellusOne/bloomy-etl
cd bloomy-etl
# Install dependencies
pip install -e .
# Configure NASA EarthData credentials
cp .env.example .env
# Edit .env with your username/password from https://urs.earthdata.nasa.govUse geojson.io to draw your study area and save as data/my_area.geojson
python main.py \
--aoi data/my_area.geojson \
--start 2024-01-01 \
--end 2024-06-30 \
--output data/output.nc \
--cloud-cover 30# Interactive viewer
python tools/visualize_dataset.py data/output.nc --mode interactive
# Export to ArcGIS/QGIS
python main.py --output data/output.nc --only-export --downsample 2- Automated HLS Data Download: Query NASA EarthData for Landsat 8/9 and Sentinel-2
- Cloud Masking: Automatic quality filtering using Fmask
- Vegetation Indices: Calculate NDVI and EVI
- Event Detection: Identify fires, floods, droughts
- GeoTIFF Export: Ready for ArcGIS Pro/QGIS
- Interactive Visualization: Built-in time series viewer
- Asynchronous processing (10 simultaneous downloads)
- NetCDF output (CF-compliant)
- Fixed WGS84 grid (no dimension mismatches)
- Multi-stage quality control
- Smart caching (resume interrupted downloads)
python main.py \
--aoi data/amazon_forest.geojson \
--start 2024-01-01 \
--end 2024-12-31 \
--output data/forest_2024.nc \
--cloud-cover 40 \
--export-geotiffpython main.py \
--aoi data/farm_field.geojson \
--start 2024-03-01 \
--end 2024-09-30 \
--output data/crop_season.nc \
--cloud-cover 20python main.py \
--aoi data/fire_zone.geojson \
--start 2024-07-01 \
--end 2024-07-31 \
--output data/fire_july.nc \
--cloud-cover 50bloomy/etl/
βββ main.py # Main entry point
βββ .env.example # Environment template
βββ requirements.txt # Dependencies
β
βββ core/ # Core modules
β βββ pipeline.py # Main orchestrator
β βββ processor.py # Granule processing
β βββ searcher.py # CMR API queries
β βββ merger.py # Dataset merging
β βββ quality.py # Quality filters + event detection
β βββ authenticator.py # NASA authentication
β
βββ tools/ # Utilities
β βββ arcgis.py # GeoTIFF exporter
β βββ visualize_dataset.py # Interactive viewer
β
βββ config/
βββ settings.py # Quality thresholds
python main.py \
--aoi <geojson> # Area of Interest (required)
--start <YYYY-MM-DD> # Start date (required)
--end <YYYY-MM-DD> # End date (required)
--output <file.nc> # Output NetCDF (required)
--cloud-cover <0-100> # Max cloud % (default: 20)
--batch-size <int> # Parallel downloads (default: 10)
--export-geotiff # Export to GeoTIFF
--downsample <1|2|4> # Resolution (1=30m, 2=60m, 4=120m)python tools/visualize_dataset.py <file.nc> [OPTIONS]
# Modes:
--mode interactive # Slider navigation (recommended)
--mode single --time-idx 5 # Single timestamp
--mode timeseries --pixel-y 50 --pixel-x 100 # Pixel time series
--mode mean # Temporal average
--mode std # Temporal variability
--mode export # Export all frames as PNG
--mode gif # Create animated GIF# Option 1: From main pipeline
python main.py --output data/results.nc --only-export --downsample 2
# Option 2: Standalone exporter
python tools/arcgis.py --input data/results.nc --output arcgis_export/- Verify credentials at https://urs.earthdata.nasa.gov/
- Check
.envfile (no typos, no quotes) - Accept EULA at https://search.earthdata.nasa.gov/ (search "HLS")
- Expand AOI (minimum 10km Γ 10km)
- Increase
--cloud-cover 50 - Check data availability at NASA Earthdata Search
- Reduce
--batch-size 5 - Use
--downsample 2(60m resolution) - Process 3-6 months at a time
- Enable caching:
--cache-dir cache/ --keep-cache - Use faster internet connection
- Process during off-peak hours
Contributions welcome! Please:
- Fork the repository
- Create a branch (
git checkout -b feature/new-feature) - Commit changes (
git commit -m 'Add feature') - Push (
git push origin feature/new-feature) - Open a Pull Request
MIT License - see LICENSE file for details.
NASA Space Apps Challenge 2025 - This project was developed as part of the NASA Space Apps Challenge to democratize satellite image processing.
- NASA EarthData - Free HLS data
- USGS - Landsat program
- ESA - Sentinel-2 program
- Open-source community - xarray, rasterio, matplotlib
Made with β€οΈ for NASA Space Apps Challenge 2025
Bloomy ETL - Making satellite image processing accessible to everyone.