手头有两期土地利用数据想产出未来十年的土地利用变化模拟图放在五年前大概会被人推荐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模型的核心改动是把“变化”本身拎出来单独建模。它由两个模块构成LEASLand Expansion Analysis Strategy和CARSCA 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. 精度验证别只盯着Kappa5.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输出的变量重要性文件在以后回复审稿人或项目评审“为什么选这些驱动因子”时它就是最有力的证据。