PyQGIS开发者手册-9 地图渲染和打印

本文介绍如何在QGIS中使用QgsMapRendererJob进行快速地图渲染,并通过QgsLayout类创建复杂地图布局,包括地图视图、标签、图例等元素,以及如何将布局导出为PDF或图像。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

9 地图渲染和打印

当输入数据作为地图呈现时,通常有两种方法:使用QgsMapRendererJob快速进行,或者通过使用QgsLayout类组合地图来生成更精细的输出。

9.1 简单的渲染

渲染完成后,创建一个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()
    # 保存图像; e.g. img.save("/Users/myuser/render.png","png")
    img.save(image_location, "png")
    print("saved")

render.finished.connect(finished)

render.start()

9.2 使用不同的CRS渲染图层

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

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

9.3 使用打印布局输出

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

布局由一堆类组成。它们都属于核心库。QGIS应用程序有一个方便的GUI布局元素,虽然它在GUI库中不可用。如果你不熟悉 Qt Graphics View框架,那么建议你立即查看文档,因为布局是基于它的。

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

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

现在我们可以在布局中添加各种元素(map,label,…)。所有这些对象都由从基类QgsLayoutItem继承。

以下是可以添加到布局的一些主要布局项的说明。

  • 地图—— 此项目告诉库放置地图本身的位置。在这里,我们创建一个地图并将其拉伸到整个纸张大小

    map = QgsLayoutItemMap(layout)
    layout.addItem(map)
    
  • 标签——允许显示标签。可以修改其字体,颜色,对齐和边距

    label = QgsLayoutItemLabel(layout)
    label.setText("Hello world")
    label.adjustSizeToText()
    layout.addItem(label)
    
  • 图例

    legend = QgsLayoutItemLegend(layout)
    legend.setLinkedMap(map) # map is an instance of QgsLayoutItemMap
    layout.addItem(legend)
    
  • 比例尺

    item = QgsLayoutItemScaleBar(layout)
    item.setStyle('Numeric') # 可选择修改样式
    item.setLinkedMap(map)  # map is an instance of QgsLayoutItemMap
    item.applyDefaultSize()
    layout.addItem(item)
    
  • 箭头

  • 图片

  • 基本形状

  • 基于节点的形状

    polygon = QPolygonF()
    polygon.append(QPointF(0.0, 0.0))
    polygon.append(QPointF(100.0, 0.0))
    polygon.append(QPointF(200.0, 100.0))
    polygon.append(QPointF(100.0, 200.0))
    
    polygonItem = QgsLayoutItemPolygon(polygon, layout)
    layout.addItem(polygonItem)
    
    props = {}
    props["color"] = "green"
    props["style"] = "solid"
    props["style_border"] = "solid"
    props["color_border"] = "black"
    props["width_border"] = "10.0"
    props["joinstyle"] = "miter"
    
    symbol = QgsFillSymbol.createSimple(props)
    polygonItem.setSymbol(symbol)
    

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

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文件。


写在最后:文中难免有翻译错误,欢迎您的指正。完整版翻译请移步PyQGIS开发者手册-完整版

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值