PyQGisCookbook--地图渲染和打印(十一)


地图渲染和打印

此页面上的代码片段需要导入以下模块:

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提供的主题构建。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值