PyPI npm Zenodo DOI Coverage 100% Platforms uv pnpm

OmniEarth

Universal Multi-Modal Earth Observation, Hyperspectral Data Cube, DEM, and Environmental Intelligence Engine across CLI, Python SDK, Node.js SDK, and REST STAC APIs.

GitHub Repository CLI Guide Python SDK Node.js SDK Direct REST / cURL

Multi-Modal Data Matrix and Zero-Config Backends

Modality Sensors and Bands Spatial Resolution Backend Provider Authentication
Optical Multispectral Sentinel-2 L2A (12 bands), Landsat-8/9 10m - 30m AWS Earth Search STAC Zero-Config Public COGs
Digital Elevation Models Copernicus DEM GLO-30, SRTM GL1, ALOS AW3D30 30m DSM / DTM AWS Open Data / OpenTopography S3 Zero-Config Direct Public COGs
Land Cover (LULC) ESA WorldCover (2020 v100, 2021 v200) 10m global classification ESA WorldCover AWS S3 Zero-Config Direct Public COGs
Hyperspectral Cubes DLR EnMAP (224 bands, 420-2450 nm) 30m DLR EOC STAC + Geoservice Free DLR Account (Optional)
Hyperspectral Cubes NASA EMIT (285 bands, 381-2493 nm) 60m NASA CMR STAC Free Earthdata Login (Optional)
Hyperspectral Cubes ASI PRISMA (240 bands) 30m ASI PRISMA Portal Free ASI Account (Optional)
Synthetic Aperture Radar Sentinel-1 GRD / RTC (VV & VH) 10m AWS Earth Search STAC Zero-Config Public COGs
Weather & Climate Open-Meteo, ERA5 Reanalysis 1-11km hourly Open-Meteo REST API Zero-Config Open API
Soil Composition ISRIC SoilGrids v2.0 (3D profile 0-200cm) 250m ISRIC REST API Zero-Config Open API

Sequential CLI User Guide

1 System Healthcheck and Provider Status

Inspect detected credentials, cache paths, and API readiness:

omniearth info

2 Catalog Exploration

Display all modalities, spectral bands, and backend endpoints:

omniearth categories

3 Spatial Search with Bounding Box, Point, or GeoJSON

Find intersecting scenes across any sensor modality:

# Bounding box search: min_lon min_lat max_lon max_lat
omniearth search --category optical --bbox 78.50 20.65 78.60 20.72 --limit 3

# Point search: lon lat [radius_km]
omniearth search --category sar --point 78.55 20.68 5.0 --limit 3

# GeoJSON search
omniearth search --category elevation --geojson ./field_boundary.geojson

# Land Cover search
omniearth search --category landcover --bbox 78.50 20.65 78.60 20.72 --year 2021

4 Filtering by Date, Cloud Cover, and Soil Depth

# Filter Sentinel-2 with max 15% cloud cover within date range
omniearth search --category optical \
  --bbox 78.50 20.65 78.60 20.72 \
  --start 2026-01-01 --end 2026-03-31 \
  --max-cloud 15 --limit 5

# Query soil texture at 0-5cm depth
omniearth search --category soil --point 78.55 20.68 --depth 0-5cm

5 Single-Asset Resumable Download

Stream Cloud-Optimized GeoTIFFs or hyperspectral cubes with byte-range resumption:

omniearth download --category elevation \
  --bbox 78.50 20.65 78.60 20.72 \
  --dataset copernicus \
  --outdir ./downloads

6 High-Speed Multi-Asset Download with Worker Threads

Download all assets associated with a scene concurrently:

omniearth download --category optical \
  --id S2A_32TPT_20260315_0_L2A \
  --all \
  --threads 8 \
  --outdir ./downloads
Resumable Engine: If interrupted, OmniEarth queries partial files via HTTP 206 Partial Content and resumes from the exact byte offset without re-downloading.

7 On-the-Fly Radiometric Indices (NDVI, NDWI, NDRE, EVI, NBR)

# Compute NDVI from reflectances
omniearth compute --index ndvi --nir 0.82 --red 0.18

# Compute EVI
omniearth compute --index evi --nir 0.75 --red 0.15 --blue 0.08

8 Historical Time-Series Extraction

# Weather time series
omniearth timeseries --category weather --bbox 78.50 20.65 78.60 20.72 --limit 24

# Satellite pass chronology
omniearth timeseries --category optical --bbox 78.50 20.65 78.60 20.72 --start 2026-01-01 --end 2026-03-31

Sequential Python SDK Guide

1 Setup and Initialization

import omniearth as oe

client = oe.OmniEarth()

2 Spatial Search Across Modalities

# 1. Search Optical Sentinel-2
optical_scenes = client.search(
    category="optical",
    bbox=[78.50, 20.65, 78.60, 20.72],
    start_date="2026-01-01",
    end_date="2026-03-31",
    max_cloud_cover=20,
    limit=5
)

# 2. Search Copernicus DEM 30m
dem_tiles = client.search(
    category="elevation",
    bbox=[78.50, 20.65, 78.60, 20.72],
    dataset="copernicus"
)

# 3. Search ESA WorldCover 10m
lc_tiles = client.search(
    category="landcover",
    bbox=[78.50, 20.65, 78.60, 20.72],
    year=2021
)

3 Resumable and Parallel Multipart Downloads

# Downloads visual RGB COG with automatic multipart chunking and resumption
scene = optical_scenes[0]
file_path = client.download(
    result=scene,
    asset_key="visual",
    outdir="./downloads",
    resume=True,       # Auto-resume partial .part downloads
    multipart=True,    # Parallel chunked ranges for files >= 10MB
    max_workers=4
)
print(f"Downloaded to: {file_path}")

4 Multi-Asset and Multi-Scene Concurrency

# Concurrently download ALL assets for a scene:
paths_dict = client.download_all(scene, outdir="./downloads", max_workers=4)

# Concurrently download across multiple scenes:
all_paths = client.download_many(optical_scenes, asset_key="visual", outdir="./downloads", max_workers=4)

5 Zero-Config Environmental Shortcuts

# Instant DEM Elevation Raster
dem = client.get_elevation(bbox=[78.50, 20.65, 78.60, 20.72], dataset="copernicus")

# Instant Land Cover Map
lc = client.get_landcover(bbox=[78.50, 20.65, 78.60, 20.72], year=2021)

# Instant Weather & Soil Moisture Feed
wx = client.get_weather(bbox=[78.50, 20.65, 78.60, 20.72])
print("Elevation:", wx.properties["elevation"])

# Instant ISRIC SoilGrids 3D Chemistry & Texture Profile
soil = client.get_soil(bbox=[78.50, 20.65, 78.60, 20.72], depth="0-5cm")
print("Topsoil Clay/Sand:", soil.properties["summary_topsoil"])

6 Radiometric Index & Time-Series Analytics

# Compute NDVI
ndvi = client.compute_index("ndvi", nir=0.82, red=0.18)
print("NDVI Mean:", ndvi["mean"])

# Extract historical weather time-series
series = client.get_time_series(category="weather", bbox=[78.50, 20.65, 78.60, 20.72])
print(f"Extracted {len(series)} chronological hourly observations.")

Sequential Node.js and TypeScript SDK Guide

1 Setup and Client Instantiation

import { OmniEarth, Category } from "omniearth";

const client = new OmniEarth();

2 Search with Full Type Safety

const scenes = await client.search({
  category: Category.OPTICAL,
  bbox: [78.50, 20.65, 78.60, 20.72],
  startDate: "2026-01-01",
  endDate: "2026-03-31",
  maxCloudCover: 15,
  limit: 5
});

3 High-Speed Resumable Streaming and Batching

// 1. Single Asset Download with Resumption and Parallel Chunking
const visualPath = await client.download(scenes[0], "visual", "./downloads", {
  resume: true,
  multipart: true,
  concurrency: 4
});

// 2. Download All Assets Concurrently
const assetMap = await client.downloadAll(scenes[0], undefined, "./downloads", {
  concurrency: 4
});

// 3. Batch Download Across Multiple Scenes
const manyPaths = await client.downloadMany(scenes, "visual", "./downloads", {
  concurrency: 4
});

4 Shortcuts, Indices, and Time-Series

// Instant Elevation DEM
const dem = await client.getElevation([78.50, 20.65, 78.60, 20.72], "copernicus");

// Compute NDVI
const ndvi = client.computeIndex("ndvi", { nir: 0.82, red: 0.18 });
console.log("NDVI:", ndvi);

// Time-Series Extraction
const ts = await client.getTimeSeries({
  category: Category.WEATHER,
  bbox: [78.50, 20.65, 78.60, 20.72]
});
console.log("Weather steps:", ts.length);

Direct Underlying REST and STAC API Calls (cURL)

OmniEarth interacts directly with upstream public STAC and REST standards. You can query these exact backends without any SDK:

1. Optical Multispectral (AWS Earth Search STAC)

curl -s -X POST "https://earth-search.aws.element84.com/v1/search" \
  -H "Content-Type: application/json" \
  -d '{
    "collections": ["sentinel-2-l2a"],
    "bbox": [78.50, 20.65, 78.60, 20.72],
    "datetime": "2026-01-01T00:00:00Z/2026-03-31T23:59:59Z",
    "query": { "eo:cloud_cover": { "lte": 20 } },
    "limit": 3
  }' | jq '.features[] | {id: .id, visual: .assets.visual.href}'

2. Digital Elevation Model (Copernicus DEM 30m S3)

curl -s -I "https://copernicus-dem-30m.s3.amazonaws.com/Copernicus_DSM_COG_10_N20_00_E078_00_DEM/Copernicus_DSM_COG_10_N20_00_E078_00_DEM.tif"

3. Land Cover (ESA WorldCover 10m S3)

curl -s -I "https://esa-worldcover.s3.eu-central-1.amazonaws.com/v200/2021/map/ESA_WorldCover_10m_2021_v200_N18E075_Map.tif"

4. Weather and Solar Climate Profiles (Open-Meteo REST API)

curl -s "https://api.open-meteo.com/v1/forecast?latitude=20.68&longitude=78.55&hourly=temperature_2m,relative_humidity_2m,soil_moisture_0_to_1cm,surface_solar_radiation" \
  | jq '{elevation: .elevation, current_temp: .hourly.temperature_2m[0]}'

5. Soil Chemistry and 3D Texture (ISRIC SoilGrids REST API)

curl -s "https://rest.isric.org/soilgrids/v2.0/properties/query?lon=78.55&lat=20.68&property=clay&property=sand&property=soc&property=phh2o&depth=0-5cm" \
  | jq '.properties.layers[] | {name: .name, mean_value: .depths[0].values.mean}'

6. Hyperspectral Data Cubes (DLR EOC STAC API)

curl -s "https://geoservice.dlr.de/eoc/ogc/stac/v1/search?collections=ENMAP_L2A&bbox=78.50,20.65,78.60,20.72&limit=2" \
  | jq '.features[] | {id: .id, datetime: .properties.datetime, assets: .assets | keys}'

Citation and Licensing

OmniEarth is distributed under the OmniEarth Open Source License with Mandatory Attribution and Academic Citation.

@software{omniearth2026,
  author       = {Lokesh Kumar},
  title        = {OmniEarth: Universal Multi-Modal Open Earth Observation, Hyperspectral, and Weather Data Engine},
  month        = oct,
  year         = 2026,
  publisher    = {Zenodo},
  doi          = {10.5281/zenodo.23689449},
  url          = {https://github.com/lokeshsk/omniearth}
}