☰
QGIS模型构建器实战:栅格批量裁剪与投影转换自动化
2026/10/6 8:58:08 网站建设 项目流程

做GIS的人,十有八九都干过这种重复劳动:同一个工具、同一套参数,对着几十上百个文件,一遍遍点击运行。我早年在项目上处理一批分幅栅格数据,每幅都要做裁剪、重投影、再加一个字段写元信息,一套流程点下来快则三五分钟,慢则十分钟。两个区的数据、近两百个分幅,光手动跑流程就跑了大半天,中途还因为手滑点错参数重跑了两轮。后来接触了QGIS的模型构建器,才意识到这类工作根本不该这么干。这份“苦力活”,用可视化建模把流程串成一条流水线,输入一换、一键运行,自动化批量处理,省下来的时间足够你把属性表检查两遍。

模型构建器是QGIS内置的可视化建模工具,不写代码,把“输入数据→处理算法→输出结果”拖进画布连线,就能组成一条完整的数据加工流水线。它适合谁?适合那些需要频繁执行固定GIS流程、动辄处理几十上百个文件的数据处理人员、规划师、遥感工程师,也适合想把自己常用操作沉淀成标准化流程的团队。这篇文章我用真实项目案例,从界面概念讲起,逐步拆解批量裁剪、批量投影转换、按字段分组处理等场景的建模方法与避坑经验。

1. 先从痛点说起:为什么批量处理不能靠手点

1.1 一个真实的项目场景

去年底我接到一个县域国土空间规划的数据整理任务,原始数据是几十幅分幅的DEM高程栅格和一套只做了粗略配准的历史影像。前期要求很明确:所有栅格统一投影到CGCS2000 / 3-degree Gauss-Kruger zone 40,同时按行政区划边界裁剪,最后给每个成果文件补一条元数据属性,包括数据来源、生产日期和坐标系描述,输出到统一的成果目录。

这个流程单幅操作不复杂,就是QGIS里常见的“投影转换→按矢量裁剪→填属性”,三步就能跑完。但乘上幅数就变味了:60幅影像加47幅DEM,一共107个源文件,每个文件跑三步总共就是三百多次交互。更麻烦的是,你不能只跑一遍,中间甲方对边界范围调整过一次,所有成果全部需要重出。当时我手动跑了前20幅就觉得不对劲——在ArcGIS或QGIS里重复点鼠标时,最大的风险不是慢,而是人的注意力会随重复次数急速衰减,你可能在第80幅时选错输出路径,也可能在第100幅时忘了勾选某个选项,这种错往往到成果汇总阶段才会暴露,返工成本极高。

所以那一次我没有继续手点,而是开了QGIS的模型构建器,把“投影转换→裁剪→填写元数据”三步搭成一条流水线,参数全部暴露成模型入参,然后对着107个源文件批量运行。模型跑完一组数据大约18秒,加上文件I/O的时间,107个文件不到40分钟全部处理完,全程不需要人盯守,中间边界调整后只改了裁剪矢量路径,又跑了一遍,总共花了一下午,其中一半时间还是在核对配色和元数据写法的细节。

1.2 模型构建器到底解决什么问题

从上面的场景能看出,模型构建器解决的并不是“某个算法跑得慢”的问题,而是“流程重复次数多导致的人力消耗和错误概率”。它把一系列地理处理算法组合成一个可以复用的流程单元,这个单元有明确的输入端口、处理逻辑和输出端口,改了输入就能反复执行,本质上就是可视化版本的“批处理脚本”。

对比手动操作,它的优势可以归纳成四点。第一是可复用性,一次建模永久使用,模型文件可以复制到其他项目,甚至分享给同事;第二是可参数化,把经常变化的图层、字段、数值暴露成变量,同一个模型换个输入就能处理新数据,不需要改动内部连线;第三是可追溯性,模型运行时会记录算法参数和日志,能清楚看到每一步用了什么参数、产出了什么中间结果,这比靠记忆复盘强得多;第四是门槛低,拖拖拽拽连上线就能用,不要求会Python,普通业务人员培训十几分钟也能上手操作模型运行。

这里也顺便提一下,QGIS的模型构建器在功能定位上与ArcGIS的ModelBuilder非常相似,但它的优势是开源免费、跨平台,而且和QGIS自带的地理处理框架深度集成。你用“处理工具箱”里能看到的算法,几乎都能拖进模型里面。后面我会把具体用法和细节一一展开。

2. 模型构建器入门:面板、数据流和三种关键节点

2.1 界面长什么样

打开QGIS,在顶部菜单找到“处理”→“模型构建器”,或者直接按组合键Ctrl+Alt+M,就能打开模型构建器窗口。这个窗口比普通对话框复杂不少,但核心区域就两块:左侧是“算法”“输入”“工具”的选项卡面板,中间大块白色画布是建模区。

左侧面板的“算法”选项卡里列出来自处理工具箱的全部算法,和你在“处理”→“工具箱”里看到的清单一致,包括矢量、栅格、数据库、图层等分类下的几百个工具。如果你安装了第三方处理插件,比如SAGA、GRASS的算法,也会出现在这里。“输入”选项卡则用来添加模型的输入参数,比如矢量图层、栅格图层、字段、数值、字符串等。你从左侧把一个算法拖到画布上,就生成一个模型步骤节点;从输入面板拖一个“矢量图层”到画布,就生成一个输入节点,它会在运行模型时变成要求用户选择的参数框。

画布上方有一排菜单按钮,分别是保存、运行、验证模型、导出脚本等。最关键的逻辑是:画布上每个节点之间用连线表示数据流方向,连线的数据会从前一个算法节点的输出端口流向下一个算法节点的输入端口。你不需要写任何代码,只要把线连对,模型就通了。这和ArcGIS的模型构建器一样,区别就是图标风格不同,但思路是共通的。

2.2 输入、算法、输出:核心三种节点

模型构建器里最常见的节点类型有三种。

第一种是输入节点,它是模型的“入口”,运行模型时这些会变成对话框里的字段,让使用者逐个指定。输入类型包括矢量图层、栅格图层、高程栅格、表、字段、常量值、坐标参考系等。你拖入一个“栅格图层”输入节点,模型运行时就会弹出一个栅格图层选择框,用户可以手动选择文件路径或当前地图中已加载的图层。

第二种是算法节点,也就是具体执行某个地理处理任务的节点。拖入算法后,双击它就能看到该算法的全部参数,每个参数右侧有一个圆圈按钮,点击它可以打开一个菜单,选择“模型输入”,把某个输入节点的值作为这个参数的值;或者选择“预定义值”,直接写死一个参数数值。这是模型最核心的操作逻辑——所有参数要么绑定到输入节点,要么固定成一个常量。

第三种是输出节点,但和ArcGIS里有独立的输出节点不同,QGIS的算法节点右下角自带输出端口,拖出连线就能把结果接到后面的算法里继续加工。如果你想让最终结果直接保存到磁盘,也可以双击算法节点,在“输出”一栏点击某个输出结果的按钮,选择“保存到临时文件”还是“保存到文件路径”。模型运行完毕时,每个有明确输出设置的算法节点都会在“结果”区域显示它的产物。

2.3 搞清楚数据依赖关系

新手容易犯的一个错误是只连线不管依赖关系,觉得算法顺序从上到下排就行了。其实模型构建器不按位置先后执行,而是按照数据依赖关系执行。也就是说,只有当某个节点需要的上游数据全部准备好,它才会被触发执行,这是DAG(有向无环图)的思路。

举个例子,如果你的模型流程是“重投影→裁剪→坡度计算”,那么裁剪节点必须连在重投影节点之后,因为裁剪的输入需要用到重投影的输出;坡度计算又必须等裁剪完成才能算。你不需要手动指定执行顺序,连线本身就定义了依赖,执行器会自己推算顺序。所以建模时要关注的不是“把节点排在哪个位置好看”,而是“哪一步需要上一步的哪个输出作为输入”。

另外,QGIS模型构建器还允许一个算法节点的输出同时被多个后续算法使用。比如一个裁剪后的DEM,既可以作为坡度计算的输入,也可以作为山体阴影计算的输入,你只需要从裁剪结果端口拉出两条线分别连过去就行,数据会自动传递,不会重复计算。

3. 实战:用模型构建器做一个批量裁剪与投影转换模型

3.1 模型目标与数据准备

现在进入实操阶段。假设手上有60幅历史影像,各自投影不一致、范围超出行政区界,需要统一做三件事:重投影到“CGCS2000 / 3-degree Gauss-Kruger CM 120E”坐标系、按县级行政区边界裁剪、输出为TIFF文件到指定目录。传统做法是每幅图打开→重投影→另存→裁剪→另存,60幅点下来手指都酸了,我们建模一次解决。

准备数据上,建议先把所有待处理的栅格文件放在同一个文件夹,并保证命名不含中文和特殊符号,避免部分编码问题的干扰。然后准备一个行政边界矢量文件,可以是Shapefile或GeoPackage,注意它的坐标系最好已经和目标坐标系一致,否则将其拖入模型后还需在模型里做一次矢量重投影,也不复杂。为了后面输出命名有序,我建议把图幅编号写在文件名里,例如“img_001.tif、img_002.tif”,这样批量输出时能按原文件名自动生成结果名,方便对应检查。

3.2 搭建模型的完整步骤

打开模型构建器后,按下面步骤操作。

第一步,添加输入节点。从左侧“输入”选项卡拖入两个“栅格图层”,分别命名为“输入栅格”和“裁剪边界(矢量图层)”。如果行政边界是矢量文件,就拖“矢量图层”而不是“栅格图层”。这里注意命名要直观,因为后面运行对话框里用户看到的就是这个名字,命名含糊容易让人选错。

第二步,添加重投影算法。在左侧“算法”选项卡的搜索框里输入“warp”,找到“栅格投影(warp)”工具并拖到画布。如果没有这个工具,也可以在“栅格分析”分类里找“Projecting Raster”。双击算法节点,在参数设置里,“输入图层”点击右侧圆形按钮,选择之前添加的“输入栅格”;“目标CRS”点击按钮后在“算法参数”里选择“模型输入”,添加一个“坐标参考系”输入节点,或者直接点击“预定义值”,在选择对话框里搜索“CGCS2000 / 3-degree Gauss-Kruger CM 120E”与目标坐标系对应。如果不想每次运行都选一次坐标系,建议这里直接使用预定义值,把坐标系焊死在模型里,因为项目坐标系一般是固定的。

第三步,设置重投影输出。在同一个算法节点下方,找到“重投影栅格”输出,点击它,选择“保存到临时文件”,因为中间结果不需要保留。也可以选择“保存到项目临时目录”,这样如果模型中断,临时文件不会残留太乱。临时文件虽然看不到路径,但会随着模型运行结束自动管理,不用我们操心。

第四步,添加裁剪算法。搜索“clip raster”或“Clip Raster by Mask Layer”,拖到画布。双击打开参数设置,“输入图层”选择重投影算法的“重投影栅格”输出,“掩模图层”选择“裁剪边界(矢量图层)”输入节点;“匹配图层范围”勾选“掩模图层”的话,会把裁剪后输出栅格的范围限定到边界范围;“裁剪范围”也可以直接设为掩模范围。这里建议勾选“保留分辨率”并保留原始影像分辨率,避免裁剪后的像元尺寸意外变化。

第五步,设置最终输出。在裁剪算法节点下方,有“裁剪栅格”输出,点击它,这次选择“保存到文件路径”。弹出的路径选择对话框可以指定一个输出文件夹和文件基础名,但是因为是批量处理,这里不能写死一个文件名。正确的做法是:文件名中使用算法参数或模型表达式生成动态名称。QGIS模型构建器里,你可以在“输出路径”的文本框里使用数据定义按钮,输入表达式,例如:

@input_raster + "_clip.tif"

其中@input_raster是输入栅格图层的动态参数名,在运行时会被替换成每次输入文件的具体路径。更稳妥的做法是输出到同一个文件夹时,文件名写成:

base_name + "_clip.tif"

但模型构建器对变量引用的方式会有差异,我曾用过不同版本QGIS,比较通用的是在输出路径里点击数据定义按钮,选择“模型变量”,再选择输入栅格变量。如果版本较旧没有该按钮,也可以在输入节点属性的“描述”中做标记,或者在模型运行后用脚本来重命名。这一步是批量命名的关键,后文我会单独展开。

第六步,把这些节点连线。从“重投影”算法的“重投影栅格”输出端口拉一条线连到“裁剪算法”的“输入图层”端口;把“裁剪边界”输入节点的输出端口连到“裁剪算法”的“掩模图层”端口。注意连线时从哪个端口出发、连到哪个端口,不要连反,否则算法执行时提示数据类型不匹配。

第七步,右侧参数设置,修改模型名称和分组。在“模型属性”对话框里把模型命名为“批量裁剪重投影”,保存模型到默认位置,也可以导出一个.model3文件用于分享。最后点击工具栏上的绿色“运行”按钮,模型对话框弹出,选择“输入栅格”为当前影像文件夹里的任意一幅,选择“裁剪边界”为行政边界图层,点击运行,单幅测试通过后再进行批量。测试时建议先只用一幅影像跑通,确认输出范围和坐标系正确,再批量执行。

3.3 运行模型与结果检查

运行模型时,画布下方会出现一个“结果”面板,显示每个节点的执行状态,绿色勾表示成功,红色叉表示失败,黄色警告表示有异常但没中断。执行失败时,点击节点的“详情”按钮可以看到完整日志,包括GDAL库报出的具体错误。我强烈建议正式批量之前,无论模型编辑多简单,都要做一次“单输入验证”,不要一上来就全量跑,省得几十幅跑完才发现流程设定有问题,又得重来。

结果检查时优先看三样东西:输出文件数量是否与输入一致、每个文件能否正常在QGIS中打开、坐标系属性是否正确。批量处理经常出现个别文件因为原始数据异常而失败,理性做法是看失败列表,单独修复这几个源文件后重跑,而不是整个流程推翻。我在实际项目里一般会保留一个“已处理”清单,记录每个源文件对应的输出状态,方便追溯。

4. 让模型更通用:参数化、批量命名与迭代

4.1 参数化的设计原则

模型跑通一次不算本事,跑通一百次才叫生产力。要让模型经得起反复使用,关键就在于参数化设计。所谓参数化,不是简单地把“输入图层”做成变量,而是要识别出哪些参数会随场景变化、哪些参数应该固定。

我总结过一套参数化优先级:第一优先级是数据源,比如输入栅格、输入矢量、字段名,这些几乎每次都需要换,务必要做输入节点;第二优先级是环境参数,如目标坐标系、像元大小、压缩选项,这些通常一个项目里是固定的,建议直接写死成预定义值,减少运行时的交互,也防止同事选错;第三优先级是流程控制类,比如是否裁剪、是否计算坡度这类开关性质参数,可以用“布尔值”输入节点暴露出来,也可以写死,取决于使用者是否需要有这个选择权。

一个设计良好的模型,运行对话框应该让人一看就明白“要我提供什么、系统将干什么”,而不是弹出一堆看不懂的高级选项。我见过有人把重投影的六七个高级参数全部暴露成输入框,结果每次运行都要小心翼翼,这反而降低了复用价值。参数越少的模型越容易被他人正确执行,逻辑正确性由模型内部保证。

4.2 输出命名规则与防覆盖

批量处理最容易翻车的就是输出命名,很多模型跑完,发现所有结果都写成同一个文件名,互相覆盖,只剩最后一幅图,欲哭无泪。QGIS模型构建器处理动态命名的方法,需要理解“按行迭代”的含义。当你在模型对话框里选择多个栅格文件作为输入时,QGIS实际上会对每一行输入单独执行一次模型,所以只要让输出文件名随输入文件名变化,就不会互相覆盖。

具体操作上,双击裁剪算法节点,在“裁剪栅格”输出的“文件路径”参数后点击数据定义按钮,选择“编辑”,在表达式对话框中输入类似:

concat( replace(@input_raster, '.tif', ''), '_clip.tif')

其中@input_raster是“输入栅格”参数在模型中的变量名。不过要注意,不同版本QGIS的变量命名方式略有差异,建议在模型编辑器中点“模型属性”→查看参数定义来确认变量名。更直观的办法,是给输入栅格节点设置一个“描述”,然后在表达式中通过描述名引用。表达式解析出来的路径是相对于运行时对话框的当前目录的,建议使用绝对路径,可以通过@project_folder或其他内置变量构造路径,或用file_dirname(@input_raster)取得输入文件所在目录,确保输出和输入在同一文件夹下。

如果嫌表达式复杂,还有一个更省事的方案:给“裁剪栅格”输出设定一个固定基础路径,比如“E:/output/clip”,然后在运行完批量模型后,使用QGIS的“重命名文件”功能或Python脚本批量给文件添加后缀。但这样会多一个步骤,不够优雅。我自己的习惯是直接在模型里用表达式解决,一次写好,后续运行就不操心了。

4.3 把模型变成工具箱按钮

模型写好后,你可以把它从“模型构建器”窗口拖到“处理工具箱”面板中,它就会作为一个普通算法出现在工具箱列表里,名字是你定义的模型名称,双击即可运行。这样你就可以像使用QGIS内置算法一样调用自己的模型,也可以把它进一步嵌入另一个模型,实现“嵌套模型”。

这个功能很实用。比如我建了一个“单幅历史影像预处理”模型,然后建了第二个“全区域批量处理”模型,把第一个模型作为算法节点拖进去,对一批影像自动循环调用第一个模型。这种分层嵌套让逻辑更清晰:底层模型管单文件的标准处理,上层模型只管循环和文件管理,改底层逻辑时不用动上层结构。

需要提醒的是,模型一旦放进工具箱,它的图标会和普通工具一样,但点击运行时依然会弹出模型参数对话框。团队协作时,把.model3文件放到共享目录,其他人通过“处理”→“模型构建器”→“导入模型”就能加载,不用拷项目文件。

5. 高级玩法:组合条件、日志记录与并行处理

5.1 条件分支与按字段筛选

模型构建器的能力不止“一条线串到底”,它还能做条件判断和分组处理,有点类似编程里的if分支。实现方式是通过“条件表达式”算法或“按表达式筛选”功能。你可以在模型里添加“提取矢量数据”或“使用表达式筛选”算法,把不符合条件的要素剔除掉,然后接不同的下游处理路径。

举一个实际案例:我有一个按面积分层的图斑处理需求,面积大于1000平方米的图斑走“简化边界”流程,面积小于等于1000平方米的图斑走“删除”流程。在模型中拖入“按表达式筛选”算法,表达式写"area" > 1000,它的输出分为两支,一支连接边界简化算法,另一支连接一个“移除要素”算法,最终再合并结果。这样模型就能自动区分大小图斑,不同处理逻辑各走各的路,执行时全自动判断。

另外,“按字段分组”也是模型构建器的常见用法。如果你想按图斑的“用地类型”字段把数据拆分成多个输出,可以用“按属性分割矢量”算法,它会依据字段值把输入数据拆分到多个输出图层,后续可以按组做不同制图或统计分析。这在批量专题制图时非常管用,比我手动按字段筛选再逐个导出一气呵成得多。

5.2 日志记录与异常监听

模型跑批量的时候,最怕的就是静默出错。有些问题是运行时不报错但结果不对,比如原始栅格坐标系不完整,重投影后整个图像错位到海里,但流程正常跑完不中断。为了及时发现这类问题,我给模型加了“日志输出”节点,把输出文件路径、源文件路径、运行时间等信息写入一个CSV文本文件。

实现方法是在模型里添加“创建或更新文件”或“使用表达式生成文本”算法,把模型变量(如@input_raster、@model_output)拼接成一行文本,再用“写文本文件”算法追加到指定日志文件。模型每执行一个输入文件,就会在CSV里追加一行记录,排查问题时一眼就能看到哪个源文件成功、哪个失败、输出去哪了。虽然这个手动方案不及完整日志框架,但在纯可视化环境下算是最轻量且可靠的手段了。

此外,QGIS模型构建器执行时,每个算法节点下方会显示运行时长和结果摘要,这些信息会保存在模型执行的“结果”窗口中。批量运行结束后,我习惯把“结果”窗口里的日志全部复制到一个文本文件里归档,这个文档是项目交付时很宝贵的过程记录。

5.3 关于并行和性能的实测经验

很多人会问:模型构建器能多线程并行处理吗?严格说,默认情况下模型中的算法都是一个接一个顺序执行的,但QGIS提供了“运行算法时使用多个线程”的设置来提升性能,具体在“处理”→“选项”→“常规”中可以调整脚本和算法的线程数量。实际上,GDAL底层的很多算法本身就支持多线程,比如重投影、裁剪这类工具,单次内部已经能吃到多核红利,所以不必太担心单条算法卡在单核上。

真正的并行瓶颈在于模型批量循环。当我让模型批量处理100幅影像时,它是一幅接一幅处理的,没有默认的“任务并行”。如果你确实需要同时跑多组数据,可以开多个QGIS进程,每个进程分配不同的源文件分组,这样就能实现进程级并行。我实测过一次,开3个QGIS窗口同时跑三组模型,整体吞吐量能提升到接近三倍,但代价是内存占用激增——栅格运算非常吃内存,机器只有16G内存时尚且会卡,建议32G内存以上再考虑这招。

另外一个小优化技巧是源文件目录访问速度。批量处理栅格数据时,硬盘IO常常是瓶颈,优先把源数据和输出目录放在本地固态盘上,而不要放在网络驱动器。有一次我把输出目录放到了公司NAS上,本来模型跑单幅18秒,网络受了干扰直接变成40多秒,当时还以为是算法慢,排查半天才意识到是网络传输拖了后腿。

6. 常见问题与排查经验实录

6.1 常见错误速查表

这里把我在实际使用中遇到的高频问题整理成一张速查表,方便大家遇到类似报错时快速定位。

错误现象常见原因解决办法
模型运行时提示“输入图层无效”输入通配符路径不存在,或输入图层字段类型不匹配检查输入节点对应的文件路径是否存在,确认图层名称和字段名称拼写正确
重投影后输出范围与预期不符源坐标系定义不完整或使用了错误的坐标系参数用QGIS识别源数据坐标系,必要时先给源数据赋值正确坐标系再重投影
裁剪结果有锯齿状边缘且范围不对掩模图层与栅格范围差异太大,没有勾选“匹配图层范围”在裁剪算法参数中勾选“匹配图层范围”并选择掩模图层,同时确认掩模坐标正确
输出文件被覆盖输出路径写死了固定文件名,没有使用动态表达式在输出路径中使用数据定义表达式,拼接输入文件名字段
模型运行中途失败但之前成功过某个新输入数据的格式异常、字段名缺失查看失败节点的日志,单独处理异常数据,而不是重跑整个模型
模型在工具箱中无法找到模型没有保存到用户目录或导入不完整在模型构建器窗口保存模型,并检查“处理”菜单中刷新工具箱
批量处理到一半手动中断后临时文件残留临时输出未清理模型运行时临时文件一般自动清理,若残留可进入“处理”选项修改临时目录位置并手动清理

6.2 几个特别容易踩的坑

第一个坑是坐标系混用。模型里不同图层如果没有统一坐标系,在裁剪、合并等操作时会出现“输入未对齐”的警告,有时候QGIS会自动转换,有时候则不会,结果就是处理结果偏移。我的习惯是:所有输入矢量进入模型前先“重投影”到目标坐标系,所有栅格进入处理流程前先确认坐标系有效,宁愿多跑一步重投影,也不让下游带着隐患执行。

第二个坑是表达式引用变量名不稳定。QGIS不同小版本的模型变量名有时会改变,比如之前用@input_raster能引用,升级到3.30版本后可能需要用@图层输入名称_...这种方式。每次升级QGIS后,我都建议重新验证一次模型,不要只看版本日志就想当然。模型验证按“模型”→“验证所有算法”可以快速找出哑参数,这是我最先会做的操作。

第三个坑是批量处理前忘记检查源文件命名。如果一批文件里有文件名带空格、中文、括号,模型表达式拼接路径时可能解析失败或路径被截断。先把文件名统一规范成“字母数字+下划线”的格式,几乎能免掉一批莫名其妙的问题。别问我怎么知道的,都是教训。

第四个坑是裁剪算法版本差异。QGIS里“裁剪栅格”工具有多个实现版本,一是GDAL自带的“Clip raster by mask layer”,二是SAGA提供的“Raster clipping”,两个算法参数和结果细节都略有不同。GDAL的更适合批量大影像处理,内存控制更好;SAGA的裁剪结果有时会在边界处出现一行空值,用作坡度分析会有影响。所以我默认都用GDAL版,经验稳定。

7. 补充技巧:让模型用上卫星底图与批量出图

7.1 在模型中使用天地图做底图

这部分作为补充,不算模型构建器的核心,但和实际项目结合非常紧密。很多朋友问过QGIS里加载卫星影像、天地图底图的问题。在QGIS中,常通过XYZ Tiles或WMTS方式加载卫星底图。以天地图为例,加载影像底图的常见做法是:在“图层”面板中右键“添加图层”→“添加XYZ图层…”或使用WMTS服务,填入对应的服务地址和密钥。注意天地图标准服务通常需要配置正确的坐标系和请求许可信息,不同来源的服务地址可能不一样。

如果你想在模型构建器中引用天地图底图来进行批量出图,比如给每幅行政图自动配一张卫星影像背景图,思路就是先在QGIS主界面加载好天地图图层,然后在模型中加入“打印布局”相关算法或“根据图层创建地图册”算法,将天地图作为一个背景图层引用。不过这一块的实现依赖于QGIS内建的“布局地图”批量导出功能,模型构建器直接操作布局的能力相对有限,我更推荐单独用布局管理器配合“Atlas”功能完成批量出图。天地图只作为底图来源,和模型构建器是两层逻辑,不用强行揉在一起。

7.2 批量出图的一个简便方案

如果你真的需要“批量出图+每幅图自动带底图”,我的做法是:先用模型构建器把数据处理成按图幅分割的成果,比如每个行政村单独输出一幅专题图数据,再回到QGIS主界面用“打印布局”创建一份模板,启用布局的“Atlas”功能,把覆盖图层设为行政村边界,然后把卫星底图设为布局的背景地图。这样当Atlas运行时,它会自动遍历每个要素,生成一页页带对应范围的地图。这套流程虽然不是模型构建器直接控制的,但它和模型构建器刚好形成互补:模型做数据准备,Atlas做批量制图输出,一条自动化链路就完整了。

关于GLM的细节,这里强调一下,天地图影像等在线底图服务对网络环境有一定要求,而且不同区域的服务可用性差异也比较大,日常做技术验证时可以多准备一个本地缓存底图或OSM底图作为备选,避免项目汇报当场拉不起图层的尴尬。这个建议同样适用于加载其他在线地图服务,比如部分公开的URL在国内访问不稳定,建议提前缓存或使用可靠的服务源。

8. 我的几个习惯性建议

最后分享几条用QGIS模型构建器做批量处理后沉淀下来的个人习惯,不一定适合所有人,但很值得参考。

模型命名一定要带版本号和日期。我见过团队里同一个“批量裁剪模型”被覆盖了五六次,最后一次还少了关键参数,项目阶段成果全废。现在我保存模型时,文件名都会写成类似“批量裁剪重投影_v20250610.model3”这种格式,每次改动都另存新版本,出了分歧还能回滚。

不要迷信模型的“自动验证”功能。模型构建器验证算法是否能正常执行,倒是能帮你找出参数没有绑定的地方,但也仅仅是“参数有没有值”这一层,它验证不了“参数逻辑是否符合你的预期”。我遇到过验证完全通过、运行也不报错的情况,结果因为栅格重采样算法我选了“最邻近”,出图以后纹理粗糙得没法看,而日志上只有一个黄色警告。所以重要成果处打开输出影像目视检查一次,一定要做。

另外,有条件的话学一点QGIS的Python处理框架,也就是使用“处理”模块的Python脚本,会大有帮助。模型构建器里每个算法节点其实都可以“导出为Python命令”,你只要选中一个算法,点“高级→导出Python命令”,就能看到对应的处理脚本。看懂它,你就能理解模型的本质只是可视化封装;而当你需要更复杂的循环、条件判断、异常处理时,直接改Python脚本灵活度高得多。我很多批量处理模型后来都做了一版Python脚本,二者互为备份,给不同技术水平的同事选择适合自己的方式。

这篇内容从“为什么需要模型构建器”讲到“怎么搭一个能复用的批量处理流水线”,再到“常见坑和排查经验”,基本覆盖了我日常用QGIS做批处理的核心内容。如果你真想把手里的重复劳动解放出来,建议现在就去把最常做的那套流程拖进模型构建器。第一次建模可能需要半小时,但以后每次执行都能省下好几倍时间,这笔账怎么算都划算。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询