前阵子一个做林冠状态监测的同行来找我,说VIIRS数据下载卡了两天:注册、授权、检索、下载,每个环节都像在闯关。我帮他走完一遍后意识到,这套流程对新人来说确实存在不少隐藏门槛。VIIRS作为新一代对地观测传感器,在生态遥感指数计算、火点监测、夜间灯光分析、林冠状态动态监测这些方向上几乎是绕不开的数据源,但网上讲原理的多,讲"怎么把文件真正下到本地"的少。这篇就把我实际操作过的下载流程完整拆开,从数据选型、账号注册到脚本拉取、预处理,一步步讲清楚,适合刚接触遥感数据的同学,也适合被下载卡住想找排查思路的从业者。
1. 先搞清楚要哪份VIIRS:从产品分类到观测几何
很多人在下载第一步就犯迷糊,打开数据平台看到一堆缩写:SDR、EDR、VNP09、VNP46……根本不知道选哪个。这个选择题做错,后面全部白忙。所以先把数据本身捋一遍。
1.1 VIIRS与MODIS的关键差异:不只是分辨率高了一点
VIIRS全称是Visible Infrared Imaging Radiometer Suite,搭载在Suomi NPP和NOAA-20等卫星上,被视为MODIS的继承者。它的扫描宽度约3000公里,比MODIS的2330公里更宽,这意味着单条轨道覆盖范围更大,重访周期更短。空间分辨率方面,I波段(成像波段)为375米,M波段(中等分辨率波段)为750米,D波段(昼夜波段)也有各自的用途。很多人以为VIIRS只是"MODIS换了名字",其实它在辐射定标、探测灵敏度、夜间波段设计上都有明显升级,尤其是DNB波段可以探测极微弱的可见光,夜间灯光产品几乎全靠它。
对做生态遥感的人来说,VIIRS最直接的吸引力是持续的数据更新和较低的产品滞后时间。MODIS的部分产品还在跑,但VIIRS的产品体系已经非常完整,植被指数、叶面积指数、火点、地表反射率、海表温度等都有对应的官方产品。如果你要做的生态遥感指数属于常规监测类,VIIRS完全够用,没必要非守着MODIS不放。
1.2 产品级别命名:SDR、EDR与专题产品的对应关系
数据平台上的缩写看着吓人,本质上就是一套编号逻辑。SDR是传感器数据记录,相当于L1级数据,也叫原始辐射数据,包含各波段的DN值、辐射定标系数、几何信息。EDR是环境数据记录,相当于L2级产品,比如气溶胶光学厚度、火点、地表反射率。再往上还有更高级的专题产品,比如植被指数、叶面积指数、净初级生产力等。
具体到文件命名,VIIRS的陆地产品常见前缀是VNP,比如VNP09(地表反射率)、VNP13(植被指数)、VNP14(火点)、VNP15(叶面积指数)、VNP46(夜间灯光)。前缀后面的A1、A2之类表示产品粒度。比如VNP09GA是几何校正后的地表反射率产品,VNP13A1是500米分辨率的植被指数产品。
搞清楚这个命名规则,下载时就有方向了:做NDVI、EVI这类生态遥感指数,直接找VNP13系列;做林冠状态监测,通常需要VNP09GA配合云掩膜产品VNP03或VNP09对应的质量文件;如果只做夜间灯光,选VNP46系列。先明确自己要哪类产品,再进平台检索,效率完全不同。
1.3 面向生态遥感指标的产品选型建议
结合我自己的使用经验,几个常见场景可以直接参考:
- 常规植被绿度监测:选VNP13A1(500米,16天合成)或VNP13A2(1000米),够用且数据量小,时间序列也好拉。
- 精细林冠状态分析:选VNP09GA(750米逐日表面反射率)配合云掩膜,自己算NDVI、EVI等指数,灵活度最高。
- 火点监测:选VNP14产品,375米分辨率,响应比较及时。
- 夜间灯光与社会经济分析:选VNP46系列,注意区分月合成和日产品,应用场景差别很大。
- 只需要快速看一眼大区域趋势:直接用现成的生态遥感指数专题产品或合成产品,省去自己处理反射率数据的步骤。
还有一个容易被忽略的点:注意产品版本的更新。同一个产品编号,可能因为算法升级推出新集合编号,比如Collection 1、Collection 2。新版本往往修正了辐射定标或云掩膜的问题,除非你的项目时间序列必须保持版本一致性,否则优先选最新集合。
2. Earthdata账号注册与数据源授权:卡住多数人的前两步
VIIRS数据的绝大多数公开产品都通过NASA的地球数据系统分发,下载前必须有Earthdata账号。这个账号本身免费,但很多人注册完直接去下载,发现还是报错,原因往往是漏了"授权"这一步。
2.1 注册流程里最容易忽略的邮箱与密码规则
注册其实不复杂,在Earthdata登录页面选择注册新账号,填邮箱、姓名、机构(机构可写"Independent Researcher"之类)、密码即可。密码规则比较特殊,要求必须包含大小写字母、数字和特殊字符,且长度通常在12位以上。我第一次注册时就因为密码不含特殊字符被反复打回。
注册完成后,邮箱会收到一封验证邮件,不点击验证链接,账号不会真正激活。这一步容易忽略,特别是用企业邮箱时验证邮件容易被垃圾箱拦截。建议注册完马上去邮箱点确认链接,再回到平台登录。
还有一个使用细节:Earthdata账号密码会定期要求更新。如果发现之前能用的下载脚本突然报401认证失败,先别急着怀疑网络,去登录页面看是不是密码被要求重置了。
2.2 把LAADS或NSIDC加进授权列表
NASA的数据分发是去中心化的,每个数据中心有自己独立的授权机制。你注册了Earthdata账号,不等于所有数据中心都认这个账号。常见的情况是:账号能登录Earthdata Search,但点下载链接时却弹出登录框或返回403。
解决办法是访问对应数据中心的"Authorized Applications"或"App Authorizations"页面,把你需要的数据中心加入授权列表。下载VIIRS陆地产品通常需要授权LAADS DAAC,下载雪冰相关产品需要NSIDC,下载夜间灯光产品也可能涉及不同的分发入口。授权的操作一般是点击"Authorize"按钮并等待页面跳转,完成后你的账号就和该数据中心绑定。
实际操作中,我建议把能用到的应用一次性都授权了,省得以后换产品线时又来回折腾。有些项目需要从USGS EROS下载数据,同样需要额外授权,原理一样。
2.3 常见的401/403错误排查
下载脚本或浏览器里遇到401或403,不要一头雾水,按顺序排查:
- 密码是否被重置。
- 是否已在对应数据中心完成授权。
- 是否用错了下载地址,有些地址要求带token认证。
- 脚本里是否有空格、引号截断问题。
- 是否触发了服务器的限流策略,短时间内并发请求太多会被临时封禁。
其中限流这个坑最隐蔽。用wget批量拉数据时,如果并发开太高,服务器会认为你是异常请求,直接拒绝。我一般把并发控制在1到2个,虽然慢一点,但不至于断流。真的需要加速,优先考虑修改检索规则减少文件数量,而不是无限加大并发。
3. 检索参数这样组合:空间、时间与条带覆盖一次到位
进入Earthdata Search平台后,新手通常会直接在地图上拖一个矩形框,然后选日期点搜索,结果要么拉到几百个文件,要么一个都搜不到,完全不知道哪里出了问题。检索的本质是让平台理解你真正需要的轨道条带和瓦片集合。
3.1 空间范围过滤:不是画个矩形就完事
地图画框确实是最直观的筛选方式,但要注意,VIIRS是扫描成像,单条轨道的扫描带在墨卡托投影下是弯曲的,如果目标区域恰好位于轨道接缝处,简单的矩形框可能命中与你的经纬度预期完全不符的瓦片。
实际工作中,我习惯先用目标区域的最小外接矩形搜索,然后重点检查检索结果的"覆盖范围"字段。大部分平台支持在地图图层中显示每个文件的覆盖边界,打开后能直观看到哪些文件真正与目标区域重叠。别只看文件数量,要看覆盖边界。
如果你处理的是行政区域或流域边界,最好先把边界文件转成GeoJSON或KML格式,直接上传到检索平台作为空间过滤条件。这样比手动画矩形精准得多,尤其适合不规则的长条形研究区。
3.2 时间选择与轨道分幅的关系
VIIRS不是静止卫星,同一区域不是每天都能被拍到,这里涉及轨道重访周期。VIIRS的轨道设计能保证全球大部分地区每天至少有一到两次观测,但具体到某个地方,可能上午拍得到、下午拍不到,或者连续两天都有覆盖、第三天出现空隙。
检索时如果你选"2023年1月1日到2023年1月2日"这样短的窗口,很可能只有一两个文件甚至没有文件。正确做法是先按"周"或"月"范围搜索,再根据文件列表里的日期字段查看每天实际覆盖情况。对于逐日产品,一天可能对应多个分幅文件,它们的文件名里通常带日期和轨道号,需要全部下载后做拼接。
3.3 如何判断检索结果是否真正覆盖目标区域
不要只依赖平台的预览图,还要看三个关键信息:
- 文件名里的轨道号和日期。
- 覆盖范围的经纬度边界。
- 数据质量标识(部分平台会显示云量覆盖百分比)。
云量是我最看重的指标之一。对生态遥感指数计算来说,如果检索到的文件云覆盖率超过70%,即使覆盖范围完全命中目标区域,实际可用像元也非常有限。很多平台支持按云量过滤,建议把阈值设在20%到30%,减少无效下载。
另外,检索结果中如果出现"Download"按钮直接可用,说明该数据池支持匿名下载或你的账号已授权;如果按钮灰色或提示需要登录,说明还没完成授权,返回上一章排查。
4. 下载执行阶段的选择题:浏览器直传与脚本批量拉取
选好数据后,下载方式也有讲究。文件少,比如几十个,浏览器网页直传没问题;文件多,比如一个季度几百个文件,再用浏览器一个个点,很容易点崩溃。这时候应该用脚本批量拉取。
4.1 Earthdata Search的购物车下载流程
Earthdata Search平台的逻辑类似购物车。检索完成后,把需要的文件加入购物车,然后选择下载方式。平台会生成一个下载列表,里面是每个文件的HTTPS链接,并建议你使用wget或curl配合账号信息下载。
对新手,平台里还有一个"Download Files"按钮,点击后会生成一个脚本文件,里面包含wget命令。这个脚本可以保存下来,之后在本地终端里执行。注意,脚本生成前会要求你确认授权信息,确认一次即可。
浏览器直传适合小批量,但也有一个隐藏问题:浏览器下载中途断了不会自动续传,而大文件断一次等于前面白下。我用浏览器直传只限于单文件小于200MB的情况,再大的文件一律走脚本。
4.2 生成下载脚本后如何正确执行
平台生成的脚本本质上是一长串wget命令,结构大致是:
wget -e robots=off -m -np -nH --cut-dirs=5 \ --content-disposition \ --user=你的用户名 \ --password=你的密码 \ "https://ladsweb.modaps.eosdis.nasa.gov/archive/allData/5000/VNP09GA/2023/001/"这个命令的要点在于:
- -m 表示镜像模式,会递归抓取链接。
- -np 表示不爬取上级目录,防止跑到别的目录。
- -nH 表示不建立以域名命名的本地目录。
- --cut-dirs=N 用来去掉路径中前N层目录,让本地目录结构更清爽。
- --content-disposition 是关键,很多文件下载时URL里不带文件名,没有这个参数,保存下来的文件名会变成一串乱码。
执行前先建一个单独的文件夹,不要直接在用户根目录跑。数据文件体积大,万一命令写错,清理起来很麻烦。我习惯每一步都先跑一个文件测试,确认文件名和目录结构正常后,再放开下载所有文件。
4.3 下载中断与续传的现实处理方案
批量下载中最常见的问题是中断。网络波动、服务器限流、电脑休眠都可能让下载停在某个百分比。wget的-m参数本身就支持断点续传,但前提是不要轻易删除已下载的临时文件。
如果下载中断,重新执行同样的命令即可,wget会检查本地已存在的文件,已完整下载的文件会跳过,不完整的会继续下载。这个机制实测比较可靠。
另一种更省事的方式是写一个循环脚本,逐个文件下载并检查文件大小是否为0。非0且大于1MB才视为下载成功,否则记录到失败列表里统一重试。这个思路适用于从自定义清单下载的情况:
while read url; do wget --user="$USER" --password="$PASS" --content-disposition -c "$url" sleep 2 done < download_list.txtsleep 2是为了降低请求频率,避免被服务器限流。实测下来,每两个请求间隔2秒左右,下载稳定性最好。不要贪快一次性开几十个线程,NASA的分发服务器对异常并发并不客气。
5. 下载完成后的第一道门槛:HDF5/NetCDF结构、投影与快显
文件下载到本地,很多人以为大功告成,结果用ArcMap一打开,黑屏或者只有一行奇怪的波段数据,随即开始怀疑自己是不是下错了。其实VIIRS产品多数以HDF5或NetCDF格式存储,这类格式不是普通图片,要先理解它的内部结构。
5.1 打开VIIRS数据前必须理解的三层结构
HDF5文件像是一个自带索引的文件柜,里面可以装很多数据集。VIIRS产品的典型结构是:
- 顶层Metadata,包括卫星、轨道号、时间、投影信息。
- Data Fields,包括表面反射率、辐射定标数据、角度信息、云掩膜等。
- 质量与几何字段,如观测时间、太阳天顶角、传感器天顶角等。
想直接当图片看TIF格式的人,拿到HDF5会不知所措。正确做法是用支持HDF5的工具打开。我推荐三种方式:
- HDFView:图形化查看工具,适合快速浏览文件结构和属性信息。
- Python xarray:读取多维数组非常方便,适合做后续计算。
- GDAL:脚本处理、格式转换、投影变换的万能工具。
5.2 用Python快速完成波段提取与投影
在Python中,xarray配合rasterio读取VIIRS反射率产品是很顺手的组合。简单示例:
import xarray as xr ds = xr.open_dataset("VNP09GA.A2023001.h28v08.001.2023001090000.h5") ref = ds["SurfReflectance_M5"].isel(Data_Fields_0=0)拿到数组后,还需要把DN值换算成反射率。不同产品的定标系数不一样,最稳妥的方法是查看文件属性里的scale_factor和add_offset字段,计算公式是:真实值 = DN值 × scale_factor + add_offset。
换算完反射率,紧接着要处理投影。VIIRS陆地产品常见的是正弦投影或地理经纬度网格,具体取决于产品类型。如果你习惯在ArcGIS或QGIS里做后续分析,建议用gdalwarp转成熟悉的UTM或等经纬度投影:
gdalwarp -t_srs EPSG:32650 -of GTiff input.h5 output_utm.tifEPSG:32650只是示例,实际要根据研究区纬度选择对应的UTM分带。
5.3 ArcMap加载整幅TIF构建金字塔慢的处理经验
很多同行反馈在ArcMap 10.2里加载整幅TIF遥感影像时,构建金字塔非常慢,几分钟甚至半小时都在转圈。这个问题我遇到过多次,核心原因有三个:
- 文件太大且未压缩或压缩方式不合适。
- 像元块大小设置不合理,导致读取零散。
- 投影信息不完整,ArcMap在显示前要先做实时重投影。
针对这三个原因,建议下载完先做一次标准预处理,而不是直接拖进ArcMap:
gdal_translate -of GTiff -co COMPRESS=LZW -co TILED=YES -co BLOCKXSIZE=512 -co BLOCKYSIZE=512 input.h5 output.tif其中TILED=YES和BLOCKXSIZE设置很重要。瓦片化后的TIF在显示时只需读取可视范围的块,而不是加载整幅文件。如果文件本身带有效投影信息,再用ArcMap打开,构建金字塔的速度会明显提升。
如果你还要做更复杂的遥感图像标注,比如基于林冠状态标注健康区域,建议也先把数据转成统一的TIF和坐标系,标注工具对常规格式的兼容性远比HDF5友好。
6. 从一个实际需求讲透:林冠状态遥感动态监测中的VIIRS数据利用
流程走到这一步,数据已经躺在硬盘里了。但下载只是开始,怎么把它变成可用的生态指标才是关键。我以一个实际的林冠状态动态监测项目为例,说明从VIIRS数据到最终产品的完整链路。
6.1 云掩膜与指数计算:拿到原始数据后的标准前处理
林冠状态监测最常用的指标是NDVI或EVI,计算公式不复杂,但如果不做云掩膜,结果会被云污染得乱七八糟。VIIRS的VNP09GA产品自带云掩膜字段或者配套的质量数据。
我的处理顺序是:
- 读取表面反射率的多个波段(M3红光、M4近红外等)。
- 读取云掩膜字段,将云像元标记为无效值。
- 执行指数计算,只对云掩膜通过的有效像元计算。
- 用研究区边界裁剪,避免海岸线或外部区域干扰。
- 重投影到统一坐标系并输出为TIF。
以NDVI为例,VIIRS波段与MODIS不完全一致,计算时需要确认波段索引,建议直接看文件属性里的波段名称,不要凭经验套公式。植被指数产品VNP13A1则是官方直接算好的,如果你的需求不是验证算法,直接用官方产品更省事。
6.2 时间序列构建与异常波动查看
林冠状态动态监测的核心是看时间序列变化,单一天的NDVI没有意义。把多天影像按日期排序,叠加成一条曲线,才能发现林冠是在变绿还是变黄,是否出现异常下降。
构建时间序列时,有两个问题容易忽略:
- 不同来源的数据日期不连续,需要做时间插值或合成。
- 个别日期因云覆盖出现明显异常低值,直接进入曲线会误判为林冠退化。
我的做法是:先对单日产品做严格的质量过滤,标记云和阴影像元;然后按16天或月为单位做最大值合成,降低云干扰;最后对时间序列做Savitzky-Golay平滑,把残差噪声去掉。这套流程跑完,林冠状态的变化趋势会清晰得多。
6.3 与深度学习分割模型衔接时的标注与输入组织
如果项目里要用SegFormer这类Transformer分割模型做林冠类型识别,需要注意一点:遥感图像标注和普通自然图像标注不一样,多波段输入、地理参考和样本不平衡都要提前处理。
我通常把VIIRS处理后输出的多波段TIF作为模型的输入底图,在标注工具中叠加Google影像或更高分辨率的参考数据,逐像素标注林冠类型。标注完成后导出为GeoJSON或COCO格式,再按模型要求切块。
切块时还要考虑波段数量。SegFormer的预训练权重通常接收3通道输入,但遥感多波段数据可能是8通道甚至更多。一个实用方案是:用RGB三通道做初始训练,收敛后再加入近红外波段微调。这样既利用了预训练权重,又能让模型学到植被特有的光谱特征。
另外,标注数据的质量直接决定模型上限。VIIRS的375米或750米分辨率对单木级林冠分割来说偏粗,适合做区域性林冠分类,比如常绿林、落叶林、混交林、非林地的判别。如果项目目标是单木级冠幅提取,建议另外找更高分辨率的影像作为标注底图,VIIRS数据更适合做区域监测背景。
多说一句,在这套流程里,下载环节看似枯燥,却是最容易让项目延期的地方。我把账号授权、检索参数、脚本下载、数据格式转换这几个步骤固定成了一套标准操作后,后面每次拉数据的时间基本控制在半小时以内。你如果也经常跟VIIRS打交道,建议把这套流程整理成自己的检查清单,下次直接照做就行。