ArcGIS重分类实战:手把手教你搞定SWAT模型土地利用数据库(附CNLUCC对照表)

ArcGIS重分类实战:从CNLUCC到SWAT模型土地利用数据库的完整指南

当你第一次打开SWAT模型准备进行水文模拟时,最令人头疼的环节之一就是处理土地利用数据。作为中国研究者,我们手头往往只有CNLUCC分类的土地利用栅格数据,而SWAT模型却需要特定的分类体系。本文将带你一步步完成这个关键的数据转换过程。

1. 理解数据转换的核心逻辑

在开始操作之前,我们需要明确几个关键概念和它们之间的关系:

  • CNLUCC数据:中国土地利用/覆盖变化数据集,采用国内通用的分类体系(如一级类包括耕地、林地、草地等11个类别)
  • SWAT分类体系:模型内置的土地利用分类,包括AGRL(农业用地-常规)、FRST(混交林)等常见类别
  • 重分类映射表:连接两种分类体系的桥梁,决定了如何将CNLUCC代码转换为SWAT代码
  • 索引表:最终SWAT模型读取的关键文件,将栅格数据中的数值与作物参数库关联起来

三者关系可以用这个简单流程表示:

CNLUCC栅格数据 → 重分类映射 → SWAT分类栅格 → 生成索引表 → 关联crop参数库

2. 准备工作与环境配置

2.1 所需软件与数据

开始前请确保已安装以下工具:

  • ArcGIS 10.x或Pro版本(必须包含Spatial Analyst扩展模块)
  • Microsoft Excel(用于处理对照表)
  • ArcSWAT插件(已正确安装配置)

需要准备的数据文件:

数据类型文件格式说明
CNLUCC土地利用数据.tif或.img研究区或全国范围的原始数据
研究区边界/DEM数据.shp或.tif用于掩膜提取
SWAT分类对照表.xlsx自定义或从文献获取的转换规则

2.2 创建项目文件夹结构

推荐按以下结构组织工作目录:

SWAT_Landuse_Project/ ├── 01_OriginalData/ │ ├── CNLUCC_2020.tif │ └── StudyArea_Boundary.shp ├── 02_ProcessedData/ ├── 03_Output/ └── 04_Documentation/ └── Classification_Mapping.xlsx

3. 数据预处理:从CNLUCC到研究区提取

3.1 加载并检查原始数据

在ArcMap中执行以下操作:

  1. 点击"添加数据"按钮,导入CNLUCC栅格文件
  2. 右键图层 → 属性 → 源,确认以下信息:
    • 像元大小(建议30m或更精细)
    • 坐标系(通常为Albers等面积投影)
    • 分类数值与含义(查看属性表)

提示:如果属性表中没有分类描述,需要单独获取CNLUCC代码说明文档。

3.2 按研究区边界提取

使用掩膜提取工具裁剪研究区范围:

# ArcPy代码示例(也可通过GUI操作) import arcpy from arcpy.sa import * # 设置工作空间 arcpy.env.workspace = "SWAT_Landuse_Project/01_OriginalData" # 执行掩膜提取 outExtractByMask = ExtractByMask("CNLUCC_2020.tif", "StudyArea_Boundary.shp") outExtractByMask.save("SWAT_Landuse_Project/02_ProcessedData/Landuse_StudyArea.tif")

关键参数说明:

  • 输入栅格:原始CNLUCC数据
  • 掩膜数据:研究区边界(矢量或栅格)
  • 输出范围:建议与后续使用的DEM保持一致

4. 构建分类对照体系

4.1 理解分类映射原理

CNLUCC与SWAT分类并非一一对应,常见映射关系示例:

CNLUCC代码CNLUCC名称SWAT代码SWAT名称新值
11水田AGRL农业用地-常规1
12旱地AGRR农业用地-轮作2
21有林地FRST混交林3
31高覆盖草地PAST牧场4

4.2 创建Excel对照表

在Excel中建立三列关键字段:

  1. 原始值:CNLUCC分类代码(从栅格属性表导出)
  2. SWAT代码:对应的模型分类代码
  3. 新值:重新编排的连续整数(用于简化栅格值)

使用公式提高效率:

=IF(A2=11,"AGRL",IF(A2=12,"AGRR",IF(A2=21,"FRST","OTHER")))

注意:对于复杂映射关系,建议使用VLOOKUP结合单独的分类字典表。

5. ArcGIS重分类实操

5.1 重分类工具参数设置

在ArcToolbox中导航至:Spatial Analyst工具 → 重分类 → 重分类

关键参数配置:

  • 输入栅格:提取后的研究区土地利用数据
  • 重分类字段:Value
  • 重映射方式:选择"唯一值"或"值范围"
  • 输出栅格:设置保存路径和名称

5.2 批量重分类技巧

当类别较多时,可以采用以下方法提高效率:

  1. 将Excel对照表导出为.csv文件
  2. 使用Join工具将属性表与对照表连接
  3. 通过"栅格计算器"直接生成新栅格:
# 栅格计算器表达式示例 Con("Landuse_StudyArea.tif" == 11, 1, Con("Landuse_StudyArea.tif" == 12, 2, Con("Landuse_StudyArea.tif" == 21, 3, 0)))

6. 生成SWAT索引表

6.1 表格格式要求

SWAT需要的索引表是纯文本格式,包含两列:

"VALUE","NAME" 1,"AGRL" 2,"AGRR" 3,"FRST"

6.2 从Excel到TXT的转换步骤

  1. 保留"新值"和"SWAT代码"两列
  2. 删除重复行(数据 → 删除重复值)
  3. 添加列标题:VALUE, NAME
  4. 另存为"CSV(逗号分隔)"
  5. 将文件扩展名从.csv改为.txt
  6. 用文本编辑器检查格式是否正确

7. 关联作物参数数据库

7.1 定位crop表

ArcSWAT安装后,参数数据库通常位于:

C:\ArcSWAT\Databases\SWAT2012.mdb

关键表结构说明:

字段名描述
CPNM4字符的SWAT作物代码
DESC详细描述
HVSTI收获指数
BLAI最大潜在叶面积指数

7.2 验证数据一致性

检查索引表中的NAME值是否都能在crop表的CPNM字段中找到对应项。常见问题包括:

  • 大小写不一致(SWAT通常要求大写)
  • 代码拼写错误
  • 使用了crop表中不存在的自定义代码

8. 常见问题排查与优化建议

8.1 重分类结果异常检查

如果输出栅格出现意外结果,建议:

  1. 检查原始栅格的属性表值分布
  2. 确认对照表中没有遗漏任何类别
  3. 验证重映射规则是否应用正确

8.2 性能优化技巧

处理大范围数据时:

  • 先裁剪到研究区再重分类
  • 使用金字塔和统计量加速显示
  • 考虑将栅格转换为整型减小文件体积

8.3 自动化脚本开发

对于需要频繁重复的工作,可以创建Python脚本:

import arcpy import pandas as pd # 读取Excel对照表 mapping_df = pd.read_excel("Classification_Mapping.xlsx") mapping_dict = dict(zip(mapping_df['原始值'], mapping_df['新值'])) # 执行重分类 remap_range = arcpy.sa.RemapValue(mapping_dict) out_reclass = arcpy.sa.Reclassify("Landuse_StudyArea.tif", "Value", remap_range) out_reclass.save("Landuse_SWAT.tif")

在实际项目中,我发现最容易出错的环节是分类对照表的建立。曾经因为一个代码映射错误导致整个模拟结果出现偏差,建议完成转换后,用以下SQL验证数据完整性:

SELECT DISTINCT l.NAME FROM Landuse_Index l LEFT JOIN crop c ON l.NAME = c.CPNM WHERE c.CPNM IS NULL