地图绘制和打印¶

此页上的代码段需要以下导入:

import os

通常有两种方法可以将输入数据呈现为映射:使用 QgsMapRendererJob 或者通过使用 QgsLayout 班级。

简单呈现

渲染完成后,创建一个 QgsMapSettings 对象定义呈现选项,然后构造 QgsMapRendererJob 有了这些选择。然后使用后者创建结果图像。

下面是一个例子:

image_location = os.path.join(QgsProject.instance().homePath(), "render.png")

# e.g. vlayer = iface.activeLayer()
vlayer = QgsProject.instance().mapLayersByName("countries")[0]
options = QgsMapSettings()
options.setLayers([vlayer])
options.setBackgroundColor(QColor(255, 255, 255))
options.setOutputSize(QSize(800, 600))
options.setExtent(vlayer.extent())

render = QgsMapRendererParallelJob(options)

def finished():
    img = render.renderedImage()
    # save the image; e.g. img.save("/Users/myuser/render.png","png")
    img.save(image_location, "png")
    print("saved")

render.finished.connect(finished)

render.start()

使用不同的CRS渲染层

如果您有多个层,并且它们有不同的CRS,上面的简单示例可能不起作用:要从范围计算中获得正确的值,您必须显式地设置目标CRS。

settings.setLayers(layers)
render.setDestinationCrs(layers[0].crs())

使用打印布局输出

如果您想进行比上面显示的简单渲染更复杂的输出,那么打印布局是一个非常方便的工具。可以创建由地图视图、标签、图例、表格和通常出现在纸质地图上的其他元素组成的复杂地图布局。然后可以将布局导出为PDF、栅格图像或直接打印在打印机上。

布局由一组类组成。它们都属于核心类库。QGIS应用程序有一个方便的图形用户界面来放置元素,尽管它在图形用户界面库中不可用。如果你不熟悉 Qt Graphics View framework ,那么我们鼓励您现在检查文档,因为布局是基于文档的。

布局的中心类是 QgsLayout 类,从qt派生 QGraphicsScene 班级。让我们创建一个它的实例:

p = QgsProject()
layout = QgsLayout(p)
layout.initializeDefaults()

现在我们可以在布局中添加各种元素(地图、标签等)。所有这些对象都由从基继承的类表示 QgsLayoutItem 班级。

下面是一些可以添加到布局中的主要布局项的描述。

将项目添加到布局后,可以移动项目并调整其大小:

item.attemptMove(QgsLayoutPoint(1.4, 1.8, QgsUnitTypes.LayoutCentimeters))
item.attemptResize(QgsLayoutSize(2.8, 2.2, QgsUnitTypes.LayoutCentimeters))

默认情况下,在每个项目周围绘制一个框架。您可以按如下方式删除它:

# for a composer label
label.setFrameEnabled(False)

除了手工创建布局项,qgis还支持布局模板,这些模板基本上是与保存到.qpt文件(使用XML语法)中的所有项组合在一起的。

一旦合成准备就绪(布局项已创建并添加到合成中),我们就可以继续生成栅格和/或矢量输出。

导出布局

要导出布局,请 QgsLayoutExporter 必须使用类。

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

exporter = QgsLayoutExporter(layout)
exporter.exportToPdf(pdf_path, QgsLayoutExporter.PdfExportSettings())

使用 exportToImage() 如果要导出到图像而不是PDF文件。