安装前准备
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()