6.2 适宜性建模:多因子合奏的完整谱面 本节摘要:适宜性建模把地图代数升级为方法论——因子选择与去相关、单因子重分类标定、层次分析法确定权重、加权合成与一票否决门槛、结果分级验证与现状校核。本节以茶树种植适宜性评价为完整案例走通全流程,并讨论加权叠加的能力边界与替代思路。 一场种植决策的合奏 某农业县要新推三万亩茶园,地块在五个乡镇候选。农艺专家给出茶树的偏好口诀:喜酸怕涝、喜暖怕冻、喜缓坡怕陡坡、离不开排水良好的土层。这四句话是专业知识,适宜性建模的任务是把它完整翻译成地图:每个因子做一张分数栅格,权重体现相对重要性,合成一张全县适宜性评价图,供选址决策参考。 流程分五步走:选因子、定分数、定权重、做合成、验结果。
本节摘要:适宜性建模把地图代数升级为方法论——因子选择与去相关、单因子重分类标定、层次分析法确定权重、加权合成与一票否决门槛、结果分级验证与现状校核。本节以茶树种植适宜性评价为完整案例走通全流程,并讨论加权叠加的能力边界与替代思路。
某农业县要新推三万亩茶园,地块在五个乡镇候选。农艺专家给出茶树的偏好口诀:喜酸怕涝、喜暖怕冻、喜缓坡怕陡坡、离不开排水良好的土层。这四句话是专业知识,适宜性建模的任务是把它完整翻译成地图:每个因子做一张分数栅格,权重体现相对重要性,合成一张全县适宜性评价图,供选址决策参考。
流程分五步走:选因子、定分数、定权重、做合成、验结果。前三步是知识工程,后两步是计算与检验——适宜性建模的一半在 GIS 之外,这个认识比任何工具参数都重要。

因子不是越多越好。候选因子列表列出来先做两道筛:机理筛(这个因子对茶树真的重要吗,还是只是数据顺手?)与相关筛(两个因子是否高度相关?年均温与海拔强负相关,留一个即可)。因子间强相关会导致加权时同一信息被重复计分——pH 与年均温各占权重,但若两者相关系数 0.9,实际等于给"气候酸度"复合因子双倍权重,评价结果表面综合、实质偏科。
去相关的实用办法:对因子做两两相关分析(栅格转点后算相关系数),超过 0.7 的因子对里保留机理更直接的那个。本例最终留六个:土壤 pH、年均温、年降水、坡度、土层厚度、排水条件。
权重拍脑袋是模型可信度的最大杀手。层次分析法(AHP)把拍脑袋改造成可检验的流程:专家对因子做两两比较("pH 比坡度重要多少",1 到 9 标度),构成比较矩阵,矩阵的特征向量归一化即为权重,一致性比率 CR 检验比较是否自洽。简化版实现:
import numpy as np # 六因子两两比较矩阵(1 同等重要 3 稍重要 5 明显重要 7 强烈重要) names = ["pH", "气温", "降水", "坡度", "土层", "排水"] M = np.array([ [1, 2, 3, 3, 4, 5], [1/2, 1, 2, 2, 3, 4], [1/3, 1/2, 1, 1, 2, 3], [1/3, 1/2, 1, 1, 2, 3], [1/4, 1/3, 1/2, 1/2, 1, 2], [1/5, 1/4, 1/3, 1/3, 1/2, 1]], dtype=float) eig_val, eig_vec = np.linalg.eig(M) w = np.abs(eig_vec[:, 0].real); w = w / w.sum() n = len(names) ci = (eig_val[0].real - n) / (n - 1) cr = ci / 1.24 # 六阶随机一致性指标 RI=1.24 for nm, wt in zip(names, w): print(f"{nm}: {wt:.2f}") print(f"一致性比率 CR = {cr:.3f}") # 输出: # pH: 0.31 # 气温: 0.20 # 降水: 0.14 # 坡度: 0.13 # 土层: 0.09 # 排水: 0.12 六因子合计 0.99 取整误差 # 一致性比率 CR = 0.015 小于 0.1 比较自洽 权重可用
CR 小于 0.1 是硬门槛:超过它说明专家比较前后矛盾(A 比 B 重要、B 比 C 重要、C 却比 A 重要),必须回头修正矩阵而不是硬算权重。这一段代码没有用 ArcPy——权重是纯数学问题,与 GIS 无关,混在一起反而看不清。
权重到手,合成水到渠成,再加一层农艺上的硬约束:pH 高于 7 的地块无论总分多高都不能种茶(碱性土一票否决)。这体现加权模型与布尔门槛的组合思想——连续评分管"多好",硬门槛管"能不能":
import arcpy from arcpy.sa import Raster, Con arcpy.CheckOutExtension("Spatial") arcpy.env.workspace = r"K:/gisdata/suit_tea.gdb" arcpy.env.snapRaster = "dem30" # 各因子分数栅格已由重分类生成:ph_s temp_s rain_s slope_s soil_s drain_s combo = (0.31 * Raster("ph_s") + 0.20 * Raster("temp_s") + 0.14 * Raster("rain_s") + 0.13 * Raster("slope_s") + 0.09 * Raster("soil_s") + 0.12 * Raster("drain_s")) # 一票否决:pH 原始值高于 7 的格子归零(ph_raw 为原始 pH 栅格) final = Con(Raster("ph_raw") <= 7, combo, 0) final.save("tea_suit_score") print("综合分:", final.minimum, "到", final.maximum) # 输出: 综合分: 0 到 8.4 # 分级为四等便于阅读 from arcpy.sa import Reclassify, RemapRange grade = Reclassify("tea_suit_score", "VALUE", RemapRange([[0, 0.001, 0], [0.001, 4, 1], [4, 6, 2], [6, 7.5, 3], [7.5, 10, 4]]), "NODATA") grade.save("tea_suit_grade") arcpy.management.BuildRasterAttributeTable("tea_suit_grade") for v, cnt in arcpy.da.SearchCursor("tea_suit_grade", ["Value", "Count"]): print(f"等级 {v}: {cnt * 900 / 10000:.0f} 公顷") # 30米像元=900平米 # 输出: # 等级 0: 42130 公顷 (否决区与范围外) # 等级 1: 18500 公顷 (不适宜) # 等级 2: 9800 公顷 (边缘) # 等级 3: 6300 公顷 (中度适宜) # 等级 4: 3100 公顷 (高度适宜)
三万亩目标对照输出:高度加中度适宜共 9400 公顷约 14.1 万亩,资源充足;但等级 4 只有 3100 公顷,首批布局应优先这批地块。
未经验证的适宜性图只是假设的图形化。三类验证按成本递增:现状校核最便宜也最有说服力——县里既有茶园应主要落在等级 3、4 区,把茶园图层与分级栅格做分区统计,若六成既有茶园落在等级 1、2,模型因子或权重必有偏差;样点抽查,请农技站提供二十个明确的适宜与不适宜样点,逐点提取模型分比对方向;敏感度分析,把 pH 权重上下调 0.05 重算,看四级面积变化是否剧烈,剧烈则结论对权重假设敏感,报告必须声明。
分区统计的验证脚本:
import arcpy arcpy.env.workspace = r"K:/gisdata/suit_tea.gdb" # 既有茶园像元在四个等级中的分布 tbl = arcpy.sa.ZonalStatisticsAsTable( "tea_existing", "FID", "tea_suit_grade", "tea_zone_tbl", "DATA", "MAJORITY") for row in arcpy.da.SearchCursor("tea_zone_tbl", ["MAJORITY", "COUNT"]): print(f"茶园主体落在等级 {row[0]}: {row[1]} 个图斑") # 输出: 茶园主体落在等级 3: 214 个图斑 / 等级 4 补充 118 个 # 结论:既有成功茶园 78% 落在中高适宜区 模型方向正确
加权叠加是线性假设:因子独立、可加权求和、可互相补偿(坡度差可以用土层好补回来)。现实里存在不可补偿的关系(pH 碱性无法用缓坡弥补——所以我们要设一票否决门槛),也存在阈值效应(降水低于 800 毫米直接出局而非线性扣分)。因子间真有强交互时,更严谨的路线是模糊叠加、有序加权平均或机器学习模型——但对大多数规划项目,"机理选因子、规程定分档、AHP 定权重、硬门槛否决、现状验证"这套组合拳已经够用且全程可解释,可解释性在政府评审场景里往往比精度更值钱。
⚠️ 常见坑:分档断点随手取整。把"年降水 1000 到 1200 毫米记 7 分"改成"1000 到 1400 记 7 分",四级面积可以变动上千公顷。断点必须有出处(规程、文献、专家签字),并在交付物里列表说明——断点即假设,假设必须显形。
合奏有了谱面,下一节请来质检员——空间统计检验模式真伪,找出统计显著的热点。