ArcGIS Pro 3.2 耕地质量代码解析:Python 计算字段函数实现 10 指标可视化
·
ArcGIS Pro 3.2 耕地质量代码解析:Python 计算字段函数实现 10 指标可视化
在农业GIS数据处理中,耕地质量分类代码的解析一直是技术人员面临的痛点。这些由12位数字和字母组成的代码(如333311101212)虽然包含了10个关键指标信息,但直接阅读却如同破解密码。本文将带你深入探索如何在ArcGIS Pro 3.2中,通过Python计算字段函数将这些"密码"转化为直观可读的自然语言描述。
1. 耕地质量代码结构解析
耕地质量分类代码采用12位编码结构,每一位或几位都对应着特定的耕地属性指标。理解这个编码结构是后续Python函数开发的基础。
代码位序与对应指标关系如下表所示:
| 代码位置 | 指标名称 | 取值范围 | 示例值 |
|---|---|---|---|
| 1-2位 | 区域代码 | 数字编码 | 33 |
| 第3位 | 坡度等级 | 1-5 | 3 |
| 第4位 | 土层厚度 | 1-3 | 3 |
| 第5位 | 土壤质地 | 1-3 | 1 |
| 6-7位 | pH值等级 | 多种编码 | 10 |
| 第8位 | 生物多样性 | 1-3 | 1 |
| 第9位 | 重金属污染 | 1-3 | 0 |
| 第10位 | 熟制类型 | 1-3 | 1 |
| 第11位 | 二级地类 | 字符/数字 | 2 |
| 第12位 | 恢复类型 | 字符 | j |
关键点说明 :
- 区域代码需要单独建立映射关系(如33对应"粤桂闽丘陵平原")
- 某些指标如pH值采用特殊编码(如"10"表示5.5~6.5之间)
- 二级地类和恢复类型使用字母编码,需要特殊处理
2. Python计算字段函数开发
在ArcGIS Pro中,我们可以通过字段计算器使用Python函数来解析这些代码。下面是一个完整的解析函数实现:
def parse_land_quality_code(fldm):
"""解析12位耕地质量分类代码
参数:
fldm (str): 12位耕地质量分类代码
返回:
str: 格式化后的自然语言描述
"""
# 区域映射字典
region_map = {
'33': '粤桂闽丘陵平原',
'34': '长江中下游平原',
'35': '华北平原'
}
# 各指标取值映射
slope = ['≤2°', '2~6°', '6~15°', '15~25°', '>25°']
soil_depth = ['≥100cm', '60~100cm', '<60cm']
soil_texture = ['壤质', '黏质', '砂质']
organic_matter = ['≥20g/kg', '10~20g/kg', '<10g/kg']
biodiversity = ['丰富', '一般', '不丰富']
pollution = ['绿色', '黄色', '红色']
cropping = ['一年三熟', '一年两熟', '一年一熟']
land_type = ['水田', '水浇地', '旱地', '即可恢复', '工程恢复']
ph_values = {
'10': '在5.5~6.5之间',
'2a': '在6.5~7.5之间',
'2b': '在7.5~8.5之间',
'3a': '<5.5',
'3b': '≥8.5'
}
# 解析区域代码
region_code = fldm[:2]
region = region_map.get(region_code, '未知区域')
# 处理特殊编码的pH值
ph_code = fldm[5:7]
ph = ph_values.get(ph_code, '未知pH值')
# 处理二级地类特殊编码
land_type_code = fldm[10]
if land_type_code == 'j':
land_type_idx = 3
elif land_type_code == 'g':
land_type_idx = 4
else:
land_type_idx = int(land_type_code) - 1
# 构建结果字符串
result = [
region,
f"坡度{slope[int(fldm[2])-1]}",
f"土层厚度{soil_depth[int(fldm[3])-1]}",
f"土壤质地{soil_texture[int(fldm[4])-1]}",
f"有机质含量{organic_matter[int(fldm[5])-1]}",
f"pH值{ph}",
f"生物多样性{biodiversity[int(fldm[7])-1]}",
f"重金属污染状况{pollution[int(fldm[8])-1]}",
f"{cropping[int(fldm[9])-1]}",
land_type[land_type_idx]
]
return " - ".join(result)
2.1 函数优化技巧
在实际应用中,我们可以对基础函数进行多项优化:
- 错误处理增强 :
try:
slope_level = slope[int(fldm[2])-1]
except (IndexError, ValueError):
slope_level = "坡度数据异常"
- 性能优化 :
- 将映射字典移出函数体,作为全局变量
- 使用字符串缓存常用组合
- 可配置化 :
def parse_land_quality_code(fldm, region_map=None, lang='zh'):
"""支持自定义区域映射和多语言"""
if region_map is None:
region_map = default_region_map
# 其余实现...
3. ArcGIS Pro中的实际应用
3.1 字段计算器部署步骤
- 在ArcGIS Pro中打开属性表
- 右键点击目标字段,选择"字段计算器"
- 选择"Python"作为解析程序
- 在表达式框中粘贴完整函数代码
- 在函数调用框中输入:
parse_land_quality_code(!FIELD_NAME!)
注意:确保目标字段长度足够容纳完整描述(建议至少200字符)
3.2 结果验证流程
为确保解析准确性,建议建立验证检查表:
-
抽样检查 :
- 随机选择5%的记录进行人工核对
- 特别检查边界值情况(如代码中包含'0'或'9'等非常规值)
-
完整性检查 :
# 在字段计算后运行检查
with arcpy.da.SearchCursor(feature_class, ["code_field", "result_field"]) as cursor:
for row in cursor:
if len(row[1].split(" - ")) != 10:
print(f"记录{row[0]}解析不完整")
- 可视化验证 :
- 为每个指标创建独立符号系统
- 通过地图可视化发现异常分布模式
4. 高级应用与扩展
4.1 批量处理与自动化
对于大规模数据集,可以考虑以下优化方案:
import arcpy
def batch_parse(feature_class, code_field, result_field):
"""批量解析耕地质量代码"""
expression = f"parse_land_quality_code(!{code_field}!)"
arcpy.CalculateField_management(
feature_class,
result_field,
expression,
"PYTHON3",
f"""
{parse_land_quality_code.__code__}
"""
)
4.2 指标统计分析
解析后可以轻松生成各类统计报告:
import pandas as pd
def generate_stats(feature_class):
"""生成耕地质量统计报告"""
data = []
fields = ["region", "slope", "soil_depth", "organic_matter", "pollution"]
with arcpy.da.SearchCursor(feature_class, fields) as cursor:
for row in cursor:
data.append(row)
df = pd.DataFrame(data, columns=fields)
stats = df.groupby("region").agg({
"slope": lambda x: x.mode()[0],
"pollution": lambda x: (x == "绿色").mean()
})
return stats
4.3 与其他工具的集成
-
与ArcGIS Dashboard集成 :
- 创建实时监控看板
- 设置指标异常警报
-
导出到Excel :
arcpy.TableToExcel_conversion("parsed_results", "耕地质量分析.xlsx")
- Web应用发布 :
- 使用ArcGIS API for JavaScript构建交互式查询工具
- 实现代码到描述的实时转换功能
更多推荐


所有评论(0)