为了提高生产力,接触到了QGIS插件开发。从相关的知识准备,到实际插件开发,断断续续大约花了一周的时间,最后也算是实现了自己的目的,感觉有必要记录一下其中遇到的坑。

1 知识准备

进行QGIS插件开发,总体上需要两个方面的知识储备

  • 熟悉QGIS提供的各种类库和函数接口

    这方面最好的资料是官方文档,内容详细而且比较有条理。如果以后经常接触到QGIS二次开发的话,建议把整个文档好好看一遍,如果时间有限,也可以根据自己的需要有针对性的阅读

  • 了解PyQt的基本使用

    QT是C++编写的跨平台GUI库,PyQt是在QT基础上进行的封装,可以用于基于Python的GUI开发。QT本身功能很强大,但由于这里只是为了开发QGIS插件,因此根据自己的需要有选择的学习即可,时间充足也可以系统学习。我是在B站找的教程,奉上链接,不想看视频的也可以看相关的这里

  • 2 插件安装

    在进行QGIS插件开发前,需要下载2个插件,方便我们后续开发,插件安装,这里不在赘述

  • Plugin Builder3

    利用这个插件可以生成一个QGIS插件模板,在生成的插件模板基础上根据我们的需要进行二次开发,此外还提供了编译和部署工具,十分方面。关于插件的使用后面会详细介绍

  • Plugin Reloader

    利用这个插件可以动态加载QGIS已经安装的插件,这样在后续开发中如果对插件进行了改动,可以直接动态重新载入插件,而不用重启QGIS

  • 此外,QGIS官方还提供了First Aid这个插件用于插件开发Debug,不过我在实际开发中并没有用到,仅供大家参考

    3 生成插件模板

    接下里将详细说明,如何利用Plugin Builder3生成插件模板

    3.1 点击插件图标,打开插件模板生成窗口

    image-20220322211145348

    image-20220322211351773

    3.2 配置插件模板

    image-20220322211839013

  • Class name:封装插件的类名,需要符合Python类的命名规范,驼峰命名法即可
  • Plugin name:插件名
  • Description: 插件描述,后期插件部署后,将鼠标放在插件图标上,会出现该描述
  • Module name: 插件模板中,核心的python文件名
  • Version number:插件 版本
  • Minimum QGIS version: 运行该插件,所需要的最小QGIS版本
  • 3.3 点击next,输入插件描述,也可以直接跳过

    image-20220322212534136

    3.4 点击Next,选择插件模板窗口和插件在QGIS中的部署位置

    image-20220322212841571

    没有特别要求的话,插件模板窗口一般选择默认的Tool button with dialog,接着输入插件在QGIS中菜单项显示的文字,对应的就是Plugin Builder在QGIS菜单项中的文字,见下图

    image-20220322213457977

    最后选择,插件在QGIS中的部署位置,5个选项分别对应QGIS的5个菜单项

    image-20220322213656714

    这里要说明的是,后续插件部署配置后,插件图标也会出现在QGIS的工具条中,向其它插件一样,比如我开发的插件部署后的效果

    image-20220322213824592

    3.5 一路Next,最后选择生成的模板插件位置

    image-20220322215032267

    3.6 点击Generate生成模板插件

    image-20220322215204723

    第一个是生成的模板插件路径,也就是后续进行插件开发的位置,第二个是QGIS插件部署的位置,这个需要记住,当然在模板插件目录中的README.html文件和README.txt文件中也可以找到

    3.7 模板插件文件目录如下

    image-20220322215942084

  • _init_.py 是插件类的初始化文件
  • icon.png 是插件图标文件,也就是插件在QGIS工具条中的图标,可以根据自己的需要进行修改
  • Makefile 是make编译配置文件,如果后续利用make进行编译需要用到
  • pb_tool.cfg 编译配置文件,pb_tool(pbt)编译配置文件,后续用pbt_tool(pbt)编译的话需要用到
  • plugin_demo.py 插件核心文件,插件功能有关的开发主要在这里
  • plugin_demo_dialog.py 是利用make或pb_tool等编译工具编译QT 的ui文件生成的python文件,负责实现插件的UI界面
  • plugin_demo_dialog_base.ui 是QtDesigner的ui设计文件和qrc文件配套,后续可以利用QtDesigner打开改文件根据需要设计相应的界面,最后进行保存,再编译为对应的py文件
  • plugin_upload.py 不太清楚,可能是用于插件的加载
  • resource.py 利用make或pb_tool(pbt)编译resource.qrc生成的资源文件,主要记录了QtDesigner设计UI界面时用到的图片等数据,和.ui文件配套
  • 注意:

    根据官方文档的说明,每次在对.ui文件和.qrc文件进行修改后,都需要重新利用pb_tool或make进行编译,但根据实际开发经验来看,如果只对ui文件进行了修改,而没有引入新的资源文件如图片之类的,则不需要再次编译直接部署即可,但如果qrc文件也发生了变动,则必须要重新编译qrc文件,在利用pb_tool进行编译时,需要先删除之前已经编译好的文件,再在终端中输入pbt compile进行编译如果提示没有pb_tool,pip手动安装即可

    4 环境配置

    进行QGIS插件开发首推的IDE还是PyCharm,免费的社区版就可以了。其实我一开始用的是vscode,但实际使用体验很差,Qt部分的代码没有办法补全,所以换到了PyCharm。注意第一次用PyCharm打开插件工程目录,选择好解释器后,需要等待一段时间,期间PyCharm会对各种python库建立索引,索引建立完成后,代码补全功能就可以正常使用了,如果很长时间索引建立还没有结束,可以重启一下PyCharm

    这里放上我的PyCharm配置文件,是一个Windows批处理文件,每次点击运行这个批处理文件就可以了,第一次打开PyCharm需要设置解释器

    @echo off 
    set OSGEO4W_ROOT=F:\Program Files\QGIS 3.16.14
    set path=%OSGEO4W_ROOT%\bin;%WINDIR%\system32;%WINDIR%;%WINDIR%\system32\WBem
    
    call o4w_env.bat 
    call qt5_env.bat
    call py3_env.bat
    
    @echo off
    path %PATH%;%OSGEO4W_ROOT%\apps\qgis-ltr\bin
    path %PATH%;%OSGEO4W_ROOT%\apps\grass\grass78\lib
    path %PATH%;%OSGEO4W_ROOT%\apps\Qt5\bin
    path %PATH%;%OSGEO4W_ROOT%\apps\Python39\Scripts
    
    set QGIS_PREFIX_PATH=%OSGEO4W_ROOT:\=/%/apps/qgis-ltr
    set GDAL_FILENAME_IS_UTF8=YES
    set VSI_CACHE=TRUE
    set VSI_CACHE_SIZE=1000000
    set QT_PLUGIN_PATH=%OSGEO4W_ROOT%\apps\qgis-ltr\qtplugins;%QT_PLUGIN_PATH%
    set PYTHONPATH=%OSGEO4W_ROOT%\apps\qgis-ltr\python;%PYTHONPATH%
    
    set PYCHARM="F:\Program Files\JetBrains\PyCharm 2020.1\bin\pycharm64.exe"
    @echo on
    start "PyCharm with QGIS knowledge!" /B %PYCHARM% %*
    

    上述配置文件需要根据自己的QGIS和PyCharm安装路径进行修改,保存为bat文件即可

    5 开发部署

    5.1 Link Shell Extension下载

    有关Link Shell Extension的说明见下图:

    image-20220323094755337

    使用Link Shell Extension在QGIS插件安装目录下为我们自己开发的QGIS插件建立硬链接,这样每次在开发目录下对插件进行的修改会自动同步到QGIS插件安装目录,而不用我们去手动删除已部署的插件在重新部署,十分方便。Link Shell Extesion下载

    硬链接的建立步骤如下:

  • 在插件目录单击鼠标右键,再单击选择资源连接点
  • image-20220323095249308

  • 在QGIS插件安装目录下,鼠标右键创建为,选择目录连接点,即可
  • image-20220323095649322

    5.2 插架部署

  • 首先将自己开发的插件工程目录拷贝到QGIS插件安装目录下,如果已经用上述Link Shell Extension建立了硬链接,则此步骤跳过
  • 打开QGIS插件管理窗口,在已安装列表中,找到我们自己开发部署的插件,勾选上对应的复选框,启用插件
  • image-20220323100342328

  • 插件查看
  • 由于之前创建插件模板时,选择插件的部署位置为Plugins,因此在插件菜单项下可以看到我们部署的插件,此外插件图标也会出现在QGIS工具条上

    image-20220323100452239

    image-20220323100734958

  • 单击工具条按钮,打开开发部署的插件
  • image-20220323100826450

    5.3 PluginReloader 重载插件

    在开发中,会经常对部署的插件进行修改,此时可以利用PluginReloader动态重载部署的插件,而不用每次重启QGIS

  • PluginReloader 配置要重载的插件
  • image-20220323101131649

    image-20220323101203309

  • 单击PluginReloader图标重载插件
  • image-20220323101237566

    6 示例

    最后放上自己开发的插件,仅做参考

    由于自己是做遥感的,InSAR方向,经常需要查看某一点在时序影像中对应的时间序列并进行分析,GAMMA(InSAR处理软件)虽然提供了时序查看功能,但并不好用,也无法与ArcGIS或QGIS配套使用,所以索性自己开发了一个,类似于ArcGIS中的多只提取至点工具。

    至于为什么不在ArcGIS基础上进行开发,科技无国界…………,还是早点拥抱开源以防万一比较好

    大概长这样,第一接触Qt做的很丑,但基本功能算是实现了

  • 选择时序影像目录,批量添加时序影像,后续可以对影像的顺序进行调整,也可以增加额外的影像(不要求所有的影像在同一目录下)或删除不需要的影像
  • image-20220323102607597

  • 切换到时序曲线选项卡,单击地图上某一点,即可提取该点在时序影像中对应的时间序列并绘制时序曲线,下方表格也记录了时间序列的数值。如果时序影像有多个波段,可以事先选择要查看的波段
  • image-20220323103119863

    可以将该时序曲线保存为图片,还可以将该点的时序记录添加到时序记录选项卡中,批量导出。

  • 批量导出时序记录
  • image-20220323103529416

    在时序记录选项卡中可以批量导出时序记录,导出格式可以为**.csv,xls,.shp**,默认格式是shp文件

    在QGIS中打卡导出的时序采样点,属性表中记录了采样点的时间序列数值

    image-20220323103724599

    image-20220323103757742

    7 源代码

    插件的源码已经放到GitHub中了,如果需要的话可以自行下载,自己水平有限,仅供参考

    源码连接

    来源:Chaoying.

    物联沃分享整理
    物联沃-IOTWORD物联网 » QGIS插件开发详细教程

    发表评论