此页上的代码段需要以下导入:
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。
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
班级。
下面是一些可以添加到布局中的主要布局项的描述。
地图---这个项目告诉类库把地图放在哪里。在这里,我们创建一个地图并将其拉伸到整个纸张大小
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') # optionally modify the style
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文件。