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)
- VIIRS annual NTL average radiance, year by year
- WorldPop annual population mosaic
- NTL/pop ratio per pixel
- Reduce by admin polygons → CSV
Datasets
- viirs-ntl-annual
- worldpop
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
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'}));import ee
ee.Initialize()