news 2026/9/9 19:05:18

QGIS二次开发入门:拆解官方PyQGIS例子,掌握核心API

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
QGIS二次开发入门:拆解官方PyQGIS例子,掌握核心API

简介:本资源是QGIS官方示例代码合集,面向地理信息系统初学者、二次开发人员及开源GIS工具实践者,旨在解决国内QGIS编程学习资料匮乏、示例零散、入门门槛高的实际问题。压缩包共220个文件,涵盖C++源码(20个.cpp、11个.h)、构建脚本(15个CMakeLists.txt、3个Makefile)、界面资源(6个.ui、6个.qrc)、矢量与栅格测试数据(shp/dbf/prj/shx/tif等)以及配套文档与图片(21个.png、5个.jpg、4个.html),整体仅1.1MB,轻量易用。已有355人学习下载,说明其在QGIS插件开发、地图渲染、矢量属性访问、自定义地图工具编写等核心场景中具备较强参考价值。目录结构按功能模块组织,从Hello World风格的样式设置到橡胶带交互、栅格加载、标签配置等进阶操作,完整覆盖QGIS C++ API典型应用路径,可直接编译运行并作为二次开发的可靠起点。 我这几年前前后后带过不少人入门QGIS二次开发,每次被问到“PyQGIS从哪下手”,我的答案从来没变过:先啃官方例子。不是让你把几千行源码逐行读完,而是要知道官方例子的组织方式、核心调用模式,然后照着改、照着跑、照着拆。这个项目标题叫“qgis官方例子学习代码”,说白了就是一条被验证过无数次的入门路径。今天我把这条路径完整拆给你看,包括官方例子藏在哪、哪些例子性价比最高、怎么把示例代码改成自己的工具,以及我自己踩过的那些坑。

1. 整体设计:为什么“啃官方例子”是最快的入门路径

1.1 官方例子到底藏在哪里

很多人学PyQGIS的第一个障碍,不是语法,而是“找不到代码”。QGIS的官方例子其实分布在三个地方,我按优先级给你排好:

第一优先级:QGIS安装目录里的Python插件源码。以Linux下通过apt安装的QGIS为例,路径通常在/usr/share/qgis/python/plugins/,Windows下一般在C:\Program Files\QGIS 3.xx\apps\qgis\python\plugins\。这里面是Processing工具箱的全部内置算法,每个算法都是一个独立的Python文件,代码量从几十行到几百行不等。比如processing/algs/qgis/这个目录,你会看到buffer.pycentroids.pyintersection.py这些“教科书级”的例子,它们用的全是公开API,没有任何私有接口。

第二优先级:PyQGIS Cookbook(开发者 cookbook)。官方文档站在docs.qgis.org上,有中文版本,里面有大量的“加载图层”“遍历要素”“修改几何”的独立代码片段。这些片段虽然短,但每一段都可以直接跑,是理解API用法最干净的素材。

第三优先级:QGIS源码仓库。GitHub上的qgis/QGIS仓库,重点看python/目录,尤其python/console/python/pyplugin_installer/这两个目录,它们是用PyQGIS写完整功能应用的活教材。

1.2 一条被验证过的学习路线

关于“QGIS官方例子学习代码”,我建议你按这个顺序来,而不是今天看一个buffer、明天看一个centroids,毫无章法地乱刷:

阶段一:跑通文档片段(1周)。把Cookbook里的图层加载、要素遍历、几何修改这些代码全部复制到QGIS内置Python控制台里跑一遍。这个阶段的目标不是写代码,而是建立“调用直觉”——告诉大脑,QGIS里加载图层不是open(),而是QgsVectorLayer()QgsProject.instance().addMapLayer()

阶段二:拆解Processing算法(2~4周)。选10个常用的官方算法,逐个分析输入参数定义、处理流程、输出注册。这是我觉得收益最大的一步:Processing算法有统一的initAlgorithm()processAlgorithm()结构,你拆完10个以后,写插件或者独立脚本的骨架感就出来了。

阶段三:改写并造自己的轮子(持续)。把官方例子改造成自己的工具,比如官方有缓冲区算法,你就改成“根据属性字段动态设置缓冲区距离”;官方有矢量裁剪,你就改成“批量裁切多个图层”。改的过程才是真正“学到”的过程。

1.3 官方例子能让你学到什么

我自己的体会是,官方例子带来的最有价值的信息,不是某个API怎么用,而是QGIS官方推荐的代码组织和命名方式

举个例子:官方插件里处理图层,最常用的信号是layer.geometryChangedlayer.attributeChanged,在官方例子中出现的频率极高。你会发现它们处理“编辑后联动”这件事的思路是:先layer.startEditing(),然后捕获信号,最后layer.commitChanges()。这套三步走是官方反复使用的模式,你在自己的代码里用了,就少走很多弯路。

另外,官方例子还教会我“如何优雅地处理CRS(坐标系参考)”。新手最容易犯的错就是直接crs = QgsCoordinateReferenceSystem(4326)硬编码,但官方例子里统一用QgsCoordinateReferenceSystem.fromEpsgId(4326),并且每次做几何运算前都会检查sourceCrs.isValid(),这给我省了无数麻烦。

2. 核心细节解析:必须吃透的5个API模式

2.1 项目、图层、要素三层对象模型

学习QGIS官方代码,最先要搞清楚的是对象模型。QGIS里的数据组织是三层结构:

  • QgsProject:管理整个工程,比如添加/移除图层、保存/加载工程文件。官方例子里常用QgsProject.instance()获取全局单例。
  • QgsMapLayer(及其子类):代表一个图层,可以是QgsVectorLayerQgsRasterLayer
  • QgsFeature:图层里的一个要素,包含几何(QgsGeometry)和属性(QgsAttributes)。

官方例子里最常见的起始代码是这样的:

from qgis.core import QgsVectorLayer, QgsProject layer = QgsVectorLayer("/path/to/shapefile.shp", "my_layer", "ogr") QgsProject.instance().addMapLayer(layer)

第二行QgsVectorLayer三个参数分别是数据源路径、图层显示名、数据提供器类型。这里的ogr是QGIS里读写矢量数据的统一接口,它可以读shapefile、GeoJSON、GeoPackage,甚至DWG(经过转换后)。

你如果跑过官方例子,会经常看到providerType参数,它不只是ogr,还可能是memory(临时图层)、postgres(PostGIS数据库)等。想彻底理解,建议你把同一个例子分别改成这三种类型跑一遍,就明白参数的意义了。

2.2 信号槽机制:地图这件事必须靠监听

GIS应用和普通CRUD应用最大的区别是:地图状态会随着用户操作(平移、缩放、选中、编辑)不断变化。官方例子几乎都是靠信号槽来响应变化的,而不是靠轮询。

比如要实现“图层要素被编辑后自动更新统计信息”,官方例子的写法是:

def on_feature_changed(feature): print("Feature changed:", feature.id(), feature.attribute(0)) layer.featureChanged.connect(on_feature_changed) layer.startEditing() # 模拟修改一个要素 feat = next(layer.getFeatures()) layer.changeAttributeValue(feat.id(), 0, "新的属性值") layer.commitChanges()

这里是featureChanged信号在起作用。注意顺序:先连接信号,再startEditing(),最后commitChanges()。如果顺序反了,信号可能捕获不到任何变化。

实际项目里,还有一个官方例子反复使用的模式是用QgsMapToolIdentify做要素拾取,然后通过activeLayer().featureSelected信号把要素传给业务逻辑。如果你想做那种“点击地图某条路,显示它的属性信息”的功能,一定先去官方插件里搜这个信号。

2.3 几何操作:API的顺序感很重要

官方代码里,几何操作都是直接操作QgsGeometry对象。你要记住一个规律:QgsGeometry 是不可变的数据载体,每次操作都返回新的几何体

比如“根据拐点坐标创建多边形”的热搜词,官方写法是:

from qgis.core import QgsGeometry, QgsPointXY points = [ QgsPointXY(100.0, 0.0), QgsPointXY(101.0, 0.0), QgsPointXY(101.0, 1.0), QgsPointXY(100.0, 1.0), ] geom = QgsGeometry.fromPolygonXY([[points]]) print(geom.asWkt()) # 输出: POLYGON((100 0, 101 0, 101 1, 100 1, 100 0))

这里最容易被忽略的是[[points]]的双层列表结构。因为多边形可能有多个环(外环加内环),所以fromPolygonXY接收的是“环的列表”,每个环又是一个点列表。如果坐标是经纬度,记得要先设置好图层的CRS,否则面积计算和投影会出错。

2.4 图层编辑:事务式的startEditing和commitChanges

在QGIS官方例子中,对矢量图层的修改永远是三步曲:startEditing()开始编辑,修改操作(addFeaturechangeAttributeValuedeleteFeature),然后commitChanges()提交。

如果你连续操作多个要素,可以这样写:

layer.startEditing() for i in range(10): feat = QgsFeature(layer.fields()) feat.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(i, i))) layer.addFeature(feat) layer.commitChanges()

注意,一旦commitChanges()失败,比如数据源只读、字段约束冲突,程序不会自动回滚。官方例子一般会做这个检查:

if not layer.commitChanges(): print("Commit failed:", layer.commitErrors()) layer.rollBack() # 手动回滚

这个rollBack()是我看了很多官方算法之后才注意到的细节,不写你会踩大坑。

2.5 外部独立脚本的初始化模板

我见过太多人把代码写在QGIS插件里能跑,独立一跑就报错。原因是在独立Python脚本里使用PyQGIS,必须先初始化QGIS应用环境。

一个可用的模板是:

import sys from qgis.core import QgsApplication QgsApplication.setPrefixPath("/usr/bin", True) # 这里要写你QGIS的安装路径 qgs = QgsApplication([], False) qgs.initQgis() # 你的业务代码写在这里 qgs.exitQgis()

注意Windows下前缀路径一般是C:/Program Files/QGIS 3.xx/apps/qgis。如果没有设置setPrefixPathQgsApplication找不到Python插件和proj库,会报各种诡异的错误。这个模板在官方文档里没有明说,但在官方插件的测试代码里很常见。

3. 实操复现:从官方示例到你自己的自动化脚本

3.1 用QGIS内置控制台体验“加载图层并遍历要素”

我强烈建议你一开始不要写独立脚本,而是打开QGIS桌面端,点菜单“插件 → Python控制台”,在控制台里直接写代码,所见即所得,还能看print()输出。

先跑这个最简单的官方示例:

# 创建一个空的临时图层 layer = QgsVectorLayer("Point?crs=EPSG:4326", "temp_points", "memory") QgsProject.instance().addMapLayer(layer) # 添加三个点要素 layer.startEditing() for i in range(3): feat = QgsFeature(layer.fields()) feat.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(10 + i, 20 + i))) layer.addFeature(feat) layer.commitChanges() # 遍历要素 for feature in layer.getFeatures(): print(feature.id(), feature.geometry().asWkt())

先解释第一行:"Point?crs=EPSG:4326"是用URI方式定义一个内存点图层。这个字符串语法可以在官方示例里反复看到,它属于memory数据提供器的专用格式,后面的crs=参数指定坐标系。

跑完之后,你应该能在图层列表看到新图层,控制台输出三个要素的信息。如果你连这一步都跑通,恭喜你,PyQGIS的“Hello World”已经完成了。

3.2 复现官方示例:加载本地CSV点位图层并编辑

热搜词里有“我导入的csv点位图层qgis,怎么编辑”,这确实是高频需求。在官方例子中,CSV文件可以直接通过QgsVectorLayer加载,但与传统矢量文件不同,CSV没有几何定义,需要指定xy字段。

假设你的CSV有lonlat两列,代码是这样:

uri = "file:///home/user/points.csv?delimiter=,&xField=lon&yField=lat&crs=EPSG:4326" layer = QgsVectorLayer(uri, "csv_points", "delimitedtext") if not layer.isValid(): print("图层无效,检查路径和字段名") else: QgsProject.instance().addMapLayer(layer) print("加载成功,共", layer.featureCount(), "个点")

这个例子展示了delimitedtext这个数据提供器的用法。注意delimiter=,是逗号分隔符,crs=必须明确指定。要是CSV没有坐标,只有属性,QGIS也可以加载,但会是一个“无几何图形”的表图层,不能显示在地图上。

加载成功后,如果你要编辑,依然走startEditing()三步曲。但要记住,CSV是纯文本文件,QGIS不支持原地修改CSV文件本身,所以编辑通常要“另存为”一个GeoPackage或Shapefile:

options = QgsVectorFileWriter.SaveVectorOptions() options.driverName = "GPKG" error = QgsVectorFileWriter.writeAsVectorFormatV3(layer, "/path/to/out.gpkg", QgsCoordinateTransformContext(), options) if error[0] == QgsVectorFileWriter.NoError: print("导出成功")

3.3 复现官方示例:根据拐点坐标创建多边形

假设你手里有一串拐点坐标,想把它们做成一个面图层。这个需求在土地调查、规划领域特别常见。

官方例子的实现思路是这样的:

from qgis.core import QgsProject, QgsVectorLayer, QgsFeature, QgsGeometry, QgsPointXY coords = [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], ] # 转成QgsPointXY列表 points = [QgsPointXY(x, y) for x, y in coords] # 创建内存多边形图层 layer = QgsVectorLayer("Polygon?crs=EPSG:4326", "area_from_coords", "memory") QgsProject.instance().addMapLayer(layer) layer.startEditing() feat = QgsFeature(layer.fields()) feat.setGeometry(QgsGeometry.fromPolygonXY([points])) layer.addFeature(feat) layer.commitChanges() # 验证面积(需要投影到米制坐标系) area = feat.geometry().transform(QgsCoordinateReferenceSystem.fromEpsgId(3857)).area() print("面积(平方米):", area)

这里有个关键点:经纬度坐标下不能直接算面积。因为EPSG:4326的单位是度,面积单位是“平方度”,毫无意义。官方例子的做法是投影到Web Mercator(EPSG:3857)后再算面积,虽然精度一般,但符合大多数场景。如果你要高精度面积,建议用投影坐标系,比如CGCS2000的EPSG:4543(适用于北京地区)。

创建多边形时,fromPolygonXY的入参是一个“环列表”,即[points]。如果多边形带洞,你需要写成[外环点列表, 内环点列表]。新手最容易忘的是闭合问题——其实QGIS的fromPolygonXY会自动帮你闭合,你只需要提供不重复首尾顶点的列表就行。

3.4 复现官方示例:将线要素分割成两段

“qgis将线要素分成两段”也是一个高频需求。官方例子的原理,是用QgsGeometrysplitGeometry方法,在一个指定点处把线切开:

from qgis.core import QgsProject, QgsVectorLayer, QgsFeature, QgsGeometry, QgsPointXY line_layer = QgsVectorLayer("LineString?crs=EPSG:3857", "line", "memory") QgsProject.instance().addMapLayer(line_layer) line_layer.startEditing() feat = QgsFeature(line_layer.fields()) line_geom = QgsGeometry.fromPolylineXY([ QgsPointXY(0, 0), QgsPointXY(100, 0) ]) feat.setGeometry(line_geom) line_layer.addFeature(feat) line_layer.commitChanges() # 获取要素并求交点 feature = next(line_layer.getFeatures()) split_point = QgsPointXY(50, 0) # 要在(50, 0)处切开 # splitGeometry 返回(拆分后的几何列表, 在拆分点新增的顶点点列表, 是否成功) parts = line_geom.splitGeometry([split_point], True) if parts[2]: print("拆分成功,得到", len(parts[0]), "段") for part in parts[0]: print(part.asWkt()) else: print("拆分失败")

注意splitGeometry的这个签名在QGIS 3.20以后有微调,官方例子通常会检查返回的第三个值(布尔值)来判断是否成功。如果拆分失败,常见原因是拆分点不在几何内部(比如点距离线太远)。

拆分之后,如果你希望把多段线保存成同一个图层里的多个要素,还需要遍历parts[0]逐个addFeature

3.5 复现官方示例:批量构建金字塔与GeoPackage导出

栅格图层的“构建金字塔”是官方例子里的一个常见专题。用代码构建金字塔,主要是为了大影像加载时的显示性能。

官方API用法是:

from qgis.core import QgsRasterLayer raster = QgsRasterLayer("/path/to/landsat.tif", "landsat", "gdal") if not raster.isValid(): print("栅格无效") else: # 构建金字塔,重采样算法项可以用 "average"/"nearest"/"gauss" raster.buildPyramids([], "internal", "average") print("金字塔构建完成")

buildPyramids的三个参数分别是:金字塔级别列表(空列表表示使用默认级别)、存储方式(internal表示写入TIFF内部,external则生成.ovr文件)、重采样方法。这个操作适合对超大影像批量处理,比如一整个目录几十个GeoTIFF,脚本遍历一遍就全建好金字塔了,比在QGIS界面里一个个右键“构建金字塔”高效得多。

我自己处理过一批总大小约200GB的无人机正射影像,用这个脚本批量建金字塔,几台机器并行跑,一晚上搞定。友情提醒:构建金字塔时要先确认磁盘空间,外部金字塔(.ovr)会额外占原始大小的5%到15%,内部金字塔则直接增大TIFF文件体积。

4. 常见问题与排查技巧实录

4.1 怀疑“官方例子路径找不到”怎么办

很多人第一反应是去GitHub上搜,但其实最靠谱的办法是以你的本地安装为准。

  • 国内安装的Linux发行版,QGIS的Python插件路径一般在/usr/share/qgis/python/plugins
  • Windows用户通常走的是安装向导,路径形如C:\Program Files\QGIS 3.34\apps\qgis\python\plugins
  • macOS下如果你用Homebrew装的,路径一般是/opt/homebrew/share/qgis/python/plugins

如果实在找不到,也可以直接在QGIS的Python控制台里执行:

import processing print(processing.__file__)

这个文件路径会指向Processing插件的实际安装目录,官方算法模块就在它的上一级或者附近。

4.2 独立脚本一运行就报错:找不到QGIS核心库

这是最常见的坑。症状是你已经安装了QGIS,但在终端里python test.py却报ModuleNotFoundError: No module named 'qgis.core'

原因不复杂:你的Python解释器不知道QGIS库在哪里。解决办法有两种:

  • 使用QGIS自带的Python环境,通常在Windows下是“OSGeo4W Shell”,在Linux下直接python3可能就能用(如果你装的是系统包)。
  • 如果是自编译或非系统包安装,可以这样手动把路径加进去:
import sys sys.path.append('/usr/share/qgis/python') sys.path.append('/usr/share/qgis/python/plugins')

我个人建议,Windows用户优先用OSGeo4W Shell来运行脚本,这样环境变量自动配好,能省掉很多路径问题。

4.3 坐标系与投影导致的诡异结果

官方例子里经常出现面积计算为0、几何显示位置不对、叠加分析不出结果等情况,80%是坐标系问题。

我给你一个常规排查清单:

  • 图层属性里的CRS是否设置正确?鼠标放到图层上,看“坐标系”那一行。
  • 几何数据本身是不是带EPSG:4326经纬度,但图层却设成了EPSG:3857
  • 做几何运算前是否用transform(QgsCoordinateReferenceSystem.fromEpsgId(...))统一坐标系?

实测下来最稳妥的做法是:所有中间计算统一用EPSG:3857(Web Mercator),数据存库或导出时再转回原始坐标系。这个策略在官方很多算法里也能看到,比如距离计算、缓冲区分析,都会先投影再算。

4.4 MXD文件和DWG文件加载失败

“qgis怎么打开mxd”这个需求我隔三差五就能遇到,坦白说,QGIS本身并没有原生支持MXD格式。你只能用ArcGIS的导出功能把MXD转成lyr或GeoPackage,再传给QGIS。比较新的ArcGIS Pro版本支持导出到GeoPackage,老的MXD计划只能先保存成.mxd再手动转。

还有个办法是在QGIS中用qgis2web或者“导入”菜单下的某些插件,但兼容性都不理想。我建议你直接跟提供MXD文件的同事要原始数据(shapefile、GeoPackage、FGDB),比任何转换都靠谱。

DWG文件也是同样的道理。QGIS对DXF支持良好(ogr驱动能直接读取),DWG需要先借助外部工具转成DXF,然后再读取。网上有人推ODA File Converter免费转换器,实测下来转换大尺寸DWG会丢属性,慎用。

4.5 调试技巧:善用print和QgsMessageLog

官方插件代码在调试时,经常会用QgsMessageLog.logMessage()来输出日志,而不是简单的print()。因为print()在某些运行环境下不会显示在QGIS面板里,而QgsMessageLog会输出到“信息日志”面板。

from qgis.core import QgsMessageLog QgsMessageLog.logMessage("调试信息", "MyPlugin", Qgis.Info)

使用小记:第一个参数是消息内容,第二个是日志分组名(可以自定义,方便过滤),第三个是日志级别。在开发插件时,我都用这套方法来输出调试信息,到了正式发布时再关掉。

5. 一条更省力的“抄作业”路径:从Processing算法中学写插件

最后说一个我从官方例子里领悟到的高效思路:把Processing算法当成一个“官方写好的插件模板”来学

一个Processing算法的基本结构是这样的:

class MyAlgorithm(QgsProcessingAlgorithm): def initAlgorithm(self, config=None): self.addParameter(QgsProcessingParameterVectorLayer("INPUT", "输入图层")) def processAlgorithm(self, parameters, context, feedback): source = self.parameterAsSource(parameters, "INPUT", context) # ... 处理数据 ... return {"OUTPUT": outputLayer} QgsProcessing.registerAlgorithm(MyAlgorithm(), "myplugin:myalgorithm")

这个模板在官方所有算法里都大同小异。你只要套这个壳,里面写自己的业务逻辑,QGIS工具栏里就会出现一个可以带参数运行的工具。这比从头写一个插件要少掉很多样板代码,界面和参数对话框都是自动生成的。

学习时,你可以挑这几个官方算法逐行读:buffer.py(简单参数传递)、clip.py(多图层输入输出)、fieldcalculator.py(操作字段表达式)——这三个读完,你基本就知道插件开发的门道了。

6. 从官方例子到进阶:怎么把这些代码沉淀成自己的工具箱

6.1 搭建个人的代码片段库

我个人的习惯是,每学习一个官方例子,就把代码整理成一个带注释的.py文件,按功能分类放到自己的代码仓库里。比如“处理矢量”,“处理栅格”,“坐标系变换”,“地图出图”。几年下来,这个库已经几百个文件,很多项目直接用里面的函数,根本不用重新写。

整理的时候注意三点:一是统一使用QGIS3的API,不要再写QgsVectorLayerV2这种过时写法;二是每个函数都要有完整的中文注释,说明参数含义和使用场景;三是遇到好的官方例子里没有的小技巧,比如某种writeAsVectorFormatV3的复杂参数,单独记到一个“疑难杂症.md”里。

6.2 巧用QGIS内置的“脚本生成器”

QGIS里有一个“工具箱 → 图形处理模型”的功能,你可以把手动操作组合成一个模型,然后“导出为Python脚本”。这相当于让QGIS帮你自动生成PyQGIS代码,是一位天然的“官方例子生成器”。

我经常用这个方式处理重复任务:比如“加载多张栅格、统一裁剪、导出到同一目录”。先在模型设计器里拖一遍,然后导出成Python脚本,再手动优化成带参数和循环的版本。这个方法对新手特别友好,因为你能直观看到每步操作对应哪些API。

6.3 不要再踩的坑:版本兼容

学习官方例子时,特别要注意你手头QGIS的版本。QGIS 3.x 内部API变化很快,比如QgsPropertyQgsFeatureRequest的参数、QgsProcessingFeedback的输出方式,在不同小版本里都有差别。

一个比较实际的建议是:查官方文档时,先把右上角的版本切换成你安装的版本,再复制代码,否则极有可能跑不通。我的经验是,教程用的3.28LTR,和3.34或3.36的API差别很大,尤其是QgsVectorFileWriter.WriteFileError这类返回值的处理方式。

6.4 利用官方插件目录学做界面

如果你想进阶到带界面的插件开发,不要去看别人的博客讲一大堆PyQt5基础,直接翻官方插件源码。我特别喜欢看processing插件自带的UI代码,以及db_manager插件的树形列表代码,它们把QGIS的QgsDockWidgetQgsFileWidget等专用控件用得炉火纯青。照着这些代码复刻一遍,你会对“如何在QGIS里做界面”有最直接的理解。

我自己在做地图数据检查工具时,就是拿着官方插件里的QgsMapToolIdentifyQgsMessageBar配合的代码,改巴改巴就上项目了,效率极高。

写在最后

可能有人会觉得,啃官方例子长得慢,不如直接看视频课程来得快。但我的实战经验正好相反:视频看完觉得会了,一到自己动手还是脑袋空空;而源码拆真的能让你的肌肉记忆形成“API感”。我当年转型做QGIS二次开发的时候,第一个月就是坐在电脑前,把Processing算法的核心代码一行一行打印出来看,不懂就查文档、跑测试。这个过程虽然慢,但基础打得特别扎实,后来写任何脚本都不心虚。

几个实操阶段建议:先从加载图层、遍历要素这种十行代码的小例开始,跑通后立刻改造成自己的数据场景,然后尝试改Processing算法,最后才是写一个完整工具。中间遇到任何print输出不对、坐标系报错,就回看官方同类代码是怎么处理的——这比到处搜博客靠谱得多,因为官方代码永远跟你的QGIS版本最贴合。

希望这篇文章能帮你把“qgis官方例子学习代码”这条路走得更顺一点。如果你在拆官方例子的过程中也踩了什么有意思的坑,欢迎在评论区分享,大家一起避雷。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/5 16:33:43

皇室战争狗球流进阶:熔岩猎犬+气球兵防守反击节奏全拆解

最近一直在练空中推进体系,打得多了以后发现,狗球流并不是很多人以为的“无脑沉底狗、跟上球就完事”。它其实是一套对节奏、圣水计算、防守牌顺序要求都很高的卡组,尤其是在对手手里捏着法术、针对牌的情况下,能不能把进攻窗口打…

作者头像 李华
网站建设 2026/9/6 1:04:43

Overlay相机技术解析:从图层叠加到实时合成

第一次看到“绵绵很好_overlay”这个项目名时,我的第一反应是:这应该又是一个随手练手的小项目。名字像是一句碎碎念,但“overlay”这个关键词把主题说得很清楚——叠加层。再配合最近“overlay相机”这个热词,你会发现这类东西其…

作者头像 李华
网站建设 2026/9/6 8:16:32

Simulink Subsystem Reference:模块复用与模型组织新方案

在 Simulink 中面对一个动辄上千个模块、信号线密集到几乎无法滚动查找的模型时,很多工程师心里都会冒出同一个念头:如果这套逻辑能像写函数一样,定义一次、引用多次、修改一处全局生效,该有多省心。R2020a 之前,这个问…

作者头像 李华
网站建设 2026/9/5 15:58:35

从素材到成品:用ffmpeg与Whisper搭建短视频批量二创流水线

好,这次我们不聊代码仓库,也不聊模型权重,而是拆一个看起来一点都不技术的短视频标题:【盒盒短视频】TREASURE 260809 | D to the E, to the L-I-C-I-O-U-S|玹硕 道荣 炡禹第一眼是偶像物料,第二眼是粉丝二…

作者头像 李华
网站建设 2026/9/2 10:10:50

英伟达AGI热议背后:开发者必须掌握的驱动安装与模型部署实战

关于“英伟达再次实现AGI”的讨论,这两天在技术群里又刷屏了。每次黄仁勋在公开场合提到 AGI,舆论都会分两派:一派认为通用人工智能近在眼前,另一派则觉得这只是发布会上的“叙事包装”。我的看法更偏向后者——AGI 能不能实现、何…

作者头像 李华
网站建设 2026/9/5 20:47:46

Flutter慢读服务器:从一条命令逆向拆解服务架构

这次我们来看一个非常有意思的小型服务端实践:Flutter 慢读服务器。它的标题叫“一个命令的逆向实践”,听起来像安全方向的研究,实际上更接近工程拆解——把一条看似简单的启动命令,倒着追出它背后的参数解析、HTTP 服务、文本处理…

作者头像 李华