World Bank - Light Every Night¶
Overview¶
World Bank Light Every Night is a comprehensive data repository of nighttime light satellite imagery collected from two sensors over the last three decades: the Defense Meteorological Satellite Program (DMSP) Operational Linescan System (OLS) with data from 1992-2017, and the Visible Infrared Imaging Radiometer Suite (VIIRS) Day-Night Band (DNB) with data spanning 2012-2020.
The DMSP-OLS and VIIRS-DNB sensors capture various sources of low-light emissions from Earth. These include sources that indicate aspects of human activity, like city lights, gas flares, fishing boats, and agricultural fires, while also capturing other nighttime lights phenomena such as auroras.
The World Bank worked in collaboration with the National Oceanic and Atmospheric Administration (NOAA) and the University of Michigan to publish this repository, designed from the ground up to be analysis-ready. The underlying data are sourced from the NOAA National Centers for Environmental Information (NCEI) archive. Additional processing by the University of Michigan enables access in Cloud Optimized GeoTIFF format (COG) and search using the Spatial Temporal Asset Catalog (STAC) standard. These standards are part of the growing Analysis Ready Data ecosystem that is improving access to geospatial data sets, enabling broader audiences to readily discover, process and analyze geospatial data.
Learn more about remote sensing, nighttime light images and using these data for analysis at World Bank’s Open Nighttime Lights tutorial.
Accessing Light Every Night data on AWS¶
You can access these data via the link, s3://globalnightlight
and using the web interface via the AWS console. Or via the AWS Command Line Interface, for example to list all files in the VIIRS 201505 sub-directory (using the --no-sign-request
flag since this bucket is public:
$ aws s3 ls s3://globalnightlight/201505 --no-sign-request
Light Every Night file structure¶
The data for both DMSP-OLS and VIIRS-DNB are in the root AWS S3 bucket, s3://globalnightlight/
. DMSP-OLS data are organized into directories by satellite name and year. VIIRS-DNB data are organized by month until 2017 and by satellite name and month starting in 2018 when data from two satellites (NPP and NOAA-20/J01) became available.
DMSP-OLS¶
DMSP-OLS data are organized by satellite name and the year in which the data were captured. The DMSP satellites have the naming convention F[nn], where nn ranges from 10-18 for this collection. A table is provided below of DMSP satellites and the corresponding years for which nighttime OLS data are available in the Light Every Night AWS repository. While this is the bulk of the nighttime OLS data, other satellite-years and data from 2018-present are available and can be accessed by contacting the DMSP archive at NOAA/NCEI. Matching the satellite name with a year available in the table gives the subdirectory in the AWS bucket, for example s3://globalnightlight/F121995/
contains all data collected by DMSP satellite F12 in the year 1995.
Table 1. DMSP satellites and their corresponding years of OLS data that are available in the World Bank Light Every Night repository.
F10 |
F12 |
F14 |
F15 |
F16 |
F18 |
---|---|---|---|---|---|
1992 |
|||||
1993 |
|||||
1994 |
1994 |
||||
1995 |
|||||
1996 |
|||||
1997 |
1997 |
||||
1998 |
1998 |
||||
1999 |
1999 |
||||
2000 |
2000 |
||||
2001 |
2001 |
||||
2002 |
2002 |
||||
2003 |
2003 |
||||
2004 |
2004 |
||||
2005 |
2005 |
||||
2006 |
2006 |
||||
2007 |
2007 |
||||
2008 |
|||||
2009 |
|||||
2010 |
2010 |
||||
2011 |
|||||
2012 |
2012 |
||||
2013 |
2013 |
||||
2014 |
2014 |
||||
2015 |
|||||
2016 |
2016 |
||||
2017 |
2017 |
Within a given sub-directory, data are provided by satellite orbit for every day (night) of the given year. For each OLS orbital segment, there are 5 image layers and a JSON metadata file. For a given orbital segment, these 6 files all have the same file prefix, which contains some metadata about the satellite and start time of the data in UTC. These are described below using an example:
F12199501010014.night.OIS
F12 -> satellite name
1995 -> year at start of orbital segment
01 -> month at start of orbital segment
01 -> day of month at start of orbital segment
00 -> hour of day at start of orbital segment
14 -> minute of hour at start of orbital segment
.night -> orbit is cropped to only nighttime data
.OIS -> acronym for OLS Interleaved Smooth
For each orbital segment, there are 5 image layers and the JSON metadata file. They have the same file prefix as described above, and are distinguished by their file extensions:
.vis.co.tif
: a COG with a single band containing the visible nighttime imagery (this is the key data file)Data range: [0, 63]
“No-data” value: 255
Data type: byte
Units: Digital Number (DN) or unitless
.vis.co.json
: a JSON file following the STAC schema with metadata for orbital segment, including a timestamp and a geospatial bounding box.flag.co.tif
: a COG with a single band containing bitflags that can be queried for data qualityData range: [0,215-1]
“No-data” value: 215
Bit-fields: see Table 2
Data type: 16-bit integer
Units: Unitless
.tir.co.tif
: a COG with a single band containing the OLS Thermal Infrared (TIR) dataData range: [0, 255]
“No-data” value: 255 (note this is not unique, use
vis.co.tif
or another companion file to confirm areas of no data)Data type: byte
Units: Scaled byte data. These values can be converted to temperature in Kelvin using [slope, offset] of [0.4706,190.0]
.samples.co.tif
: a COG with a single band containing sample position for the OLS pixel along the swath.Data range: [1,1465]
No-data value: 0
Data type: 16-bit integer
Units: unitless
.li.co.tif
: a COG with a single band containing Lunar Illuminance (LI) valuesData range: [0, inf)
No-data value: -1.0
Data type: floating point
Units: lux
The bounding box geometry of the area covered in each file is available in the metadata within the corresponding JSON file and in the COG itself.
Table 2: Bit-flag field descriptions for OLS “flag” file
Flag Name |
Flag Bit Position |
Flag State Description |
---|---|---|
OLS_CLOUD1 |
0 |
This bit is set to 1 if the OLS pixel is determined to be a cloud given the primary (more restrictive) set of parameters on the OLS cloud algorithm. |
OLS_LIGHT1 |
1 |
This bit is set to 1 if the OLS pixel is determined to be a light given the primary (less restrictive) set of parameters on the OLS light filtering algorithm. |
OLS_GLARE |
2 |
This bit is set to 1 if the OLS pixel is determined to be in an area of the swath impacted by solar glare (stray light) as determined by the OLS glare algorithm. |
OLS_BSL_AND_LIGHTNING |
3 |
This bit is set to 1 if the OLS scanline is determined to contain lightning and/or is a bad scanline as determined by the OLS lightning algorithm. |
OLS_PIXEL_CENTER |
4 |
This bit is set to 1 if the grid cell is an exact match to the location of an OLS pixel center. |
OLS_DAYTIME |
5 |
This bit is set to 1 if the OLS pixel is collected in daytime conditions. This region is determined using solar elevation angles and defines an area where no nighttime lights can be seen. |
OLS_NIGHTTIME_MARGINAL |
6 |
This bit is set to 1 if the OLS pixel is determined to be in the transition zone between day and night, aka the “terminator”. This region is determined using solar elevation angles and defines an area where nighttime lights can be seen, but the background is starting to be impacted by the sun. |
OLS_LIGHT2 |
7 |
This bit is set to 1 if the OLS pixel is determined to be a light given the secondary (more restrictive) set of parameters on the OLS light filtering algorithm. |
OLS_CLOUD2 |
10 |
This bit is set to 1 if the OLS pixel is determined to be a cloud given the secondary (less restrictive) set of parameters on the OLS cloud algorithm. |
OLS_ZERO_LUNAR_ILLUM |
11 |
This bit is set to 1 if the OLS pixel is collected when no moonlight is present (lunar illuminance value < threshold). |
OLS_FIXED_GAIN |
12 |
This bit is set to 1 if the scanline was part of a special collection where the OLS gain setting was fixed. Normally the OLS gain is allowed to fluctuate given the collection’s environmental parameters. |
OLS_CLOUDS_UNKNOWN |
13 |
This bit is set to 1 if ancillary data needed to determine cloud state was not available. |
OLS_NO_DATA |
15 |
This bit is set to 1 if no data is available for that scanline/section of orbit, or the grid cell is outside the bounds of the swath. |
VIIRS-DNB¶
VIIRS-DNB data are available starting in April of 2012. The data are organized by either the year-month in which the data were captured, or by satellite year-month starting in 2018. If there is no satellite name, the satellite is assumed to be NPP. For example:
s3://globalnightlight/201505/
contains all data for May 2015 with satellite NPPs3://globalnightlight/npp_202012/
contains all data for December 2020 with satellite NPP
Within a given sub-directory, data are provided in ~6 minute orbital segments, or aggregates, for every day (night) of the given month. For each aggregate, there are 5 image layers and a JSON metadata file. For a given aggregate, these 6 files all have the similar file prefixes, which contain some metadata about the data layer, the time of data collect (UTC), orbit number, and creation time of the VIIRS sensor data record (SDR) when placed in the NOAA CLASS archive. These file prefixes follow the naming convention and structure of Sensor Data Records as described in the VIIRS SDR User’s Guide, and are also described below.
The 6 filenames for the layers/metadata associated with a given aggregate time are shown by example:
SVDNB_npp_d20150504_t1335358_e1341162_b18219_c20150504194116381040_noaa_ops.rade9.co.tif
SVDNB_npp_d20150504_t1335358_e1341162_b18219_c20150504194116381040_noaa_ops.rade9.co.json
npp_d20150504_t1335358_e1341162_b18219.vflag.co.tif
GDNBO_npp_d20150504_t1335358_e1341162_b18219_c20150504194116380812_noaa_ops.li.co.tif
GDTCN_npp_d20150504_t1335358_e1341162_b18219_c20150504194116380812_noaa_ops.samples.co.tif
SVM15_npp_d20150504_t1335358_e1341162_b18219_c20150504194116358997_noaa_ops.rad.co.tif
For this aggregate time, each file contains common aggregate identification fields. In this example, the aggregate identifier common to each filename is:
npp_d20150504_t1335358_e1341162_b18219
npp -> satellite ID
d20150504 -> start date of first scan in aggregate (2015/05/04)
t1335358 -> time of first scan (13:35:35.8)
e1341162 -> time of last scan (13:41:16.2)
b18219 -> orbit number of first scan
All but one of the filenames are prepended with a product ID and have an additional timestamp or “creation time”. These will be described below, again using a filename prefix from our example aggregate:
SVDNB_npp_d20150504_t1335358_e1341162_b18219_c20150504194116381040_noaa_ops
SVDNB -> Day/Night Band SDR (all possible product IDs are listed below)
npp_d20150504_t1335358_e1341162_b18219 -> aggregate identifier
C20150504194116381040 -> creation date/time of SDR
noaa -> data origin
ops -> data domain
ALL possible product IDs in this repository:
SVDNB
-> Day/Night Band SDRGDNBO
-> Day/Night Band GeolocationGDTCN
-> Day/Night Band Geolocation. This is NCEI’s internal terrain corrected version before it was available in the standard VIIRS DNB geolocation product.SVM15
-> Moderate Resolution band 15 SDR (longwave thermal)
The VIIRS layers can be further distinguished by their file extensions:
.rade9.co.tif
: a COG with a single band containing the DNB nighttime radiance (this is the key data file)Data range: (-1.5, inf)
“No-data” values: -999.3 and -1.5
Data type: floating point
Units: nanowatts/cm2/sr
.rade9.co.json
: a JSON file following the STAC schema with metadata for the nighttime radiance data, including a timestamp and a geospatial bounding box.vflag.co.tif
: a COG with a single band containing bitflags that can be queried for data qualityData range: [0, 231-1]
“No-data” value: 231
Bit-fields: see Table 3
Data type: 32-bit integer
Units: Unitless
.rad.co.tif
: a COG with a single band containing the TIR radianceData range:
“No-data” value: -999.3
Data type: floating point
Units: W m-2 sr-1 μm-1
.samples.co.tif
: a COG with a single band containing sample position for the DNB pixels along the swath.Data range: [1, 4064]
No-data value: 0
Data type: 16-bit integer
Units: unitless
.li.co.tif
: a COG with a single band containing Lunar Illuminance (LI) valuesData range: [0, inf)
No-data value: -999.3
Data type: floating point
Units: lux
Table 3: Bit-flag field descriptions for DNB “vflag” file
Flag Name |
Flag Bit Position |
Flag State Description |
---|---|---|
VIIRS_CLOUD_QC |
2 |
This bit is set to 1 if the VIIRS cloud algorithm results should be considered of poor quality (e.g. not enough ancillary data for the algorithm to give confident results.) |
VIIRS_CLOUD |
3-4 |
This 2-bit field has the following values: (0) Clear sky; (1) Probably cloudy; (2) Confidently cloudy; (3) Clouds unknown. These values are taken from the VIIRS Cloud Mask (VCM) Environmental Data Record (EDR) through 2017 and then the VIIRS Enterprise Cloud Mask (ECM) product from 2018 forward. |
VIIRS_ZERO_LUNAR_ILLUM |
5 |
This bit is set to 1 if the VIIRS-DNB pixel is collected when no moonlight is present (lunar illuminance value < threshold). |
VIIRS_DAY_NIGHT_TERM |
6-7 |
This 2-bit field has the following values: (0) Day - grid cell is in daytime conditions; (1) Terminator - grid cell is in terminator zone (transition region between day and night); (2) Night - grid cell is in nighttime conditions; (3) Unknown. These regions are determined using solar elevation angles. |
VIIRS_STRAY_LIGHT |
14-15 |
This 2-bit field has the following values: (0) NO stray light impact; (1) Stray light impact region (per solar elevation model); (2) Stray light correction algorithm run on DNB; (3) Stray light impact region AND stray light correction run on DNB. Note: stray light correction began on the VIIRS DNB SDR imagery in 2014. |
VIIRS_DNB_LIGHTNING |
22-23 |
This 2-bit field has the following values: (0) No lightning detected; (1) Lightning signature detected; (2) Spare value; (3) No data OR lightning algorithm did not execute. |
VIIRS_DNB_HEP |
24 |
This bit is set to 1 if the DNB pixel is determined to contain a High-Energy particle hit per internal algorithm (common in the South Atlantic Anomaly zone over South America). |
VIIRS_NO_DATA |
31 |
This bit is set to 1 if no data is available for that scanline/section of orbit, or the grid cell is outside the bounds of the swath. |