Universal Code Hub Upgrade
Script Library
AdvancedUrbanAdvanced

VIIRS Nighttime Lights × Population — Economic Activity Proxy

Per-capita NTL by admin unit — widely used as a sub-national GDP proxy in economics literature.

Pipeline (4 steps)
  1. VIIRS annual NTL average radiance, year by year
  2. WorldPop annual population mosaic
  3. NTL/pop ratio per pixel
  4. Reduce by admin polygons → CSV
Datasets
  • viirs-ntl-annual
  • worldpop
AOI modes
adminassetdraw
Simulated previewPaste the script in Earth Engine for live results
Outputs the script produces
map NTL per capita
export Per-admin CSV
chart Annual trend
Open Code Editor ↗
adv-ntl-econ.js · 15 lines
var years = ee.List.sequence(2013, 2024);
var ntl = ee.ImageCollection('NOAA/VIIRS/DNB/ANNUAL_V21').filterBounds(aoi);
var pop = ee.ImageCollection('WorldPop/GP/100m/pop').filterBounds(aoi);
var perCap = ee.ImageCollection(years.map(function(y){
  y = ee.Number(y);
  var n = ntl.filter(ee.Filter.calendarRange(y,y,'year')).first().select('average');
  var p = pop.filter(ee.Filter.calendarRange(y.min(2020), y.min(2020), 'year')).mosaic();
  return n.divide(p.add(1)).rename('ntl_pc').set('year', y).set('system:time_start', ee.Date.fromYMD(y,1,1).millis());
}));
Map.centerObject(aoi, 6);
Map.addLayer(perCap.sort('year', false).first(), {min: 0, max: 0.5,
  palette: ['#0c0a09','#7c2d12','#f59e0b','#fef3c7']}, 'NTL per capita');
print(ui.Chart.image.series({
  imageCollection: perCap, region: aoi, reducer: ee.Reducer.mean(), scale: 1000
}).setOptions({title: 'NTL per capita — annual'}));
#nighttime lights#VIIRS#GDP proxy#economics