基于docker的QGIS软件应用指南(零)

768 阅读3分钟

QGIS安装

No module named 'qgis'
No module named 'PyQt5'

在基于QGIS的开发过程中,其安装环境的搭建是最为困难和复杂的一步,可以说如果安装环境问题得到了解决,那么QGIS开发中最困难的步骤就已经被解决了,粗略估计我大约尝试了18个小时左右,构建QGIS开发环境,最终摸索出来了一个具有很强的复现性的方法,将其中关键步骤记录于此,做一个积累总结,从零到一摸索实现了这个方法,带给了我久违的喜悦与成就,希望这篇文章能作为我2023年第一个月的成果代表,在日后岁月的打磨中,熠熠生辉。

技术路线

和目前所有流行的软件工程流程相似,作为一个顶级开源项目,QGIS社区维护了一份容器镜像(hub.docker.com/r/qgis/qgis),是一份已经构建好的应用环境,镜像基础是 Ubantu 22.04.1 LTS (Jammy Jellyfish),其中的QGIS工作目录是/QGIS,在这个镜像环境中维护了所有使用和二次开发所依赖的环境,理论上无需进行比较让人头疼的环境变量配置,但是它有一个最大的问题,就是 qgis 自身是一个利用Python 和 qt 开发的具有 GUI 的桌面程序,在容器的命令行环境中,是无法正常启动的,而且 qgis 官方支持的 pyqgis 扩展库中的 GUI 组件也同样无法使用,这对于二次开发扩展来说,是一个致命问题。

我一直笃信的观点是:"发现问题是解决问题的第一步",通过仔细研究 docker 容器和 host 机器间的通信机制,我发现只要解决容器内的 GUI app 与宿主机通信的问题,就能够完成 GUI软件容器化 这个艰巨的任务!好在国内外已经有了很多开发者做出了探索,我们把 GUI APP 执行所需要的软件环境抽象成为一个 Bins/Libs 层,GUI APP 是跨过了这回一层,和宿主机进行通信,GUI APP 的执行环境是基于 Linux 的,而Linux 的GUI与软件底层是通过 Socket 进行通信的,这就为它与宿主机共享GUI奠定了基础:docker 容器的通信模型主要有三种:host 连接,bridge 连接,与自定义网络连接,其中 host 连接较为适合这种方式,容器通过 host 连接访问到宿主机的端口,并传输GUI显示需要的数据,宿主机充当了容器的外设,进行了GUI的显示。

在 windows 环境的宿主机中,需要安装一个类似于Linux GUI shell 的软件,用来承接容器的 GUI 界面,这个软件叫VcXsrv(sourceforge.net/projects/vc…

操作步骤

主要的目的是在 windows 宿主机环境下运行起qgis容器并使用,默认认为宿主机已经安装了 docker v20.10.16

  1. 下载 VcXsrv (sourceforge.net/projects/vc…),并进行安装
  2. 安装成功后进行启动

  1. 拉取 Qgis 镜像并运行容器

docker run -it --rm -e DISPLAY=host.docker.internal:0.0 --name pyQGIS --net=host qgis/qgis qgis

发现QGIS已经能在本地运行起来了!

结语

看到QGIS的loading图,感觉这18个小时彷徨无措的幽暗中透出了光明,这光明是如此美好,这就是技术探索的魅力吧,我做了一件有意义的事情,剩下的细节,买个关子,后面在容器应用中进行总结!

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,点击查看活动详情