为了提高生产力,接触到了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 插件图标,打开插件模板生成窗口
3.2 配置插件模板
- Class name:封装插件的类名,需要符合Python类的命名规范,驼峰命名法即可
- Plugin name:插件名
- Description: 插件描述,后期插件部署后,将鼠标放在插件图标上,会出现该描述
- Module name: 插件模板中,核心的python文件名
- Version number:插件 版本
- Minimum QGIS version: 运行该插件,所需要的最小QGIS版本
3.3 next,输入插件描述,也可以直接跳过
3.4 Next,选择插件模板窗口和插件在QGIS中的部署位置
没有特别要求的话,插件模板窗口一般选择默认的Tool button with dialog,接着输入插件在QGIS中菜单项显示的文字,对应的就是Plugin Builder在QGIS菜单项中的文字,见下图
最后选择,插件在QGIS中的部署位置,5个选项分别对应QGIS的5个菜单项
这里要说明的是,后续插件部署配置后,插件图标也会出现在QGIS的工具条中,向其它插件一样,比如我开发的插件部署后的效果
3.5 一路Next,最后选择生成的模板插件位置
3.6 Generate生成模板插件
第一个是生成的模板插件路径,也就是后续进行插件开发的位置,第二个是QGIS插件部署的位置,这个需要记住,当然在模板插件目录中的README.html文件和README.txt文件中也可以找到
3.7 模板插件文件目录如下
- _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= 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的说明见下图:
使用Link Shell Extension在QGIS插件安装目录下为我们自己开发的QGIS插件建立硬链接,这样每次在开发目录下对插件进行的修改会自动同步到QGIS插件安装目录,而不用我们去手动删除已部署的插件在重新部署,十分方便。Link Shell Extesion下载
硬链接的建立步骤如下:
- 在插件目录单击鼠标右键,再单击选择资源连接点
- 在QGIS插件安装目录下,鼠标右键创建为,选择目录连接点,即可
5.2 插架部署
- 首先将自己开发的插件工程目录拷贝到QGIS插件安装目录下,如果已经用上述Link Shell Extension建立了硬链接,则此步骤跳过
- 打开QGIS插件管理窗口,在已安装列表中,找到我们自己开发部署的插件,勾选上对应的复选框,启用插件
- 插件查看
由于之前创建插件模板时,选择插件的部署位置为Plugins,因此在插件菜单项下可以看到我们部署的插件,此外插件图标也会出现在QGIS工具条上
- 单击工具条按钮,打开开发部署的插件
5.3 PluginReloader 重载插件
在开发中,会经常对部署的插件进行修改,此时可以利用PluginReloader动态重载部署的插件,而不用每次重启QGIS
- PluginReloader 配置要重载的插件
- 单击PluginReloader图标重载插件
6 示例
最后放上自己开发的插件,仅做参考
由于自己是做遥感的,InSAR方向,经常需要查看某一点在时序影像中对应的时间序列并进行分析,GAMMA(InSAR处理软件)虽然提供了时序查看功能,但并不好用,也无法与ArcGIS或QGIS配套使用,所以索性自己开发了一个,类似于ArcGIS中的多只提取至点工具。
至于为什么不在ArcGIS基础上进行开发,科技无国界…………,还是早点拥抱开源以防万一比较好
大概长这样,第一接触Qt做的很丑,但基本功能算是实现了
- 选择时序影像目录,批量添加时序影像,后续可以对影像的顺序进行调整,也可以增加额外的影像(不要求所有的影像在同一目录下)或删除不需要的影像
- 切换到时序曲线选项卡,单击地图上某一点,即可提取该点在时序影像中对应的时间序列并绘制时序曲线,下方表格也记录了时间序列的数值。如果时序影像有多个波段,可以事先选择要查看的波段
可以将该时序曲线保存为图片,还可以将该点的时序记录添加到时序记录选项卡中,批量导出。
- 批量导出时序记录
在时序记录选项卡中可以批量导出时序记录,导出格式可以为.csv,xls,.shp,默认格式是shp文件
在QGIS中打卡导出的时序采样点,属性表中记录了采样点的时间序列数值
7 源代码
插件的源码已经放到GitHub中了,如果需要的话可以自行下载,自己水平有限,仅供参考
源码连接
今天的文章 QGIS插件开发详细教程分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/88620.html