ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

中国30米土壤类型数据:GIS空间分析实战指南

中国30米土壤类型数据:GIS空间分析实战指南

简介:本资源提供中国全域30米分辨率土壤类型栅格数据集,配套完整土壤类型代码表,面向GIS专业人员、农业遥感研究者、生态环境建模工程师及高校地信/农林/环境学科师生,支撑土壤资源评估、精准农业规划、水土保持分析与国土空间生态修复等实际应用。压缩包共15个文件,含2个核心.tif栅格影像(分别覆盖东三省与全国其余地区)、2个.xlsx与.dbf属性表(含土壤分类编码、名称及层级关系)、2个.xml元数据与2个.tfw地理配准文件,辅以.ovr金字塔、.cpg字符编码及.lock锁文件,确保在ArcGIS、QGIS等平台中可直接加载、属性查询与空间分析。资源大小249.54MB,结构规范、开箱即用。目前已有130人学习下载,用户可直接获取高精度空间化土壤分类成果、标准化代码映射关系及分区域组织的栅格数据结构,显著降低数据预处理门槛,提升科研与项目实施效率。

1. 中国土壤类型数据30m分辨率数据:不是“高清图”,而是能直接进ArcGIS/QGIS做空间分析的生产级栅格底图

你手头有一份标着“30m分辨率”的中国土壤类型数据,但导入QGIS后发现属性表里全是数字代码、没有中文分类名;用Raster Calculator做土壤侵蚀敏感性分区时,字段连接总报错;甚至在ArcMap里右键→Properties→Symbology选“Unique Values”却只显示一片灰——这不是数据坏了,是没配对那份关键的「土壤类型代码表」。这份资源真正价值不在像素密度,而在于它是一套可闭环使用的空间语义体系:30m栅格提供空间位置精度,配套代码表赋予每个像元明确的土壤学含义(如“暗棕壤”“褐土”“红壤”),二者缺一不可。它适合做省级尺度的农业适宜性评价、水土保持规划、生态修复本底调查,也适合作为遥感反演模型的验证标签。如果你正卡在“有图无义”“有码无解”的阶段,这份带完整代码映射关系的数据包就是那个能让你从“看图说话”升级到“按规建模”的关键跳板。


2. 数据结构解析:栅格文件 + 代码表 + 元数据三件套的硬核组成逻辑

2.1 栅格文件:TIFF格式与地理参考信息的强制绑定

这份30m分辨率数据以GeoTIFF格式交付(.tif),而非JPEG或PNG这类纯视觉格式。这意味着每个像元不仅存有数值(土壤类型代码),还内嵌了WGS84坐标系下的地理参考信息(Georeferencing)。用GDAL命令行可快速验证其空间完整性:

gdalinfo china_soil_30m.tif

输出中必须包含以下关键字段:

  • Coordinate System:应为GEOGCS["WGS 84",DATUM["WGS_1984",...]]或PROJCS["China_Lambert_Conformal_Conic",...](若为投影坐标系);
  • Origin:左上角经纬度或平面坐标;
  • Pixel Size:应为(0.00027777777777777778, -0.00027777777777777778)(对应30m在赤道处的弧度近似值);
  • Band 1:NoData Value通常设为-9999或0,需与代码表中的无效值定义一致。

提示:若gdalinfo显示Coordinate System is 'Unknown',说明地理参考丢失,需用gdal_edit.py -a_srs EPSG:4326 china_soil_30m.tif强制写入WGS84,否则后续所有空间叠加分析都会偏移。

2.2 土壤类型代码表:CSV/Excel中的字段映射是分析链路的“翻译官”

代码表(通常命名为soil_type_codebook.csv或soil_code_mapping.xlsx)是整套数据的灵魂。它绝非简单编号对照,而是包含至少5个核心字段:

字段名示例值说明
SOIL_CODE211栅格像元中存储的整型值,必须与TIFF中实际值完全一致(注意:部分版本用字符串存储,需统一转为int)
SOIL_NAME_CN暗棕壤中文土壤名称,用于制图标注和报告输出
SOIL_NAME_ENDark Brown Forest Soil英文名称,方便国际协作或模型接口调用
TEXTURE_CLASSLoam质地分类(砂土/壤土/黏土),支撑物理过程模拟
ORDER_LEVEL2分类层级(1=土纲,2=亚纲,3=土类),决定分析粒度

常见错误是直接用Excel打开CSV后手动修改SOIL_NAME_CN列——这会破坏编码(如UTF-8 BOM头丢失),导致QGIS加载时中文乱码。正确做法是用VS Code以UTF-8无BOM编码保存,或用Python脚本清洗:

import pandas as pd df = pd.read_csv('soil_type_codebook.csv', encoding='utf-8') # 强制重置索引并清理空格 df['SOIL_CODE'] = df['SOIL_CODE'].astype(str).str.strip() df['SOIL_NAME_CN'] = df['SOIL_NAME_CN'].str.strip() df.to_csv('soil_code_clean.csv', index=False, encoding='utf-8-sig') # 保留BOM兼容Windows

2.3 元数据文件:.xml或.txt里的隐藏参数决定能否复现结果

元数据(metadata.xml或README.txt)常被忽略,但它规定了数据生产的法律边界和技术约束。重点核查三项:

  • 生产时间:如2020年全国土壤普查成果,意味着该数据不包含2020年后土地利用变更(如退耕还林新增林地);
  • 分类体系:明确采用《中国土壤系统分类》(CST)还是《中国土壤分类系统》(CSS),二者代码不互通(例:CST中211=暗棕壤,CSS中211可能指褐土);
  • 精度声明:若写明“县级尺度制图精度≥85%”,则省级汇总分析可信,但乡镇级抽样验证需谨慎。

3. QGIS实操:从加载栅格到生成带中文图例的专题地图

3.1 加载与坐标系校验:两步确认数据“站得稳”

  1. 在QGIS中拖入china_soil_30m.tif,右键图层→Properties→Information,检查CRS是否为EPSG:4326(WGS84)或EPSG:4490(CGCS2000);
  2. 若CRS显示<not set>,点击Set CRS for Layer→搜索4326→确定;
  3. 关键验证:打开Project Properties→CRS→启用Enable 'on the fly' CRS transformation,再添加一个已知坐标的点图层(如省会城市经纬度CSV),确认土壤图与点位空间对齐。

注意:若使用CGCS2000坐标系(EPSG:4490),务必在项目设置中将CRS设为同一编码,否则叠加行政边界时会出现数百米偏移——这是国产数据最常见的“隐形坑”。

3.2 关联代码表:用Join Attributes by Field Value打通语义

QGIS无法直接读取栅格属性表,需通过虚拟字段+连接实现代码到名称的映射:

  1. 右键土壤栅格图层→Properties→Fields→点击+号添加虚拟字段;
  2. 字段名填soil_name,类型选Text (string),表达式写:
    attribute( get_feature('soil_codebook', 'SOIL_CODE', to_string("raster_value")), 'SOIL_NAME_CN' )
    (前提:先将soil_code_clean.csv作为矢量图层加载,并命名为soil_codebook)
  3. 点击OK后,图层属性表中将出现soil_name列,每个像元对应其中文名。

3.3 渲染专题地图:用Categorized渲染器生成可出版级图例

  1. 图层样式面板→Symbology→Categorized→Value字段选soil_name;
  2. 点击Classify,QGIS会自动按唯一值分组;
  3. 关键操作:双击每个类别色块→Change...→在Color中选择符合土壤学惯例的配色(如红壤用红色系、黑土用深灰色系),避免彩虹色(rainbow)——它会误导对土壤连续性的判断;
  4. 导出时勾选Export→Save As Image,分辨率设为300 DPI,确保印刷清晰。

4. ArcGIS Pro工作流:批量提取县域土壤类型统计表

4.1 准备行政边界:用Feature to Raster对齐空间基准

ArcGIS Pro中,土壤栅格与县级边界(.shp)必须在同一坐标系且像元对齐,否则Zonal Statistics结果失真:

  1. 右键县级边界图层→Data→Export Features→输出为新要素类;
  2. Spatial Analyst Tools→Conversion→To Raster→Feature to Raster:
    • Input Features:导出的县级边界;
    • Field:选COUNTY_ID(唯一标识字段);
    • Cell Size:设为30(与土壤栅格严格一致);
    • Output Coordinate System:设为与土壤栅格相同的坐标系(如WGS84);
  3. 输出的county_raster.tif将作为Zonal Statistics的区域掩膜。

4.2 执行分区统计:Zonal Statistics as Table生成结构化结果

  1. Spatial Analyst Tools→Zonal→Zonal Statistics as Table:
    • Input raster or feature zone data:county_raster.tif;
    • Zone field:Value(默认字段);
    • Input value raster:china_soil_30m.tif;
    • Statistics type:选MAJORITY(获取每个县面积占比最大的土壤类型);
    • Output table:指定路径(如soil_majority_by_county.dbf);
  2. 用Table To Excel工具将DBF转为Excel,再通过VLOOKUP关联代码表获取中文名。

4.3 高级应用:用Reclassify构建土壤功能指数

例如计算“耕地适宜性指数”,需按质地和肥力分级:

  1. Spatial Analyst Tools→Reclass→Reclassify:
    • Input raster:china_soil_30m.tif;
    • Reclassification:手动映射(示例):
      Old ValuesNew ValuesDescription
      211, 2128暗棕壤/白浆土(高肥力)
      311, 3125褐土/潮土(中等肥力)
      411, 4122红壤/黄壤(低肥力,需改良)
  2. 输出栅格可直接参与加权叠加分析(Weighted Overlay),支撑国土空间规划。

5. 避坑指南:五个让GIS老手也翻车的典型问题

5.1 现象:QGIS中土壤图显示为全黑或全白

原因:栅格数据的NoData值未被正确识别,QGIS默认将0或-9999渲染为黑色背景。
解决:右键图层→Properties→Symbology→Min / Max值范围改为Cumulative count cut (2%),或手动设置Min为1、Max为最大土壤代码值(如500),再勾选Render nodata values as transparent。

5.2 现象:ArcGIS中Zonal Statistics报错“ERROR 000864: Input raster: The input is not within the defined domain.”

原因:土壤栅格与县域栅格的坐标系虽同名(如都叫WGS84),但椭球体参数不同(如WGS84 vs GCS_WGS_1984),导致空间匹配失败。
解决:用Project Raster工具统一重投影,目标坐标系选WGS 1984(EPSG:4326),地理变换选WGS_1984_(ITRF00)_To_WGS_1984。

5.3 现象:代码表中SOIL_CODE为字符串(如"211"),但栅格像元值为整数211,连接后全部为空

原因:QGIS的get_feature函数要求字段类型严格匹配,字符串与整数无法关联。
解决:在代码表中新增字段CODE_INT,用字段计算器填入to_int("SOIL_CODE");或在连接表达式中改用to_string(to_int("raster_value"))。

5.4 现象:导出PDF地图时中文图例显示为方框

原因:QGIS默认字体不支持中文字体,且未嵌入字体。
解决:Settings→Options→Fonts→将Default font设为SimSun或Noto Sans CJK SC;导出PDF时勾选Embed fonts in output file。

5.5 现象:用Raster Calculator计算"soil" == 211返回全0栅格

原因:栅格数据类型为Float32,而代码是整数,浮点精度导致比较失效。
解决:先用Int函数转换数据类型:Int("soil@1") == 211,或改用Con函数:Con("soil@1" == 211, 1, 0)。


6. 进阶技巧:用Python自动化完成“代码表→栅格→统计→报告”全链路

6.1 用rasterio+geopandas实现县域统计(替代ArcGIS License依赖)

import rasterio import geopandas as gpd import numpy as np import pandas as pd # 1. 读取土壤栅格 with rasterio.open('china_soil_30m.tif') as src: soil_array = src.read(1) # 读取第一波段 transform = src.transform crs = src.crs # 2. 读取县级边界(需与栅格同CRS) counties = gpd.read_file('county_boundary.shp').to_crs(crs) # 3. 对每个县进行掩膜统计 results = [] for idx, row in counties.iterrows(): # 创建掩膜 mask = rasterio.features.geometry_mask( [row.geometry], out_shape=soil_array.shape, transform=transform, invert=True ) # 提取该县像元值 values = soil_array[mask] # 统计众数(面积最大土壤类型) majority = pd.Series(values).mode().iloc[0] if len(values) > 0 else -9999 results.append({ 'COUNTY_ID': row['COUNTY_ID'], 'SOIL_CODE': majority }) # 4. 关联代码表生成中文名 codebook = pd.read_csv('soil_code_clean.csv') result_df = pd.DataFrame(results).merge( codebook[['SOIL_CODE', 'SOIL_NAME_CN']], on='SOIL_CODE', how='left' ) result_df.to_excel('soil_by_county.xlsx', index=False)

6.2 用Jupyter Notebook生成交互式土壤分布热力图

import folium from folium.plugins import HeatMap import matplotlib.pyplot as plt # 将栅格转为点采样(每1000像元取1点,避免卡顿) rows, cols = np.where(soil_array != -9999) # 排除NoData sample_idx = np.random.choice(len(rows), size=5000, replace=False) latlon = rasterio.transform.xy(transform, rows[sample_idx], cols[sample_idx]) heat_data = [[lat, lon, 1] for lat, lon in zip(*latlon)] # 创建交互地图 m = folium.Map(location=[35, 105], zoom_start=4, tiles='CartoDB.Positron') HeatMap(heat_data, radius=15, blur=20).add_to(m) m.save('soil_heatmap.html') # 双击HTML文件即可查看

6.3 用GDAL Python API批量重采样至1km分辨率(适配大尺度模型)

from osgeo import gdal # 输入输出路径 input_tif = 'china_soil_30m.tif' output_tif = 'china_soil_1km.tif' # 打开源数据 ds = gdal.Open(input_tif) # 设置重采样参数:nearest(保持代码离散性)、输出分辨率1000m resampled = gdal.Warp( output_tif, ds, xRes=0.009, # ~1000m at equator yRes=0.009, resampleAlg='near', # 必须用nearest,避免插值产生不存在的代码 dstSRS='EPSG:4326' ) resampled = None # 关闭数据集

从那以后我每次拿到新的土壤/土地利用栅格数据,第一件事就是用gdalinfo扫一遍坐标系和NoData值,第二件事是把代码表用pandas读进来df.dtypes检查字段类型,第三件事是画个随机采样点图确认空间对齐——这三步做完,后面所有分析才不会在最后一步崩溃。希望帮到你。

本文还有配套的精品资源,点击获取

返回列表