All values come from the Copernicus Sentinel-5P TROPOMI instrument, accessed as monthly composite images via Google Earth Engine and aggregated to the 600 upazilas of Bangladesh (mean of all pixels intersecting each upazila boundary). This is satellite-observed atmospheric column data, not ground-station surface-level air quality (AQI). It answers "how much of this gas sits in the air column above this area, on average, in this month" — it does not measure what people breathe at ground level, so it should not be read against WHO/AQI health thresholds, which are surface concentration standards.
| Gas | Earth Engine product | Native unit | Displayed as |
|---|---|---|---|
| NO₂ — nitrogen dioxide | COPERNICUS/S5P/OFFL/L3_NO2 (tropospheric column) | mol/m² | µmol/m² (×10⁶) |
| SO₂ — sulfur dioxide | COPERNICUS/S5P/OFFL/L3_SO2 (total column) | mol/m² | µmol/m² (×10⁶) |
| CO — carbon monoxide | COPERNICUS/S5P/OFFL/L3_CO (total column) | mol/m² | mmol/m² (×10³) |
| CH₄ — methane | COPERNICUS/S5P/OFFL/L3_CH4 (column-averaged dry-air mixing ratio) | ppb | ppb (unchanged) |
600 upazilas (thanas/sub-districts) × 90 months, January 2019 through June 2026 (the most recent complete month at the time this dashboard was built), for each of the 4 gases — 216,000 upazila-month readings in total. Note: the source files were supplied covering 2019 onward and turned out to already include data through mid-2026, so the dashboard shows the full span rather than stopping at 2025.
District and division figures are the simple average of their constituent upazilas (equal weight per upazila, not population- or area-weighted).
The "Seasonal profile" chart and the Seasonal time mode use the standard Bangladesh Meteorological Department 4-season convention:
| Season | Months |
|---|---|
| Winter | December – February (December counted in the following year's winter) |
| Pre-monsoon | March – May |
| Monsoon | June – September |
| Post-monsoon | October – November |
About a quarter of all SO₂ readings are slightly negative. This is expected retrieval noise, not a real negative concentration — TROPOMI's SO₂ signal is close to the instrument's detection limit over most of Bangladesh outside industrial hot-spots (brick-kiln belts, power plants), so background pixels scatter around zero. Treat small negative and small positive SO₂ values as "near background," and focus on relative differences between areas/periods rather than the absolute sign.
About 35% of CH₄ upazila-months have no valid reading — heavily concentrated in June–September (79% of all gaps), because CH₄ retrieval needs a clear sky and the monsoon's persistent cloud cover blocks it. NO₂, SO₂ and CO retrievals are far more resilient (CO/SO₂ are essentially 100% complete; NO₂ is missing a single reading in the whole dataset). Every KPI, chart and map cell carries an n / expected month count and a completeness flag so a monsoon CH₄ average built from 2 months isn't mistaken for one built from 4.
Shown on hover on the map and in the narrative line — replaces the "reliability" concept used in the DHS survey atlas with something appropriate for satellite time series: the share of expected months in the current window that actually have a valid retrieval.
| Flag | Meaning |
|---|---|
| Full coverage | ≥ 90% of months have a valid reading |
| Partial coverage | 50–89% of months have a valid reading |
| Sparse (cloud gaps) | < 50% of months have a valid reading — usually monsoon CH₄ |
| No data | No valid reading in the selected window |
Every CSV row is keyed by GEO_CODE (an 8-digit code = 2-digit division + 2-digit district +
2-digit upazila, e.g. 20030004 = Chattogram → Bandarban → Alikadam). The same field, in the
same format, is present on the upazila.geojson, district.geojson (4-digit) and
division.geojson (2-digit) boundary files, so upazila readings join to polygons directly and
roll up to district/division by simple average. This is entirely client-side: the browser fetches the
4 CSVs and 3 GeoJSON files on load and does all parsing/aggregation in JavaScript — there is no server
build step, database, or PHP backend, so the whole folder can be dropped onto any static host (or opened via
a local server for testing).
To extend the time range, append new rows to the 4 Upazila_<GAS>_monthly.csv files
(same columns, especially GEO_CODE, YEAR, MONTH, MEAN_VALUE)
and update CONFIG.time.endYear / endMonth in assets/js/config.js.
No other file needs to change.