简介:这份全国土壤侵蚀栅格数据面向地理信息、水土保持、生态与环境科研人员及高校师生,用于分析中国境内水蚀、风蚀、冻融侵蚀的分布与强度,支撑环境规划、农业管理、水利选址和城市布局等场景。资源包共18个文件,约1.54MB,以ArcGIS栅格格式为主:adf为栅格数据主体,nit、dat、dir与info目录共同构成图层索引和属性表,另附prj投影文件、xml元数据及一份docx说明文档,便于在ArcGIS或QGIS中直接加载、制图与空间叠加分析。目前已有2691人学习下载,说明其在同类数据中具备一定参考价值。读者可据此提取特定区域侵蚀图层,按轻度至极重度分级统计侵蚀面积,并与地形、气候、植被等数据叠加,深入理解水土流失成因,为科研选题、论文写作与防治策略制定提供基础数据支撑。
1. 全国土壤侵蚀栅格数据:一份能直接进 GIS 的底图资源
做水土保持规划、流域生态评估或者土地退化监测的同行,大概率都遇到过同一个尴尬:模型框架搭好了,气象、地形、植被数据也凑齐了,唯独土壤侵蚀强度这张底图找不到能直接用的栅格。要么是分辨率太粗,要么是坐标系对不上,要么是分类标准和自己手头的项目对不齐。这份全国土壤侵蚀栅格数据,解决的正是这个卡脖子环节——它把全国尺度的土壤侵蚀强度按栅格组织好,落到 GIS 里就能参与叠加分析、统计出表和专题制图。适合做区域水土流失评价、生态红线划定、国土空间规划前期本底调查的从业者,也适合刚接触水土流失数据、想拿一份完整底图练手的新人。下面按“这份数据是什么、怎么用起来、哪里容易翻车”的顺序拆开讲。
2. 土壤侵蚀栅格数据的组织逻辑与选型理由
2.1 为什么是栅格而不是矢量
土壤侵蚀本质上是连续面状现象,坡面产流、泥沙输移在空间上是渐变的,用矢量多边形去表达会人为制造边界突变。栅格结构天然适合做像元级的侵蚀模数计算,也方便和 DEM、NDVI、降雨侵蚀力这些同样栅格化的因子做逐像元运算。这份数据采用栅格组织,意味着你可以直接把它和坡度栅格、土地利用栅格放进同一个分析流程,不需要先做矢量转栅格的预处理。另一个现实原因是,全国尺度的矢量侵蚀图斑往往碎到几十万个,打开就卡,而栅格在同等信息量下文件更小、渲染更快。
2.2 侵蚀强度分级与编码含义
土壤侵蚀数据通常按侵蚀强度分级组织,从微度、轻度、中度、强烈、极强烈到剧烈,每一级对应一个整型编码。这种编码方式的好处是既能做分类统计,也能通过重分类映射成侵蚀模数区间参与定量计算。拿到数据后第一件事不是急着出图,而是确认编码表:哪个值代表微度,哪个值代表剧烈,有没有把水体、建设用地、裸岩单独编码。常见做法是配一个颜色映射表,让分级在图上直观可读。如果编码含义搞错,后面所有统计都是错的,这是血泪经验里最常见的一类翻车。
2.3 坐标系与分辨率的前置确认
全国尺度栅格数据一般会采用地理坐标系(如 CGCS2000)或投影坐标系(如 Albers 等积投影)。做面积统计必须用等积投影,否则高纬度地区面积会被严重拉伸。分辨率方面,全国侵蚀数据常见的是 1km 或更粗的格网,具体以数据实际元数据为准。使用前用 GIS 软件查看图层属性里的坐标系和像元大小,确认和你项目其他数据一致。如果不一致,先做投影变换再叠加,不要指望软件自动对齐——自动对齐经常在背后做重采样,把分类数据插值成小数,侵蚀等级就废了。
3. 把侵蚀栅格接进 GIS 与统计流程
3.1 加载数据与检查元信息
第一步永远是先看清数据本身。用 QGIS 或 ArcGIS 加载栅格后,打开图层属性,重点看坐标系、像元大小、行列数、NoData 值。下面这段用 Python 的 rasterio 读取元信息,适合批量检查多个栅格。
import rasterio # 打开侵蚀栅格,只读模式 with rasterio.open("soil_erosion.tif") as src: print("坐标系:", src.crs) # 确认是地理还是投影坐标 print("像元大小:", src.res) # 分辨率,决定分析尺度 print("行列数:", src.height, src.width) # 栅格尺寸 print("波段数:", src.count) # 侵蚀数据通常单波段 print("NoData:", src.nodata) # 无效值,统计前必须排除 print("数据类型:", src.dtypes) # 整型才适合做分级统计逻辑说明:rasterio 打开文件不把整幅影像读进内存,适合先探元信息。参数上,src.crs告诉你坐标系,src.res是像元宽高,src.nodata决定统计时哪些像元要剔除。如果src.dtypes返回浮点型,说明这份数据可能已经被重采样过,需要警惕分类等级是否还准确。
3.2 按行政边界裁剪与分区统计
全国数据直接统计意义不大,通常要裁到省、市、流域或者项目区。裁剪时用矢量边界做掩膜,保持栅格分类值不变。下面示例用 rasterio 的 mask 按矢量范围裁剪。
import rasterio from rasterio.mask import mask import geopandas as gpd # 读取项目区矢量边界 boundary = gpd.read_file("project_area.shp") geoms = [geom for geom in boundary.geometry] with rasterio.open("soil_erosion.tif") as src: # 按矢量范围裁剪,crop=True 收紧输出范围 out_image, out_transform = mask(src, geoms, crop=True) out_meta = src.meta.copy() out_meta.update({ "height": out_image.shape[1], "width": out_image.shape[2], "transform": out_transform }) # 写出裁剪结果 with rasterio.open("erosion_clip.tif", "w", **out_meta) as dest: dest.write(out_image)逻辑说明:mask函数把矢量范围外的像元设为 NoData,范围保留原值。crop=True让输出栅格紧贴矢量外接矩形,减少空像元。参数out_meta继承原坐标系和数据类型,保证分类值不被改变。裁剪完成后,用分区统计工具按行政区汇总各侵蚀等级像元数,再乘以像元面积得到各级面积。
3.3 侵蚀等级面积汇总
分类栅格的统计核心是“数像元”。每个等级有多少像元,乘以单个像元面积,就是该等级占地面积。下面用 numpy 做快速统计。
import rasterio import numpy as np with rasterio.open("erosion_clip.tif") as src: data = src.read(1) # 读第一波段 nodata = src.nodata pixel_area = abs(src.res[0] * src.res[1]) # 单像元面积 # 排除 NoData valid = data[data != nodata] if nodata is not None else data.ravel() # 统计各等级像元数 values, counts = np.unique(valid, return_counts=True) for v, c in zip(values, counts): print(f"等级 {v}: {c} 个像元, 面积 {c * pixel_area:.2f}")逻辑说明:np.unique返回每个等级值和对应像元数,pixel_area是像元面积。注意如果坐标系是地理坐标,src.res单位是度,算出的“面积”不是平方米,必须先投影到等积坐标系再统计。这一步是新手最容易忽略的坑,直接拿度当米算,结果差好几个数量级。
4. 避坑与常见问题排查
4.1 现象:统计面积明显偏小或偏大
原因:坐标系是地理坐标,像元面积按度计算,没有换算成实际面积。解决:先用投影工具把栅格转到等积投影(如 Albers),再重新统计。判断方法很简单,看src.crs是不是经纬度单位。
4.2 现象:裁剪后侵蚀等级出现小数
原因:裁剪或对齐过程中触发了重采样,分类栅格被双线性或立方插值。解决:所有涉及分类栅格的操作,重采样方法一律选最近邻(nearest),保证等级值不被篡改。在 ArcGIS 里是环境设置中的重采样选项,在 QGIS 里是裁剪工具的采样方式。
4.3 现象:NoData 被当成一个侵蚀等级统计进去
原因:NoData 值恰好是某个整数,统计时没排除。解决:统计前先读src.nodata,用掩膜排除。如果数据没有声明 NoData,常见做法是把明显异常的值(如 -9999 或 0 之外的极端值)手动设为无效。
4.4 现象:和其他栅格叠加时对不齐
原因:两幅栅格分辨率或原点不一致,软件自动对齐时做了重采样。解决:以侵蚀栅格为基准,把其他栅格重采样到相同分辨率和范围,再叠加。不要反过来把分类栅格重采样去迁就别的数据。
4.5 现象:打开数据一片空白或全黑
原因:多半是拉伸方式问题,分类栅格的像元值范围很小,默认拉伸把值压到一端。解决:在符号化里改成唯一值渲染,按等级配色,不要用连续拉伸。这不是数据坏了,是显示设置的问题。
5. 进阶用法:把侵蚀等级转成侵蚀模数参与定量评价
分类栅格只能告诉你“哪里强哪里弱”,要做土壤流失方程或者生态服务价值评估,往往需要侵蚀模数这种连续值。常见做法是给每个侵蚀等级赋一个模数区间中值,重分类成连续栅格。下面用 numpy 做映射。
import rasterio import numpy as np # 侵蚀等级到模数中值的映射,单位 t/(km2·a) # 具体区间以项目采用的分类标准为准 mapping = { 1: 200, # 微度 2: 1000, # 轻度 3: 3000, # 中度 4: 6000, # 强烈 5: 10000, # 极强烈 6: 15000 # 剧烈 } with rasterio.open("erosion_clip.tif") as src: data = src.read(1) meta = src.meta.copy() # 构建映射数组,未定义等级保持 0 out = np.zeros_like(data, dtype="float32") for level, value in mapping.items(): out[data == level] = value meta.update(dtype="float32") with rasterio.open("erosion_modulus.tif", "w", **meta) as dest: dest.write(out, 1)逻辑说明:mapping字典把整型等级映射成模数中值,out用浮点型存储。参数上,模数区间取值必须和你引用的分类标准一致,不同标准区间差别很大,不能随手填。映射完成后,这份连续栅格就能参与土壤保持量估算、泥沙输移比计算等定量模型。
验证映射是否正确,有个笨但有效的办法:把重分类后的栅格和原始分类栅格并排打开,随机点几个位置,看模数值是否落在对应等级的区间内。我一般还会统计重分类前后的像元总数,确认没有像元在映射中丢失。从那以后我每次做等级到模数的转换,都强制走一遍“并排比对 + 总数核对”,再急也不跳过。希望帮到你。
本文还有配套的精品资源,点击获取