2. QGIS地理处理框架初探
在QGIS中做批量制图,很多人第一反应是“写脚本”或“装插件”,但QGIS本身已经提供了一套完整的地理处理框架,理解这套框架的四个核心部件及其关系,是后续高效批量制图的前提。这四个部件分别是:处理工具箱(Processing Toolbox)、算法提供者(Algorithm Provider)、模型设计器(Graphical Modeler)和批处理界面(Batch Processing Interface)。它们不是并列的四个菜单,而是一条从“算法来源”到“单次执行”再到“批量编排”的层次链路。
一、四个部件各自的角色
算法提供者是框架的“货源”。QGIS原生算法(如缓冲区、裁剪、重投影)、GDAL/OGR、GRASS GIS、SAGA、PDAL,以及第三方插件注册的算法,都通过各自的Provider接入。每个算法在框架中都有唯一的算法ID,例如原生缓冲区算法为 native:buffer,按掩膜裁剪为 gdal:cliprasterbymasklayer。算法提供者的意义在于:无论算法来自哪个后端,调用方式、参数描述、输出类型都被统一成同一套接口,模型设计器和批处理界面才能“不认识具体算法也能编排它”。
处理工具箱是算法提供者的“展示与检索层”。它按提供者分组列出所有可用算法,支持搜索算法名或ID。工具箱本身不执行计算,它负责让你找到算法、打开算法对话框、查看参数说明。换句话说,工具箱是入口,算法提供者是内容。
模型设计器把多个算法连成一张有向图:输入图层、算法节点、中间结果、最终输出。模型保存为 .model3 文件,注册后本身也成为一个算法,拥有自己的算法ID,可以被工具箱搜索到、被批处理界面调用、甚至被其他模型嵌套。这是模型在批量制图中定位的关键——模型是“被封装成算法的处理流程”。
批处理界面则是“同一算法、多组参数”的批量执行器。它把任意算法的参数展开成一张表格,每一行是一组输入,可以手工填写,也可以从图层列表、文件目录填充。批处理界面不关心算法内部是一个简单缓冲区还是一整张模型图,它只按参数表逐行执行。
二、模型在批量制图中的定位
把上面的关系落到批量制图任务上,可以这样理解:假设你要为12个乡镇分别生成“缓冲区—裁剪—导出PDF”的专题图。如果直接用批处理界面调用原生缓冲区算法,你只能批量做缓冲区这一步,裁剪和导出还得另开两次批处理,中间文件散落一地。正确做法是先在模型设计器中把三步连成一张模型:输入为乡镇边界图层和待裁剪图层,输出为PDF路径;保存为 town_map.model3 并注册。此时这个模型在工具箱中就是一个算法,参数只有“乡镇边界”“待裁剪图层”“输出目录”等少数几项。再用批处理界面调用这个模型,12行参数一次填完,每行对应一个乡镇,一次运行完成12套制图。
这就是模型的核心价值:把“多算法流程”压缩成“单算法接口”,从而让批处理界面能够以统一方式驱动整条制图链。模型负责“流程正确”,批处理负责“对象遍历”,两者分工明确。
三、实际调用方式与参数填写
在工具箱中搜索模型名即可打开其参数对话框;点击对话框右上角的“以批处理模式运行”按钮,即进入批处理表格。表格列对应模型输入参数,行对应每个乡镇。以示例任务为例,可这样填写(以下为教学示例参数,非实测结果):
模型:town_map.model3
参数列:乡镇边界 | 待裁剪图层 | 缓冲距离(米) | 输出PDF目录
第1行:town_01.shp | landuse.shp | 200 | D:/out/town_01.pdf
第2行:town_02.shp | landuse.shp | 200 | D:/out/town_02.pdf
...
第12行:town_12.shp | landuse.shp | 200 | D:/out/town_12.pdf
填写时注意两点:一是“待裁剪图层”和“缓冲距离”在各行相同,可用“填充向下”快速复制;二是输出路径必须每行不同,否则后一行会覆盖前一行。运行后观察批处理日志:每行显示“执行中/成功/失败”,失败行会给出具体算法节点和错误信息,例如某乡镇边界为空导致裁剪输出为空,此时应回到模型检查该节点的容错设置,而不是在批处理里逐行重试。
四、常见误区
初学者常把“批处理界面”当成“模型设计器”的替代品,实际上二者解决的是不同维度的问题:批处理解决“同一流程换对象”,模型解决“多个流程串起来”。也有用户把模型当成脚本的替代,其实模型保存的 .model3 是JSON结构,可以在文本编辑器中查看节点和连接关系,便于版本管理和团队交接,这一点在批量制图项目交付时很实用。理解这四个部件的层次与调用关系,后续无论是用模型嵌套、还是用Python调用 processing.run(),都能找到对应的位置。