简介:覆盖2005—2021年中国西北五省区(新疆、青海、甘肃、内蒙古、宁夏)的逐年NPP栅格数据,源自MODIS MOD17A3HGF产品并重采样至1000米,坐标系统为WGS84,已统一清洗无效值,单位g·C/m²,适合生态遥感、植被生产力估算和区域碳循环研究等GIS从业者直接使用。压缩包共79个文件,以19个年度TIF影像为主体,另含TFW坐标配准文件、XML元数据及OVR金字塔文件,并附有NPP_mean多年均值栅格,便于在ArcGIS或QGIS中快速加载、出图与统计,包体大小约150MB。数据集按年份命名、组织清晰,便于按需检索,可直接用于西北地区植被生产力年际变化、荒漠化监测或生态恢复效果评估。目前已有848人学习下载,是一套经过整理的长时间序列NPP底图,节省了在GEE平台中逐年筛选和预处理的环节,既能满足教学演示,也适合科研项目使用。 前两天同事发过来一个tif文件,文件名是“西北地区_NPP_MOD17A3HGF_1000m_2005-2021.tif”,让我帮忙弄两件事:把栅格边界导出成面要素,再算一个2005到2021年的NPP多年平均值。这类MODIS的NPP数据我接过不少,但每次拿到手的文件预处理状态都不一样:有人给的是原始的Sinusoidal投影,打开和行政区底图怎么都对不上;有人给的是多波段堆叠,一个文件装了17年数据;还有人没处理填充值,图层显示出来一片黑。如果拿到文件就直接往ArcMap里拖,大概率第一步就会开始踩坑。这篇就以这个文件为线索,把MOD17A3HGF数据的背景、打开检查、单位换算、投影处理、边界导出、CASS衔接和大文件优化整条链路完整走一遍,顺便把常见的坑都标出来,给正在折腾类似栅格数据的朋友做个参考。
1. 先弄明白这个tif里到底装了什么
1.1 文件名逐段拆解
“西北地区_NPP_MOD17A3HGF_1000m_2005-2021.tif”这个文件名信息量很大,拆开看每一段都有实际含义。
- 西北地区:研究区范围,说明这个数据已经被裁剪或者拼接处理过,不是全球分幅的原始瓦片。
- NPP:Net Primary Productivity,净初级生产力,指单位面积、单位时间内绿色植物通过光合作用积累的有机质总量,扣除自身呼吸消耗后的净值。
- MOD17A3HGF:数据产品代号。MOD代表Terra卫星上的MODIS传感器;17代表植被生产力产品组;A3表示年度产品;HGF是产品版本和处理标识,这是目前常用的Collection 6.1版本。
- 1000m:空间分辨率,也就是说每个像元代表地面1000米乘1000米的区域。
- 2005-2021:时间跨度,一共17年,意味着这个文件很可能不只是单波段,而是17个波段逐年排列,或者至少包含了17年中的某一种统计量。
很多人看到MOD17A3HGF就以为是个“神秘格式”,其实它的核心就是一个GeoTIFF栅格文件,只是内部存储了MODIS的NPP科学数据集。MOD17A3HGF的算法基础是光能利用率模型:先通过MODIS的FPAR/LAI产品得到植被吸收的光合有效辐射比例,再结合气象再分析数据计算出总初级生产力GPP,最后减去植被维持呼吸和生长呼吸得到NPP。简单说,这个文件描述的是“某一年里,每个1000米格子上的植被到底净固化了多少碳”,单位是kg C/m²/yr。
1.2 这种数据能用来干什么
NPP是生态学和碳循环研究里非常重要的指标。拿到西北地区17年的NPP序列,可以做的事情很多:比如统计不同年份的NPP均值波动,结合气温降水数据分析植被对气候变化的响应;或者按行政区、流域做分区统计,看退耕还林、生态修复工程实施前后的植被生产力变化;也可以对17年序列做趋势分析,找出那些NPP持续上升或下降的热点区域。
不过,不管后面做什么分析,第一步都是先把数据本身搞清楚:投影是什么、波段有几个、像元值有没有乘过比例因子、填充值是多少。这些基础信息不确认清楚,后面所有统计结果都可能出问题。我自己处理过不少这类数据,经验是拿到文件后不要急着出图,先花十分钟做一套检查,后面能省下大半天返工时间。
2. 别急着出图,先做四件套检查
2.1 投影和坐标系
MODIS标准产品使用的是Sinusoidal正弦投影,这个投影在赤道附近变形小,但到了中高纬度影像会显得“歪”,和常见的WGS84经纬度地理坐标系对不上。如果这个tif是直接从LP DAAC下载的原版,打开后和底图叠加会差一大截。如果文件名里的1000m是别人已经处理过的重采样版本,投影可能已经被转成了WGS84、Albers或其他坐标系。
我的习惯是打开属性表里的Source选项卡,先看Spatial Reference。如果显示是Sinusoidal,后面向导出的边界、计算面积都要先重投影;如果已经是Albers等积投影,做面积统计时就不用再折腾了。文件里写1000m和实际X/Y分辨率也要核对一遍,有的数据文件名说是1km,实际打开像元大小却是926.625m,这种情况也常见,因为MODIS正弦投影下的1km像元本身就存在纬度方向上的形变。
2.2 波段数:单波段还是多年堆叠
文件名里写了2005-2021,17年时间,但只有一个tif,这时候必须检查波段数。右键图层属性,看栅格信息里的波段数量,或者用Python读一下。如果是17个波段,说明一个文件里按波段顺序存储了17年的NPP;如果是单波段,那这个文件可能存储的是多年平均值或者其他统计量。
多波段文件直接丢进ArcMap,默认可能只显示第一个波段,或者在做RGB合成时显示成奇怪的颜色。做分析前需要先把波段拆开,可以用ArcGIS里的分离波段工具,也可以用GDAL命令行逐个提取。拆开后每个文件对应一个年份,命名规范一点,后面做栅格计算会省很多事。判断波段数还有一个笨办法:看文件大小。一个西北区域范围的17波段整型tif,通常比单波段大十几倍,一目了然。
2.3 NoData、填充值和比例因子
这是最容易踩坑的地方。MOD17A3HGF原始数据的存储值不是直接的NPP数值,而是16位整型数,有效范围一般在0到30000左右,水域、无植被区的填充值通常是32767。也就是说,如果直接把原始整型数据放进栅格计算器做统计,得到的结果会大得离谱,动辄几千几万,根本没法解释。
正确的做法是先乘以比例因子0.0001,把整型值换算成真实的NPP单位kg C/m²/yr。这一步在ArcMap里可以用栅格计算器直接写:
"西北地区_NPP_MOD17A3HGF_1000m_2005-2021.tif" * 0.0001同时,需要在环境设置里把NoData处理一下,让填充值真正变成NoData,否则统计时会把32767也加进去,平均值被严重拉高。符号化的时候也要注意,加载后一片黑往往就是填充值没设好、拉伸范围不对导致的。这一步做完再往下走,基本不会出现“值对不上”的问题。
2.4 用Python快速检查文件信息
如果ArcMap打开大文件很卡,可以用Python的rasterio库快速查看元数据,几秒钟就能拿到关键信息。这种办法很适合批量检查多个文件,也方便在交给别人之前先自检一遍。
import rasterio with rasterio.open('西北地区_NPP_MOD17A3HGF_1000m_2005-2021.tif') as src: print('波段数:', src.count) print('坐标系:', src.crs) print('像元大小:', src.res) print('NoData:', src.nodata) print('数据类型:', src.dtypes) print('影像范围:', src.bounds)这段代码会输出栅格的基本信息。如果波段数大于1,可以再单独读取某一个波段的最大最小值,判断是否乘过比例因子。这里有个小提醒:读大数据时建议用小窗口读,用src.read(1, window=...)的方式,不要一次性read全图,内存容易爆。尤其是西北这种大范围、几百MB的tif,直接整幅读进内存,笔记本基本扛不住。
3. 把tif边界导出来:给ArcMap和CASS用的方法
3.1 最快方法:栅格域工具
如果只需要栅格的矩形外边界,ArcMap里最直接的工具是“栅格域”(Raster Domain),位置在ArcToolbox的:数据管理工具-栅格-栅格属性-栅格域。输入栅格,输出要素类,工具会自动生成一个面要素,范围就是整幅栅格的外框。这个工具处理大文件特别快,因为它只读取栅格的范围信息,不逐像元扫描。
使用前注意两点:一是输入栅格最好已经定义好投影,输出的面要素会继承投影信息,方便后面和CASS数据套合;二是如果要导出的不是外框,而是NPP有效数据的实际分布边界,栅格域就无能为力了,因为它只会给一个横平竖直的矩形。实际项目中“整个栅格外边界”这个需求其实占多数,所以这个工具够用、好用。
3.2 按有效值生成边界:重分类加栅格转面
有些场景下需要的是“有植被区”的真实边界,比如做掩膜或者给CASS描绘作业范围,这时候要把NoData区域排除掉。方法分三步:第一步用重分类工具把有效像元统一赋值为1,NoData保持NoData;第二步用“栅格转面”工具,把值为1的区域转成面要素;第三步对生成的面要素执行融合,合并所有碎片面,得到完整边界。栅格转面工具默认跳过NoData,所以这一步出来的面就已经剔除了水域和无植被区域。
遇到像元很碎、面数量特别多的情况,可以在重分类前先对栅格做一个中值滤波或者多数滤波,平滑掉孤立像元,生成的面要素会简洁很多。另外,栅格转面工具的输出面在边界处会有锯齿,这个在制图时问题不大,但如果要给CASS做精确作业边界,可能需要后续在CASS里手动抽稀或者圆滑一下。整体流程不复杂,但一定要记着最后融合,因为栅格转面默认是按像元连通性拆成很多个小面的。
3.3 CASS加载tif后的数据处理
CASS是基于CAD平台开发的,加载tif主要用“光栅图像”功能。菜单路径一般是:工具-光栅图像-插入图像,或者在命令行输入IMAGEATTACH,选择tif文件和对应的tfw世界文件。这里有个很容易被忽略的点:如果tif没有tfw,插入后影像只是显示在原点附近,位置是错的,需要先做图像纠正。纠正可以用CAD的ALIGN命令,选两个以上已知控制点,把影像上的点和实际坐标一一对应,一次命令就能把影像整体平移、旋转、缩放到正确位置。
加载进来之后还有几个高频操作。影像太亮或者太暗,用IMAGEADJUST调节亮度、对比度、淡入度;影像范围太大影响绘图体验,用IMAGECLIP剪裁出关心的区域;不想看到影像边框,用IMAGEFRAME命令关闭边框显示。做矢量化之前建议把影像显示比例设好,不然描出来的线在打印出图时比例尺对不上。补充一点:CASS里影像只是外部参照,tif文件路径一变就会丢失,所以最好把影像和工程文件放在同一目录下,避免下次打开工程时影像一片空白。
4. 文件太大:加载和计算的几条优化路子
4.1 先检查有没有金字塔
很多tif打开慢、缩放卡,根本原因是金字塔没有生成。ArcMap在加载大栅格时会提示是否构建金字塔,如果每次都点“不”,数据量一大就会卡得怀疑人生。主动构建金字塔的方法是在图层属性里找到金字塔选项,或者直接用“构建金字塔和统计信息”工具批量处理。金字塔相当于给影像做了一组分辨率由细到粗的缩略图,放大和缩小时能快速显示对应层级,这是最便宜、见效最快的一步优化。
处理NPP这种多年份大范围的tif,强烈建议一拿到文件就先构建金字塔。倒不是显存不够,而是ArcMap这种桌面软件对超大栅格的显示效率本来就不高,没有金字塔时每次缩放都要重新读取全部像元,数据一大基本没法操作。构建金字塔后,显示流畅度会有质的提升。
4.2 重新压缩和换格式
文件太大时可以尝试用“复制栅格”工具重新输出一遍,压缩类型选LZW,这是无损压缩,适合NPP这类连续型栅格数据,压缩率通常不错。如果对精度要求没那么高,也可以选用JPEG压缩,体积更小,但要留意有效值范围压缩后会不会溢出。另外一个推荐做法是把tif转成COG,也就是云优化GeoTIFF,它把数据按内部瓦片组织,配合金字塔,在QGIS和现代GIS软件里加载特别快。用GDAL转换非常方便,一行命令的事:
gdal_translate -of COG -co COMPRESS=LZW input.tif output_cog.tif需要说明的是,这个命令要求GDAL版本在3.1以上,老版本还没有COG驱动。如果不想装GDAL,QGIS也提供了“转换为COG”的图形界面工具,勾选一下就行。转换后的COG文件仍然以tif为后缀,兼容性比普通tif还好,很多新项目已经在把COG当作标准存储格式用了。
4.3 裁剪到研究区再做分析
如果原始文件是整个西北的范围,而分析只关心某个流域或省份,最有效的办法是先用矢量边界做掩膜提取,把研究区外的像元剪掉。提取后的栅格范围小了很多,后续栅格计算器、分区统计、趋势分析都快好几个量级。掩膜提取时环境设置里把捕捉栅格设成原始tif,避免提取后范围和像元对齐出问题。
这里顺便说一句:不少人觉得“范围大显得数据全”,实际上在做科学研究时,冗余数据只会拖慢速度、增加干扰。我自己做西北地区植被分析时,通常会把Köppen气候区、生态功能区或行政区界线叠加提取,这样每个生态单元的分析结果更干净,也更方便解释。
4.4 多年文件避免一条条手工算
对于2005-2021这种17年的文件,不建议把17个波段拆开后一个个用栅格计算器手动操作。可以在ArcGIS ModelBuilder里建立一个循环模型,或者直接写一个批处理脚本。用Python配rasterio写循环也很简单,读取每一年的波段、乘比例因子,最后用numpy直接计算多年平均值和趋势。这样所有年份都走同一套逻辑,不容易出错,而且一次跑完。
举一个很常见的需求:算17年NPP的平均值。如果文件是多波段的,在栅格计算器里直接用平均函数或者Cell Statistics工具,选择波段列表,一次就能出结果。如果是17个独立文件,用Cell Statistics工具把17个栅格加入列表同样能算,比手动做加法再除17省事得多。唯一要注意的是,参与计算的栅格范围和像元对齐必须一致,否则工具会报错或者悄悄插值。
5. 常见问题速查与避坑心得
5.1 问题排查表
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| 打开后整幅图一片黑或一片白 | 填充值未识别,符号化范围不对 | 设置NoData为32767,用拉伸渲染,调显示范围 |
| 统计得到的均值几千几万 | 原始整型值没乘比例因子 | NPP原始值乘0.0001再做统计 |
| 和行政区底图叠加时位置明显偏移 | 投影未定义或Sinusoidal投影未转换 | 检查坐标系,重投影到WGS84或Albers |
| 一个tif显示成红绿蓝伪彩色 | 多波段tif被当成RGB合成打开 | 确认波段数,按单波段或手动指定波段显示 |
| 缩放或计算特别慢 | 没有金字塔,文件未压缩 | 构建金字塔,复制栅格时用LZW压缩 |
| CASS里插入tif后看不到影像 | 缺少tfw位置信息,或图像路径丢失 | 加载tfw或用ALIGN做图像纠正,检查外部参照路径 |
5.2 三条避坑心得
第一,拿到任何MODIS系列产品,先查产品文档确认比例因子和填充值,不要凭经验套。MOD17A3HGF的比例因子是0.0001,但有些平台下载的数据已经帮你换算过,再乘一次就会全部变成接近0的值,实际处理前最好打印一两个像元值验证一下。验证方法很简单,在ArcMap里用识别工具点几个植被密集的像元,看数值是否在合理范围内,比如西北地区大部分像元在0.1到1.5 kg C/m²/yr之间,超出这个范围太多就要怀疑单位换算出了问题。
第二,做时间序列时要注意年份是否连续。2005-2021中间如果有个别年份缺数据,直接用平均值或者趋势分析都会受影响。有的年份数据质量差,像元级填充值特别多,建议先做逐年份的数据质量统计,确定哪些年份需要剔除或插补。插补方法可以简单一点,比如用前后两年的均值填补中间年份,但如果缺测比例太高,基本要放弃这一年的数据,不要硬凑。
第三,网上流传的“tif示例文件”质量参差不齐。如果只是练习操作,随便下个地形tif没问题,但如果是要做正式研究,一定要从可信渠道获取数据。MOD17A3HGF可以从NASA的LP DAAC或国内镜像平台下载,这类数据有明确的产品版本和使用说明,比来路不明的范例文件靠谱得多。下载时还要注意Product版本,C6和C6.1在数值上有一定差异,不同版本不能混用做长时间序列分析。
处理这种大区域、多年份的NPP数据,说白了就四个字:先查元数据。投影、波段、填充值、比例因子这四个信息确认清楚了,后面不管是出图、统计、导出边界还是和CASS衔接,都只是顺手的操作。我自己处理类似数据踩过最多的坑,往往是急着算结果,结果单位错了、坐标系错了,最后全部推翻重来。你如果也刚拿到类似命名的tif,建议先花十分钟做一遍上面说的四件套检查,后面能省下大半天。最后再分享一个小经验:建好金字塔的tif,用起来体验完全是两个世界,这一步永远值得最先做。
本文还有配套的精品资源,点击获取