手头有两期土地利用数据,想产出未来十年的土地利用变化模拟图,放在五年前大概会被人推荐CA-Markov或者FLUS。但最近这几年,越来越多论文和课题转向了PLUS模型。原因不复杂:PLUS把“扩张规则学习”和“斑块生成”拆成两个独立模块,理论上比传统CA类模型更贴合真实城市扩展和土地变化过程,而且操作门槛没有想象中那么高。
这篇不是官方教程的复读,更像是我从零开始把PLUS模型完整跑通之后的实战笔记。里面会覆盖数据准备、LEAS模块、CARS模块、精度验证,以及我反复踩过又填上的各种坑。适合刚接触土地利用模拟、希望结果又快又合理的研究生、规划师和从业者。
1. 为什么是PLUS:它到底改了什么游戏规则
1.1 传统模型的三块短板
在做PLUS之前,大多数人用的是CA-Markov、CLUE-S或者FLUS。这几个模型不是说不能用,而是各有各的别扭。
CA-Markov的问题在于转换规则太粗。它通常基于历史期转移矩阵,再叠加一个简单的适宜性图层,规则本身缺乏对自然和社会经济驱动因子的量化挖掘,导致模拟结果在空间上“道理讲不通”,很难回答“为什么这里会长出建设用地,而不是那里”。遇到大尺度、多类别的土地利用模拟,这个短板尤其明显。
CLUE-S的优势在需求预测和宏观空间分配,但对斑块尺度不够敏感。它模拟出的城市扩展形态往往是“一片模糊的过渡带”,缺少清晰的组团和连片感,放到30米分辨率的图上,真实性不足。
FLUS用神经网络学习土地类型的适宜性,比CA-Markov前进了一大步。但它学习的是全量像元的“现状”——也就是说,模型同时用“没变化的大片像元”和“变化的少量像元”来训练。在绝大多数土地利用场景里,未变化像元占总像元90%以上,信号被严重稀释,结果就是模型特别擅长预测“哪里不变”,却不擅长预测“哪里变”。这恰恰与我们的目标相反。
1.2 PLUS的两段式设计
PLUS模型的核心改动,是把“变化”本身拎出来单独建模。它由两个模块构成:LEAS(Land Expansion Analysis Strategy)和CARS(CA based on multi-type Random-patch Seeds)。
LEAS只针对两期土地利用之间真正发生扩张的区域进行采样,再用随机森林分别学习每一类土地扩张与驱动因子之间的关系,输出每一类土地的增长概率栅格。随机森林对非线性关系和因子交互效应的拟合能力,比逻辑回归、ANN都要稳,特征重要性还能直接用来分析“什么因子主导了扩张”。
CARS模块则把增长概率、像元需求、转移矩阵、邻域权重组合起来,通过随机种子和递减阈值机制,把概率场转变成一张张具有真实斑块形态的未来土地利用图。它模仿的是真实城市扩张里“先核心、后边缘、沿道路蔓延”的过程,而不是简单地把所有高概率像元一次性填满。
一句话概括:LEAS负责“向历史变化学习规则”,CARS负责“按规则生成未来斑块”。这个分工让PLUS在城市扩张模拟、多情景土地利用预测、生态政策评估这类问题上,表现明显比老一代模型自然。
2. 数据准备:正式运行前先结清这笔账
PLUS跑得快不快、准不准,80%由数据决定。很多人在这一步卡住,不是模型不会用,而是数据没收拾利索。
2.1 两期土地利用图的处理
PLUS一般需要两期土地利用栅格:t0期和t1期。比如用2000年和2010年两期数据做LEAS训练,再用2010年作为CARS的初始年份去模拟未来。
实际处理时建议按这几步来:
- 把原始土地利用二级类合并成一级类。常用分类有耕地、林地、草地、水域、建设用地、未利用地六类,栅格值建议连续设为1到6。
- 保证两期数据的分类体系完全一致。这事听起来简单,但不同来源的产品常常在“草地”和“灌木”这类边界上有差异,导致模型把这类差异误判为“变化”。
- 保存为整型栅格,避免浮点误差带来的伪变化。两张图里的像元值必须是整数,格式推荐GeoTIFF。
- 检查两期地图的投影和范围。最稳妥的做法是统一投影后再裁剪,而不是直接在原始数据上操作。
2.2 驱动因子怎么选
驱动因子是LEAS的输入特征。根据不同研究区,常用因子大致分成五类:
| 类型 | 常见因子 | 用途与说明 |
|---|---|---|
| 地形因子 | DEM、坡度、坡向 | 山地城市必备,直接约束建设成本 |
| 距离因子 | 到城市中心、县区政府、各级道路、铁路、河流、海岸线的距离 | 反映区位可达性,通常用欧氏距离栅格 |
| 社会经济因子 | GDP、人口密度、夜间灯光 | 反映经济活动强度,注意数据年份与模拟时段匹配 |
| 气候环境因子 | 年均温、年降水、NPP | 大区域模拟时尤其重要,影响林地和草地扩张 |
| 土壤因子 | 土壤类型、有机质含量 | 农业用地模拟时建议加入 |
驱动因子数量不是越多越好。我一般控制在8到15个。因子之间高度相关时,随机森林的变量重要性解释会失真,建议先用相关性分析粗筛一遍,把相关系数绝对值大于0.7的因子删掉一个,保留更易获取和解释的那一个。
2.3 统一坐标系统与像元对齐
这是新手最容易翻车的地方,也是最值得多花时间检查的地方。
所有栅格必须满足四个一致:投影坐标系一致、像元大小一致、范围一致、像元网格对齐。很多人在GIS里肉眼看两幅图叠合得很好,但放大到像元尺度发现错位了半个像元,这就是网格原点不一致导致的。
解决办法是在ArcGIS里把其中一幅干净的数据设为Snap Raster,然后对其余驱动因子做重采样和按掩膜提取。用Python配合gdal写批处理也能实现同样效果,但Snap Raster更直观,适合第一次跑通流程。
nodata也要统一处理。DEM和距离栅格在边界经常出现nodata,如果不处理,PLUS训练时可能把nodata当作0参与计算,在边界产生不合理的扩张。建议把研究区外的区域统一设为掩膜范围,并确保掩膜文件本身没有缺口。
还有一条容易被忽视的规则:不要把模拟时段内“未来”的数据混入驱动因子。比如用2000年和2010年数据训练、模拟2010到2020年,那么距离类因子应该尽量使用2010年或更早的路网、城市边界数据,而不是2020年才开通的新路。否则验证精度虚高,审稿人一眼就能看出来。
3. LEAS模块:每一格扩张概率是怎么算出来的
3.1 原理:只学“变化”的随机森林
LEAS的输入是两期土地利用图和驱动因子,输出是每个土地类型的增长概率栅格。它内部做的事情可以拆成三步。
第一步,逐像元比较t0和t1两期图,找出每种土地类型新增的像元。比如2000年到2010年之间,某块草地变成了建设用地,这块像元就是建设用地这一类型的“扩张样本”。
第二步,对每一类土地,把扩张像元作为正样本,从未发生该变化的像元中随机抽取一部分作为负样本,同时提取正负样本在各驱动因子上的数值,构成训练数据集。
第三步,用随机森林训练二分类模型,输出该像元属于“扩张类别”的概率。这个概率是0到1的连续值,代表该像元发生此类土地扩张的潜力。
打个比方:把每类用地扩张看作一次招聘,驱动因子是简历里的各项指标,随机森林是面试官,最后输出的概率就是这个候选像元被“录用”的可能性。LEAS只学习真正被“录用”的人,而不是把所有岗位都拿出来讲一遍,这样信号干净很多。
3.2 参数填写的门道
不同版本的PLUS界面字段略有差异,但核心参数通常包括采样比例、决策树数量、线程数。
采样比例方面,当研究区很大、像元上亿时,没必要把全部像元都用于训练,随机抽样一部分即可,实践中10%到30%都能得到稳定结果。正负样本比例不要过于悬殊,比如正样本1000个、负样本100万个,模型会严重偏向多数类,建议负样本控制在正样本的几倍以内,或者依靠随机采样机制自动平衡。
决策树数量一般设500个起步。随机森林对树的数量不太敏感,超过一定值后精度提升非常有限,反而增加训练时间。线程数按机器CPU核心数设置,能明显加快训练速度。
3.3 输出文件里真正有价值的东西
LEAS跑完之后,会输出几类文件:
- 每个土地类型的增长概率栅格,这是下一步CARS的直接输入。
- 随机森林模型的变量重要性分析结果。论文里常见的“驱动因子贡献度条形图”就来自这里。
- 模型文件,建议保留,方便后续复现和回溯。
这里要特别提醒:如果两期土地利用间隔太短,比如只有一年,而研究区内变化又很小,LEAS的正样本会极其稀少,训练出的概率场会很碎、很噪。我一般建议至少用5到10年间隔的土地利用变化来提取扩张样本,间隔太短没有统计意义。
4. CARS模块:把概率变成自然的斑块
4.1 输入构成与马尔可夫需求预测
CARS的输入比LEAS多,但逻辑更清晰。
初始土地利用图是模拟起点,通常与LEAS输入中的t1期一致。增长概率栅格来自LEAS输出。像元需求则定义了每一年每一类土地应该有多少像元,这是模拟的“总量控制”。总量可以由马尔可夫链自动生成,也可以手工设定来实现不同的未来情景。
马尔可夫链的原理不复杂:根据两期历史土地利用图得到转移概率矩阵,假设未来各类型转换概率与历史相同,逐期外推得到未来每年各类型的像元数。它生成的年度需求文件是一个txt,格式有固定要求,里面依次包含模拟年份数、土地类型数、各年各类型的像元数量。修改这个文件时要格外小心,宁可重新生成也不要手写改错。
马尔可夫的局限性在于它假设未来转移概率恒定。真实世界里政策、市场、生态保护都会改变转移概率,所以在情景模拟时,我们通常手动调整需求文件,比如设定“生态保护情景下建设用地需求量下降、林地需求量上升”。这种调参思路,就是把情景故事翻译成数字。
4.2 转移矩阵与邻域权重决定故事走向
转移矩阵是行列为土地类型的一个0/1矩阵。1表示允许由行类转为列类,0表示禁止。例如耕地转建设用地=1,林地转建设用地=1,建设用地转耕地=0,这取决于你设定的情景。
很多刚上手的人把转移矩阵理解为“必须按这个比例转”,其实不是。它只是“可不可以转”的门槛,具体转多少由增长概率、需求总量和邻域竞争共同决定。要注意的是,矩阵必须保证至少存在一条从初始状态到目标类型的合法路径,否则模拟结果会出现“除了初始图其他全空”的诡异现象。
邻域权重表示不同土地类型在邻域范围内的竞争强度。城市建设用地通常给较高权重,因为城市扩张有强烈的自我强化效应——周围建设用地越多,本地变成建设用地的概率越高。生态类用地如林地、水域,权重一般给低一些。权重不是固定的,做敏感性分析时可以按±20%浮动,观察结果变化是否稳健。
4.3 补丁生成系数、递减阈值与随机性
CARS的斑块生成依赖于随机种子机制。模型在高增长概率区域撒下种子,然后通过递减阈值逐步激活概率稍低的像元,使斑块向四周自然扩展,而不是全图撒芝麻。
补丁生成系数控制新斑块的平均规模。系数大,新斑块更完整、连片;系数小,斑块更碎。山地、丘陵这种受地形切割强烈的区域,系数要调小;平原城市区域可以调大。递减阈值通常默认0.9,意思是随着模拟迭代推进,模型允许从高概率像元逐步扩展到概率排名前90%以内、乃至更低的像元。阈值过高,扩张会过度集中在最高概率区;阈值过低,会出现大量零星孤立像元。
这里必须强调:CARS每一次运行都包含随机种子,所以同样的参数跑两次,结果会有细微差异。这是正常现象,不是程序出错了。正式研究建议同一情景至少跑5到10次,取面积统计的中位数作为最终结果,或者报告多次运行的结果范围。
5. 精度验证:别只盯着Kappa
5.1 验证实验怎么设计
模型建完不能直接拿去预测未来,必须先做回顾性验证。常见做法是:用2000年和2010年两期数据训练LEAS,再用2010年作为初始年份,用CARS模拟2010到2020年的土地利用变化,得到模拟的2020年图,与真实的2020年图逐像元对比。
如果你的数据够长,也可以用1990与2000年训练,模拟2000到2010年,这样验证年份更早、参考数据更可靠。验证通过后,才正式把模型应用到未来时段。
5.2 三个核心指标怎么算、怎么读
逐像元对比后,通常会算三个指标:
总体精度OA等于判对像元数除以总像元数。Kappa系数排除了随机一致性带来的虚高。FoM则专门针对“变化像元”计算:命中数除以命中数、漏报数、误报数三者之和。命中指实际变化且模拟变化;漏报指实际变化但模拟没变;误报指模拟变化但实际没变。
FoM是衡量变化模拟能力的核心指标。因为土地利用里不变像元占绝大多数,OA和Kappa很容易达到90%以上,但FoM通常只有10%到35%。看到自己的FoM不到0.3不用慌,这是CA类模型的普遍水平,不是模型做错了。
5.3 审稿人常问的几个验证问题
如果你的结果要用于论文或项目报告,至少要把下面三个问题准备好:
第一,是否做了时空调和验证?验证年份和模拟时段是否分开?第二,是否报告了逐类型的用户精度和制图精度?只报一个总Kappa说服力不够。第三,参数敏感性分析做了没有?补丁生成系数、邻域权重、驱动因子组合的变化对结果有多大影响,能不能用图或表格量化。
在验证阶段,我建议额外对比模拟图与真实图的景观指数,比如斑块数量、最大斑块比重、景观形状指数。即使像元尺度指标相差不大,斑块形态也可能有明显差别。这类对比能帮你发现CARS参数该往哪个方向调。
6. 我在实际运行中踩过的坑与处理办法
6.1 坐标系统与像元对齐的坑
我一开始做实验时,手里有一份土地利用图是地理坐标系(经纬度),一份驱动因子是投影坐标系,直接丢进PLUS跑,结果距离类因子全部失真,模拟图上出现了沿经线方向拉长的怪异斑块。
后来我给自己定了一条规矩:所有栅格在进入模型前先统一到投影坐标系,单位必须是米。在此基础上再用Snap Raster对齐网格。这个检查最好写进自动化流程里,靠肉眼判断不靠谱。
6.2 nodata和数据泄漏的坑
边界nodata的问题前面提过,这里强调一个具体场景:用ArcGIS对河谷区域做掩膜提取DEM时,河谷外围会出现大片nodata。如果不处理直接作为驱动因子,LEAS训练时会把nodata替换成0,而这些0在距离因子里代表“离目标无限近”,相当于给边界地区虚假的高扩张概率。
数据泄漏也经常出现。有人为了模拟2020到2030年的城市扩张,把2020年的夜间灯光数据直接作为驱动因子,这就等于提前把“答案”告诉了模型。正确做法是驱动因子的年份不能晚于模拟起始年,并且要在论文中说明每个因子的具体年份。
6.3 内存不足与运行时间
全国尺度30米分辨率土地利用栅格,像元数量动辄几十亿,LEAS采样和CARS迭代都会消耗大量内存和时间。我常用的处理办法有两个:
一是先用90米分辨率跑通整个流程,检查参数和结果是否合理,再决定是否上30米全分辨率。二是如果只用CARS模拟未来情景,可以固定随机种子并减少重复次数,先把趋势看明白,再为正式实验跑多次重复。
6.4 结果出现大面积异常
模拟结果如果大面积保持初始图不变,或者出现大片背景值,基本可以锁定两个原因:转移矩阵没有给合法的转化路径,或者土地利用图的像元值存在0、负值等非法编码。检查方式是重新查看重分类后的土地利用图直方图,确认像元值严格落在1到N之间,且没有缺失类。
另外,当某类土地在LEAS阶段几乎没有扩张样本时,CARS里这一类的增长概率会非常低,未来模拟中它的分布只能靠初始图维持。遇到这种情况,要么换更长的时间间隔重新提取扩张样本,要么考虑把这类土地并入相近类型,减少类别数量。
我在实际使用中最后养成的习惯是:正式跑分析前,先找一个县域级别的小范围把整个流程跑通,确认各项参数正常,再放大到完整研究区。每次调整参数都把输出记录在案,不盲信默认值。还有一个小技巧是保留每次LEAS输出的变量重要性文件,在以后回复审稿人或项目评审“为什么选这些驱动因子”时,它就是最有力的证据。