地图渲染和打印
此页面上的代码片段需要导入以下模块:
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应用程序具有方便的元素放置GUI,尽管它在GUI库中不可用。如果您不熟悉 Qt Graphics View框架,那么建议您现在检查文档,因为布局基于该文档。
布局的中心类QgsLayout
是从Qt的 QGraphicsScene 类派生的类。让我们为其创建一个实例:
p = QgsProject()
layout = QgsLayout(p)
layout.initializeDefaults()
现在,我们可以向布局中添加各种元素(地图,标签等)。所有这些对象都由从QgsLayoutItem
继承的类创建。
这是描述的是一些可以添加到布局中的主要Item。
-
地图(map)-此项目告诉图书馆将地图放置在何处。在这里,我们创建一张地图并将其拉伸到整个纸张尺寸
map = QgsLayoutItemMap(layout) layout.addItem(map)
-
标签(label)—允许显示标签。可以修改其字体,颜色,对齐方式和边距
label = QgsLayoutItemLabel(layout) label.setText("Hello world") label.adjustSizeToText() layout.addItem(label)
-
图列(legend)
legend = QgsLayoutItemLegend(layout) legend.setLinkedMap(map) # map is an instance of QgsLayoutItemMap layout.addItem(legend)
-
比例尺(scale bar)
item = QgsLayoutItemScaleBar(layout) item.setStyle('Numeric') # optionally modify the style item.setLinkedMap(map) # map is an instance of QgsLayoutItemMap item.applyDefaultSize() layout.addItem(item)
-
箭头(arrow)
-
图片(picture)
-
基本形状(basic shape)
-
基于节点的形状(nodes based shape)
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)
-
表(table)
将Item添加到布局后,即可对其进行移动和调整大小:
item.attemptMove(QgsLayoutPoint(1.4, 1.8, QgsUnitTypes.LayoutCentimeters))
item.attemptResize(QgsLayoutSize(2.8, 2.2, QgsUnitTypes.LayoutCentimeters))
默认情况下,每个Item周围都会绘制一个边框。您可以按以下方式去除这个边框:
# for a composer label
label.setFrameEnabled(False)
除了手动创建Item外,QGIS还支持布局模板,这些模板本质上是由所有Item保存到.qpt文件(使用XML语法)组成的。
准备好合成之后(Item已创建并将其添加到合成中),我们可以继续生成栅格和/或矢量输出。
导出布局
要导出布局,必须使用QgsLayoutExporter
类。
base_path = os.path.join(QgsProject.instance().homePath()
pdf_path = os.path.join(base_path, "output.pdf")
exporter = QgsLayoutExporter(layout)
exporter.exportToPdf(pdf_path, QgsLayoutExporter.PdfExportSettings())
使用exportToImage()将
导出到成图片。
导出布局图集
如果要从配置并启用了atlas选项的布局中导出所有页面,则需要使用QgsLayoutExporter
::atlas()
方法并进行少量调整。在以下示例中,页面被导出到PNG图像:
exporter.exportToImage(layout.atlas(), base_path, 'png', QgsLayoutExporter.ImageExportSettings())
请注意,通过使用在图集上配置的输出文件名表达式将输出保存在基本路径文件夹中。
©版权所有2002-现在,QGIS项目 最近更新于2020年4月3日09:14。
使用Sphinx使用Read the Docs提供的主题构建。