资讯详情

SoilGrids基岩深度数据在InVEST产水模型中的应用与处理全流程

📅 2026/10/5 7:40:17 | 华诺云谱 👁 阅读
SoilGrids基岩深度数据在InVEST产水模型中的应用与处理全流程
两年前我第一次正经跑InVEST产水模型卡住我的不是降水、不是蒸散发而是看起来最不起眼的根系限制深度root_restricting_depth。从网上下了一堆土壤图要么是离散多边形只有几个固定深度等级要么分辨率粗到没法用最后救场的是ISRIC World Soil Information提供的250米基岩深度栅格数据。这套数据配合InVEST产水模型的完整处理流程我前前后后跑了好几轮踩了不少坑这篇把从下载、裁剪、单位换算到模型输入的细节一次性说清楚。1. 基岩深度是个什么参数产水模型为什么非它不可1.1 从Water Yield公式看根系深度的影响InVEST的产水模型Water Yield本质是站在流域水量平衡的角度估算每个像元年实际产水量。模型核心公式并不复杂Y(x) [1 - AET(x) / P(x)] × P(x)P(x)是年降水AET(x)是年实际蒸散发。真正决定AET怎么从P里分走是模型里的一个中间量ω它的表达式里直接带着根系深度ω Z × (AWC × N / PET) 1.25这里的N就是根系限制深度单位是mm。AWC是植被可利用水含量PET是年潜在蒸散发Z是季节常数。所以N不是可有可无的边角料它直接进入指数项影响AET/P的比值。N越大土壤能给植物用的水就越多实际蒸散发就越接近潜在蒸散发产水量就往下掉。我做过一个对比测试在降水800mm、PET 1100mm、AWC 0.15的条件下把根限制深度从500mm改成1500mm径流系数直接从0.28掉到0.19。这么大的变化对生态补偿、水资源规划来说完全是两个结论。你填进去的数据质量最终会实打实反映在产水量空间分布上。1.2 为什么国内传统土壤图在这个场景下不够用做水资源调查经常用的1:100万中国土壤图属性是多边形矢量。它把全国划分成几千个土壤类型区深度被归并成几个等级拿来做大尺度土壤制图展示没问题但喂给InVEST这种栅格模型就有明显短板深度是离散等级要么“薄层土”要么“中层土”同一多边形里所有像元深度完全相同产水量的空间异质性被抹掉了。多边形边界和实际地形、植被的交界往往对不上在山地尤其明显。矢量转栅格时字段选择、栅格化算法都会引入额外误差你很难分辨产水的差异是真实地形引起的还是数据加工造成的。InVEST是逐像元计算的它缺的是一张连续的、每个像元都有具体深度值的栅格。ISRIC这套250米基岩深度数据正好补上这个空缺。1.3 ISRIC World Soil Information的定位ISRICInternational Soil Reference and Information Centre是全球土壤数据最权威的来源之一World Soil Information是它的数据服务品牌。通过SoilGrids平台发布的土壤属性预测栅格覆盖全球陆地分辨率做到250米属性包括有机碳、pH、沙粒含量、有效含水量、土壤深度和基岩深度等。基岩深度Depth to Bedrock是模型最需要的产物之一因为它直接定义了植物根系向下生长的物理上限。InVEST官方手册里对root_restricting_depth的建议就是“用土壤深度或基岩深度取更限制的那个”。这套数据全球统一标准、空间连续、分辨率够用而且开放下载对我们做中国区域产水模型非常友好。2. 这份250米栅格数据的硬指标坐标系、单位、波段和精度来源2.1 核心文件与波段含义在SoilGrids的数据列表里基岩深度相关的文件主要看这几个。官方命名逻辑是“属性_方法_分辨率_版本”我实际下载时最常用的文件是文件名关键字含义单位BDRICM_M_250m预测的基岩绝对深度Absolute depth to bedrock即地表到基岩面的垂直厚度cmBDRICM_M_250m_M上面这条预测值的模型标准差cmBDRLOG_M_250m基岩在一定深度范围内出现的概率Probability of occurrence of bedrock百分比官方目录里可能还有1km_coverage等旧版本优先选250m规格。BDRICM是我们要拿来建模的主数据BDRLOG用于判断某一像元下方基岩出现的可能性SD波段用来评估不确定度。有一个很容易混淆的点文件名里的M_250m是分辨率不是单位。数据值仍然是厘米模型里要求毫米后面换算时不要搞错。2.2 坐标系统、分辨率与实际范围这套栅格原始投影是WGS84地理坐标EPSG:4326名义分辨率250米在赤道附近对应的像元尺寸约0.00208度。到中国中纬度地区北纬30—40度按经度方向实际地面宽度会缩到200米左右这是地理坐标栅格的正常现象不影响InVEST使用只要所有输入栅格保持一致就行。下载时注意覆盖范围中国区域大致跨东经73到135度、北纬18到54度。官网按全球瓦片提供时中国区域需要下载大约3×6个瓦片不同tile之间偶尔会出现0.5个像元的偏移本地拼接时要用gdal_merge先瓦片合并再做其他处理单纯全部导入ArcGIS/QGIS再导出的结果有时边缘会对不齐。NoData值的设置也值得检查。老版本陆地有效值范围通常是1到250cmNoData用-9999或者255表示新COG版本可能用0表示无效。拿到数据第一件事就是用gdalinfo看一眼值和NoData定义不要直接套模型。2.3 SoilGrids模型是怎么训练出来的SoilGrids 2.0的基岩深度预测是基于全球几十万个土壤剖面观测数据叠加遥感地形因子DEM坡度、曲率、地形湿度指数、气候变量降水、温度和植被因子用随机森林回归模型训练出来的。每个像元输出的是模型的平均预测值配套标准差文件反映模型在该像元的不确定性。这意味着精度分布并不均匀。欧洲、北美观测点密集预测可信度高中国境内观测点相对稀疏尤其高原山区预测值可能偏平滑。使用时不建议把某个像元的深度当成“实测值”它更适合代表区域尺度上的基岩深度趋势。如果研究区有钻孔资料建议随机抽几百个点做对比校正后面我会专门讲验证方法。3. 数据落地从ISRIC官网到本地拼接裁剪3.1 官网瓦片下载路径官网下载有两种路径。一种是直接在SoilGrids下载页面找到Depth to bedrock的250m GeoTIFF按经纬度网格下载瓦片。这个方式直观但中国区域跨越多个瓦片逐个下载容易漏下载时长也受网络影响。我当时是按tile手动下载的非常痛苦。后来发现可以直接用Cloud Optimized GeoTIFFCOG版本用支持COG的软件只读取需要范围的像元省去下载全图。不过国内访问国外数据服务COG直读有时不稳定文件又大传输中断了还得重来。3.2 用Google Earth Engine一步导出后来我换成Google Earth EngineGEE导出这是目前最推荐的方式。SoilGrids数据在GEE公共数据目录里有收录用下面这段脚本直接按中国边界裁剪导出一次搞定// 选择ISRIC SoilGrids基岩深度预测图层以官方目录实际ID为准 var bedrock ee.Image(projects/soilgrids-isric/bdrichm_m_250m_1km); // 区域边界可以用GEE内置行政区划也可以上传自己的shp var china ee.FeatureCollection(FAO/GAUL/2015/level0) .filter(ee.Filter.eq(ADM0_NAME, China)); // 裁剪并导出 Export.image.toDrive({ image: bedrock.select(0).clipToCollection(china), description: china_bedrock_cm, folder: soilgrids, region: china.geometry(), scale: 250, crs: EPSG:4326, maxPixels: 1e13 });导出后得到的是WGS84坐标、单位cm的单波段GeoTIFF。如果不想用GEE内置边界建议上传你自己的研究区矢量后面省一次裁剪。GEE默认会把海洋区域的无效像元导出为NoData只要下载后稍微处理干净就能用。提示GEE公共目录里同一数据可能同时存在多个版本选最新的COG版本即可。如果脚本报错优先检查数据集ID是否匹配当前目录名。3.3 本地合并、裁剪和投影转换全命令不管从哪条路拿到数据本地最好统一走一遍GDAL流程。以官网逐瓦片下载为背景流程是先合并再按研究区裁剪最后根据需要重投影。命令如下# 1. 合并所有瓦片统一NoData为-9999 gdal_merge.py -o bedrock_china_raw.tif \ -a_nodata -9999 \ -co COMPRESSDEFLATE \ BDRICM_M_250m_*.tif # 2. 按矢量边界裁剪 gdalwarp -t_srs EPSG:4326 \ -cutline study_area.shp \ -crop_to_cutline \ -tr 0.002083333333333333 -r near \ -dstnodata -9999 \ bedrock_china_raw.tif \ bedrock_study_area.tif # 3. 快速检查统计信息 gdalinfo -stats bedrock_study_area.tif这里-tr设置输出分辨率0.00208333度大约对应250米。如果你的研究区投影是UTM或Albers把-t_srs换成对应EPSG编号gdalwarp会自动完成重采样。重采样方法默认near因为深度是连续数值如果后续要平滑处理可以用bilinear但分类用途务必用near保持原始语义。GEE导出的数据已经裁剪过中国范围第二步的-cutline换成研究区shp就行。如果是直接用COG读取命令可以简化成一次gdalwarp完成裁剪和投影。3.4 下载后的第一轮检查处理完先别急着进模型做三件事查数值范围用gdalinfo -stats看min/max。正常情况cm值在1到250之间如果出现0要确认是有效值基岩出露还是NoData。查空间范围和降水面、土地覆盖面叠一次图确认范围完全覆盖研究区不能有缝隙。查NoData定义不同来源的tile可能NoData值不一致合并前统一指定-a_nodata合并后再验证一次。4. 改造成InVEST的root_restricting_depth单位、叠加逻辑和掩膜4.1 厘米到毫米的换算InVEST产水模型里所有深度单位要求毫米。SoilGrids基岩深度给的是cm所以第一步是乘以10。用GDAL计算最快gdal_calc.py -A bedrock_study_area.tif \ --outfileroot_depth_mm.tif \ --calcA*10 \ --NoDataValue-9999这一步很多人忽略把cm直接填进模型最终产水量会差出几个量级。我见过有同行把基岩深度填成250cm模型直接认为所有区域根深2500mm高原草甸区域产水量被低估得非常明显。4.2 根限制深度到底取哪个基岩、土壤深度还是植被类型这是数据改造里最需要想清楚的一步。InVEST手册里的root_restricting_depth官方定义为“限制根系下扎的土层深度”实际操作中通常有两条路线保守路线直接用基岩深度。适合基岩埋深浅、土壤层薄的山地因为模型里根再深也穿不过基岩。综合路线在基岩深度和土壤深度之间取小值同时考虑植被的最大根深。比如农田作物根系一般只有300-800mm即便基岩在10米以下根限制深度也不该填10000mm。所以我实际处理时一般分两步。先用gdal_calc叠加土壤深度和基岩深度# soil_depth_mm.tif为土壤剖面深度mm与基岩深度取最小值 gdal_calc.py -A root_depth_mm.tif -B soil_depth_mm.tif \ --outfileroot_depth_min.tif \ --calcminimum(A,B) \ --NoDataValue-9999之后再看土地利用类型。大片森林区域基岩通常很深直接把上面算出的深度拿来用问题不大农田和草原区域建议再叠加一个最大根深约束防止干旱区有些异常像元把根深推得过高。4.3 沿海与NoData掩膜中国沿海岛屿、滩涂区域经常出现NoData。InVEST遇到NoData会自动跳过但如果你用“统计所有像元”的方式验证总量NoData会把结果压低。建议在进入模型前把所有输入栅格的NoData统一成交叉一致的掩膜。最简单的做法是找一张绝对干净的掩膜栅格比如研究区土地覆盖陆地部分有值水域为NoData用gdal_calc对所有输入做一次相乘gdal_calc.py -A root_depth_min.tif -B mask.tif \ --outfileroot_depth_final.tif \ --calcA*B \ --NoDataValue-9999这样有效像元范围和多边形边界完全对齐模型跑出来不会因为数据范围不一致出现大片空白。4.4 分辨率对齐与像元对齐InVEST不会自动帮你重采样。降水、PET、地形指数、根深栅格如果分辨率不一致模型要么报错要么按第一个输入作为基准其他栅格被静默重采样这会造成人为位移。我在预处理时会把全部栅格统一到同一个模板选择分辨率约250m或你研究区适合的尺度统一WGS84投影统一NoData值统一行列数。用gdalwarp加-te参数指定模板范围能保证输出严格对齐gdalwarp -t_srs EPSG:4326 \ -te 73 18 135 54 \ -tr 0.002083333333333333 0.002083333333333333 \ -r bilinear -dstnodata -9999 \ input.tif output_aligned.tif这里的-tetarget extent填研究区的实际范围-tr填统一分辨率。所有输入栅格都用同一组-te和-tr就能保证行列完全一致。5. 跑通InVEST产水模型之前的参数核对清单5.1 全套输入文件速览InVEST官网Natural Capital Project可以下载模型和完整手册第一次用的话强烈建议把用户手册离线存一份。Water Yield模型需要的输入如下参数格式说明降水Precipitation栅格年降水量单位mm研究区全覆盖潜在蒸散发PET栅格年参考蒸散发单位mm植被可利用水AWC栅格植物可利用含水量0~1之间土地利用/覆盖LULC栅格属性表需有LULC代码和对应的根系深度根系限制深度root_restricting_depth栅格就是我们前面处理出的root_depth_final.tif地形指数Topographic Index栅格无单位季节常数Z数值区域降水季节性默认值即可蒸散系数Kc属性表各LULC类型的蒸散系数最大根系深度属性表各LULC类型的最大根深mm子流域可选矢量用于分流域统计5.2 六个高频踩坑点单位错乱根深用cm直接填、降水用cm填、AWC用百分比填这三是排名前三的错误。统一用模型手册规定单位宁可预处理多花时间。覆盖范围不一致有的栅格多出一圈有的缺一角模型默认按对齐范围计算跑出来的边界会对不上。处理方式就是前面说的所有栅格统一到同一个-te范围。NoData值冲突最多见的是某个输入用0当NoData另一个用-9999InVEST会把0误判成有效值。预处理阶段把NoData定义统一。投影没统一WGS84和其他投影混着提交模型会在后台用默认参数重投影结果经常出现网格偏移。预处理统一投影最简单。LULC属性表没接好属性表里必须有LULC_Code和对应的Kc、root_depth字段字段名和手册不一致会导致模型直接报错。PET出现0值部分高纬或研究区边界如果PET为0公式里ω会出现除零模型报错。用一个小值替换或者增强掩膜处理。5.3 模型输出的合理性检查跑完模型先别急着出图。打开产水栅格的直方图连做三个判断数值是否落在合理区间产水量一般在0到降水总量之间不会出现负值也不该出现远超降水的异常值。空间格局是否符合常识湿润山地、河谷产水应该偏高干旱盆地、农田灌区产水偏低。如果出现完全相反的空间分布回头检查根深和AWC数据。与实测径流对比如果研究区有水文站实测径流把流域内模型产水总量换算成径流深和实测多年平均径流深对比误差一般在±20%以内就算合格差太多优先怀疑PET和Z参数。6. 这几年的实测体会数据在哪里好用哪里要小心6.1 华南喀斯特地区基岩面高度起伏别盲信单个像元喀斯特地区岩石出露多、溶沟溶槽密集250米像元内的基岩深度可能从几十厘米突变到几十米。SoilGrids的预测值只能反映宏观趋势我在广西某小流域对比了20多个钻孔发现部分像元预测深度和实际钻孔相差超过2米。这类区域建议把基岩深度和BDRLOG概率波段结合用基岩概率低的像元可以适当放宽根深概率高的像元直接按较浅深度处理。更重要是配合土地利用调整最大根深因为喀斯特的植被多为浅根灌丛实际根深上限远小于基岩深度。6.2 青藏高原和西北干旱区整体可用注意冰川和戈壁青藏高原地广人稀土壤剖面观测点非常少预测结果整体偏平滑但宏观的“高原边缘深—高原腹地浅”趋势是准的。冰川覆盖区、戈壁滩这些非土壤区数据会有极端浅或无深度值处理时最好另做掩膜。我在那曲附近的一个子流域里把冰川像元直接换成了NoData产水统计更贴近实际。6.3 东部平原农耕区数据最稳直接可用华北平原、东北平原、长江中下游这些区域地势平坦、土壤发育深厚、观测点多预测值和实际钻孔对比误差通常在20%以内。这些区域真正限制产水的不是基岩深度而是地下水位和农田灌溉模型跑出来的产水偏自然状态用于对比研究没问题用于指导田块尺度决策要谨慎。6.4 质量验证的三板斧每次换研究区我固定用三个方法评估这套数据是否可靠gdalinfo -stats检查最小值、最大值、均值和标准差如果均值异常高或标准差过大先怀疑数据质量或坐标问题。随机点对比钻孔资料在ArcGIS/QGIS里随机生成300个点提取基岩深度值与研究区已有的水文地质钻孔、土壤详查剖面逐点对比计算平均绝对误差。误差在30%以内可以放心用超过50%就需要考虑是否用其他数据修正。不确定性波段叠加把BDRICM_M_250m_M标准差波段渲染出来标准差大的区域通常在山地、河谷做结果时要留有解释余地标准差小的区域平原台地可以作为结论的支撑区域。最后再分享一个处理技巧如果你下载的是多瓦片数据合并时先统一NoData再拼不要用软件默认的自动拼接否则相邻瓦片重叠区域的像元值可能会出现不连续。我之前在贵州某个项目里没注意这个问题两个瓦片交界处产水图出现了一条肉眼可见的“缝合线”排查了半天才发现是瓦片合并时NoData没统一导致边界像元做了异常插值。短短一个预处理小细节往往决定了最后成果能不能见人。希望这篇能帮你少走这段弯路。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑