Suomi NPP VIIRS夜间灯光遥感数据简介与下载(一)——数据介绍,FTP下载与hdf5读取

失踪人口回归+爷青回,本篇介绍下Suomi NPP VIIRS夜间灯光遥感数据下载。

image

1 夜间灯光遥感数据简介

夜间灯光遥感数据就是指利用遥感技术捕捉夜晚地球上的灯光分布状况,可以有效反映人类活动的空间分布,因此常用于各类社会经济数据方面的遥感反演。这方面应用的知名案例包括武汉大学李德仁院士与李熙老师利用夜间灯光监测叙利亚战争状况,斯坦福大学利用夜间灯光与机器学习算法识别全球贫困人群等。

当前常用的夜间灯光遥感数据主要是两个卫星,一个是DMSP(Defense Meteorological Sate-llite Program)是美国国防部的极轨卫星计划,传感器空间分辨率为3000 m,生产的夜光遥感产品空间分辨率通常为1000 m,同时DMPS夜光遥感数据是当前最长时间序列的夜光遥感数据(自1992-2013),可以提供长时间序列连续的夜光遥感监测。另一个则是2011年发射的新一代对地观测卫星Suomi NPP,该卫星搭载的可见光/红外辐射成像仪(Visible Infrared Imaging Radiometer Suit,VIIRS)能够获取新的夜间灯光遥感影像(Day/Night Band,DNB波段),空间分辨率也提高到750 m(以下简称NPP-DNB),生产的夜间灯光遥感产品空间分辨率通常为500 m。这两个卫星以外,还有一些其他相关的夜间灯光卫星,但是数据较少,且不易获取。值得注意的是,2018年中国也发射了自己的首颗专业夜间灯光卫星(由武汉大学设计与发射)——珞珈一号。

另外这里推荐几篇相关的夜间灯光遥感文章。第一篇是我参与的一篇RSE论文翻译。第二篇是RSE最新的夜间灯光遥感综述文章。

2 夜间灯光遥感数据下载

1 年和月尺度产品下载

DMSP夜间灯光遥感数据提供年尺度产品下载。由于该卫星存在过饱和效应,NOAA为此发布了多套去饱和的校正影像,关于DMSP夜间灯光遥感数据的详细介绍可以参考ENVI/IDL的博客:DMSP卫星介绍和数据下载

DMSP夜间灯光遥感数据年尺度产品下载地址:https://ngdc.noaa.gov/eog/dmsp.html

NPP夜间灯光遥感数据提供了年,月和日尺度数据下载。其中年和月的数据为合成产品,经过一定校正处理和合成。当前NPP夜间灯光遥感数据的年产品和月产品合成工作由科罗拉多矿业大学承担。NPP夜间灯光遥感数据的年产品和月产品下载链接,其中月产品数据存在3个月滞后期。

科罗拉多矿业大学提供的NPP夜间灯光遥感数据年尺度和与尺度下载地址:https://eogdata.mines.edu/download_dnb_composites.html

此外,这里要介绍另一套夜间灯光遥感数据产品。约莫两年前我曾经收到一位当老师的同学提出的一个关于夜间灯光遥感问题:为什么印度的灯光比中国亮?之前我不是特别明白怎么回答,一直到看到我即将介绍的这套产品,终于有了答案,这套产品名为“火石(Flint)”,是由中国科学院中国遥感卫星地面站陈甫团队研制的地球夜光产品数据集。

这里引用该团队在科普中国发表的文章中的文字“之前说NASA公布的夜光图上印度比中国亮,主要原因那是图没做好,另外一个原因是印度农村密度大,所以灯光分布广,其实不怎么亮”来回答前面那个问题。

“火石(Flint)”产品主页:http://satsee.radi.ac.cn/cfimage/nightlight/

科普中国文章“ 5年夜光遥感监测合成,中科院版全球高清夜光数据集来了!”:http://www.kepuchina.cn/wiki/yzts/201805/t20180518_629897.shtml

2 日尺度产品下载

本篇博客主要介绍NPP夜间灯光遥感数据日尺度产品的下载。目前NOAA官网提供从当天起到60天前的日尺度夜间灯光产品,全球被分割为6块。

image

NOAA NPP夜间灯光遥感数据日尺度产品下载地址:https://ngdc.noaa.gov/eog/viirs/download_ut_mos.html

初次外,NOAA也提供了过往的历史日尺度数据下载,被集成在NOAA的综合大型数组数据管理系统(The Comprehensive Large Array-data Stewardship System,CLASS)中。

NOAA CLASS系统:https://www.bou.class.noaa.gov/saa/products/welcome

如果想下载需要先注册该网站的账户,接着选择传感器,NPP夜间灯光遥感数据请选择VIIRS_SDR的数据。

image

点击GO以后,跳转到如下的页面。

image

接着可以设置感兴趣研究区以及研究时间段。

image

选择所需的波段。

image

NPP夜间灯光遥感数据常用的波段文件为以下两个,一个是DNB数据。

image

另一个是对应的定位数据。

image

选择完毕以后,点击quick search % order。

image

接下来就会等收到NOAA CLASS的下载邮件(如下图)。

image

这个数据同样是采用FTP进行下载,对于FTP不了解的同学可以翻一下前面这篇博客:葵花8号卫星数据简介与下载(一)——数据介绍与FTP下载

这里不赘述FileZilla软件的安装,只介绍如何配置FTP站点进行下载。

image

点击站点管理器。主机地址就是邮件最上面第一行FTP地址,用户为anonymous,密码为user@internet。设置完毕点击连接。

image

接下来会看到很多文件夹。根据你的订单号找到对应的文件夹下。

image

然后把选择的文件拖拽到左边的本地文件夹即可下载。

image

NPP夜间灯光遥感数据用户文档:https://ncc.nesdis.noaa.gov/documents/documentation/viirs-users-guide-tech-report-142a-v1.3.pdf

NPP夜间灯光遥感数据初学者slides。

http://rammb.cira.colostate.edu/projects/npp/Beginner_Guide_to_VIIRS_Imagery_Data.pdf"

数据命名规则。

image

除了以上数据,日尺度的产品数据还有NASA制作的一套校正产品——NASA Black Marble Product。

下载链接:https://viirsland.gsfc.nasa.gov/Products/NASA/BlackMarble.html

3 NPP夜间灯光遥感数据读取与可视化

1 Google Earth Engine

Google Earth Engine是Google推出的行星尺度的遥感云计算平台,提供了大量遥感数据的集成与运算工具。同时也包括DMSP和NPP夜间灯光遥感数据(月尺度和年尺度)。这里给出样例的可视化代码。

var dataset = ee.ImageCollection('NOAA/VIIRS/DNB/MONTHLY_V1/VCMSLCFG')
                  .filter(ee.Filter.date('2020-01-01', '2020-02-28'));
var nighttime = dataset.select('avg_rad');
var nighttimeVis = {min: 0.0, max: 60.0};
Map.setCenter(-77.1056, 38.8904, 8);
Map.addLayer(nighttime, nighttimeVis, 'Nighttime');

运行结果。

image

月尺度和年尺度产品提供的是tiff产品。可以在ArcGIS和ENVI里进行进一步处理。

2 日尺度hdf5数据读取与可视化(ENVI)

关于用ENVI读取日尺度hdf5数据的方式,详情参见以下ENVI/IDL博客与L3HARRIS。

夜光遥感数据处理

NPP VIIRS Datasets

3 日尺度hdf5数据读取与可视化(R语言)

这里也介绍下如何在R语言里读取hdf5以及转换格式。基础的两个包分别为raster和rhdf5。其中rhdf5必须通过BioManager包安装。这里是安装命令。

install.packages('raster')
install.packages('BioManager')
BioManager::install('rhdfr')

hdf5是一个在科学计算领域有广泛应用的数据格式,可以理解为多个文件夹压缩而成的格式。对于这类文件读取,首先需要先了解文件的结构才能读取。这里采用的命令就是h5ls。

h5ls(filename)

filename为hdf5文件名。如下图所示给出了NPP夜间灯光遥感数据hdf5文件的具体结构。

image

我们所需要用到的属性包括All_Data/VIIRS-DNB-GEO_All/下的Longitude和Latitude,以及All_Data/VIIRS-DNB-SDR_All/下的radiance,即夜间灯光DNB波段值。利用h5read函数读取这几个数据,命令行如下。

dnblat <- h5read(filename, 'All_Data/VIIRS-DNB-GEO_All/Latitude')
dnblon <- h5read(filename, 'All_Data/VIIRS-DNB-GEO_All/Longitude')
dnbrad <- h5read(filename, 'All_Data/VIIRS-DNB-SDR_All/Radiance')

这样即得到了夜间灯光遥感数据矩阵形式存储的经度,纬度以及波段值。接下来将三个矩阵组合成一个栅格即可。根据如下代码即可得到一个栅格数据。

radpts <- cbind(long = as.vector(dnblon), lat = as.vector(dnblat), rad = as.vector(dnbrad))
radpts <- data.frame(radpts)
colnames(radpts) <- c("x", "y", "radiance")
e <- extent(randpts[, (1:2)])
r <- raster(e, ncol = ncol(dnbrad), nrow = nrow(dnbrad), crs = "+proj=longlat + datum=WGS84")
radr <- rasterize(radpts[, (1:2), r, radpts[,3], fun = mean)

简单可视化结果如图。

image

另外可以看到这个DNB波段值数值较小,是经过缩放的,需要乘以10的9次方使得DNB波段值呈现正常范围。当然日尺度的数据由于云,月相等因素的影响,质量还有待提升。

这里也提供一些转换NASA的hdf5夜间灯光遥感相关数据的代码。

VIIRS_HDF5toGeoTIFF.R

Working with Daily NASA VIIRS Surface Reflectance Data

参考链接: