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开发者手册-完整版