安装前准备

  • unbuntu 22.04 LTS

  • Qgis 3.34.x Prizren LTR

安装Qgis

Installation Guide · QGIS Web Site

PyQgis开发手册

PyQGIS开发者手册 (luolingchun.github.io)

此处主要参考1.4.1 在独立脚本中使用PyQGIS

from qgis.core import *
# 提供qgis安装位置的路径(windows默认:C:\Program Files\QGIS 3.x\apps\qgis-ltr)
QgsApplication.setPrefixPath("/path/to/qgis/installation", True)
# 创建对QgsApplication的引用,第二个参数设置为False将禁用GUI
qgs = QgsApplication([], False)
# 加载提供者
qgs.initQgis()
# 在这里编写代码,加载一些图层,使用处理算法等
# 脚本完成后,调用exitQgis()从内存中删除提供者和图层注册
qgs.exitQgis()
  • 需要注意linux中setPrefixPath为("/usr"),而不是("/usr/share/qgis"),使用后者会导致非本地图层(如postgre,wms请求等)加载失败。

  • 如何确认setPrefixPath,可以在qgis python控制台中输入print(QgsApplication.showSettings())获取

Unbuntu 22.04 中使用PyQgis注意事项

  • 使用上面脚本初始化qgis时,会出现xcb相关错误,原因是qt无法联系到显示器。

  • 解决方案是首先 vim ~/.bashrc 然后在里面添加 export QT_QPA_PLATFORM='offscreen'

  • source ~/.bashrc使文件更改生效

  • 然后vim /etc/profile , 添加 export DISPLAY=:0.0

  • 此时qt将采用无屏幕形式渲染

  • pygis脚本可以正常使用。

  • Qt5: QXcbConnection: Could not connect to display - 知乎 (zhihu.com)

Qgis桌面制作打印布局

4.1. 课: 使用打印布局 — QGIS Documentation 文档

PyQgis调用打印布局输出pdf示例

import os

from qgis.core import *
import qgis.utils

# 提供qgis安装位置的路径(windows默认:C:\Program Files\QGIS 3.x\apps\qgis-ltr)
QgsApplication.setPrefixPath("/usr", True)
qgs = QgsApplication([], True)
qgs.initQgis()
project = QgsProject.instance()
project.read(r'/home/gis/qgis/yaan.qgz')
print(project.fileName())

layouts = project.layoutManager().layouts()

# project.layoutManager.readXml()

layout = layouts[2]

# 获取布局中的地图项
map_item = layout.itemById('map1')  # 替换 'Map 1' 为你的地图项名称

# 设置地图范围(经度、纬度范围)
# 30.05116767708873482" xmin="102.74848462508383307" xmax="102.78036956325256313" ymax="30.07212707680720243
o_ymin = 102.74848462508383307
o_ymax = 102.78036956325256313
o_xmin = 30.05116767708873482
o_xmax = 30.07212707680720243
#
ylength = o_ymax - o_ymin
xlength = o_xmax - o_xmin
#
xcenter = 30.04
ycenter = 102.6
ymin = ycenter - ylength / 2
xmin = xcenter - xlength / 2
ymax = ycenter + ylength / 2
xmax = xcenter + xlength / 2
#
new_extent = QgsRectangle(ymin, xmin, ymax, xmax)  
## 替换为你希望设置的经纬度范围
#
## 应用新的范围到地图项
map_item.setExtent(new_extent)
#
## 保存修改后的项目文件
project.write()

print(QgsProject.instance().mapLayers())

pdf_path = os.path.join(QgsProject.instance().homePath(), "output.pdf")

exporter = QgsLayoutExporter(layout)
exporter.exportToPdf(pdf_path,QgsLayoutExporter.PdfExportSettings())
# 脚本完成后,调用exitQgis()从内存中删除提供者和图层注册
qgs.exitQgis()