地図のレンダリングと印刷

どちらかの簡単な方法使用してそれを実行します:あり入力データがマップとしてレンダリングされるべき2つのアプローチが一般的クラス: QgsMapRenderer`またはでマップを構成することにより、より多くの微調整出力を生成します。class: QgsComposition`クラスや友人を。

単純なレンダリング

クラス:使用して、いくつかの層をレンダリング— QgsMapRenderer`を宛先ペイントデバイス( QImage``、 `` QPainter``等)を作成し、レイヤーセット、範囲、出力サイズを設定してレンダリングを行います

# create image
img = QImage(QSize(800, 600), QImage.Format_ARGB32_Premultiplied)

# set image's background color
color = QColor(255, 255, 255)
img.fill(color.rgb())

# create painter
p = QPainter()
p.begin(img)
p.setRenderHint(QPainter.Antialiasing)

render = QgsMapRenderer()

# set layer set
lst = [layer.getLayerID()]  # add ID of every layer
render.setLayerSet(lst)

# set extent
rect = QgsRectangle(render.fullExtent())
rect.scale(1.1)
render.setExtent(rect)

# set output size
render.setOutputSize(img.size(), img.logicalDpiX())

# do the rendering
render.render(p)

p.end()

# save image
img.save("render.png","png")

別のCRSとのレイヤーをレンダリング

複数のレイヤーがあってそれらが異なるCRSを持っている場合、上記の単純な例はおそらく動作しません:範囲計算から正しい値を取得するには、明示的に先のCRSを設定し、以下の例のようにOTFの再投影を有効にする必要があります(レンダラの設定部分が報告されるのみ)

...
# set layer set
layers = QgsMapLayerRegistry.instance().mapLayers()
lst = layers.keys()
render.setLayerSet(lst)

# Set destination CRS to match the CRS of the first layer
render.setDestinationCrs(layers.values()[0].crs())
# Enable OTF reprojection
render.setProjectionsEnabled(True)
...

マップコンポーザを使った出力

地図コンポーザーは、上に示した簡単なレンダリングよりも洗練された出力をしたいと思った場合に、非常に便利なツールです。コンポーザーを使用すると、地図ビュー、ラベル、凡例、テーブルと通常は紙の地図上に存在する他の要素からなる複雑なマップレイアウトを作成することが可能です。レイアウトは、その後PDF、ラスタ画像にエクスポートしたり、直接プリンタに印刷できます。

コンポーザーは、クラスの束で構成されています。彼らはすべてのコアライブラリに属しています。それはGUIライブラリでは利用できないですが、QGISアプリケーションは、要素の配置のための便利なGUIを持っています。`Qtのグラフィックスビューフレームワーク<http://doc.qt.io/qt-4.8/qgraphicsview.html> ` _に精通していない方は、今、ドキュメントをチェックすることをお勧めします、作曲はそれに基づいているため。`QGraphicViewの実装のPythonドキュメント<http://pyqt.sourceforge.net/Docs/PyQt4/qgraphicsview.html> _`もチェックしてください。

コンポーザーの中心クラスは:class:QGraphicsScene`から派生する:class: QgsComposition`です。1つ作成してみましょう

mapRenderer = iface.mapCanvas().mapRenderer()
c = QgsComposition(mapRenderer)
c.setPlotStyle(QgsComposition.Print)

作品は:class: `QgsMapRenderer`のインスタンスを取ることに注意してください。このコードではQGISアプリケーション内で実行されること、よってマップキャンバスから地図レンダラーを使用していることを期待しています。作品は、地図レンダラーからの各種パラメータ、最も重要な地図レイヤーのデフォルトセットと現在の範囲を使用します。スタンドアロンアプリケーションでコンポーザーを使用するときは、上記のセクションに示すように、同じように、独自の地図レンダラーインスタンスを作成して、それを作品に渡すことができます。

:class:`QgsComposerItem`クラスには、これらの要素は、の子孫でなければならない—作品に様々な要素(マップ、ラベルを、...)を追加することも可能です。現在サポートされている項目は、次のとおりです。

  • 地図—このアイテムは地図自体を置くためのライブラリを伝えます。ここでは、地図を作成し、全体の用紙サイズの上に伸ばします

    x, y = 0, 0
    w, h = c.paperWidth(), c.paperHeight()
    composerMap = QgsComposerMap(c, x ,y, w, h)
    c.addItem(composerMap)
    
  • ラベル—ラベルを表示できます。そのフォント、色、配置及びマージンを変更することが可能です

    composerLabel = QgsComposerLabel(c)
    composerLabel.setText("Hello world")
    composerLabel.adjustSizeToText()
    c.addItem(composerLabel)
    
  • 凡例

    legend = QgsComposerLegend(c)
    legend.model().setLayerSet(mapRenderer.layerSet())
    c.addItem(legend)
    
  • スケールバー

    item = QgsComposerScaleBar(c)
    item.setStyle('Numeric') # optionally modify the style
    item.setComposerMap(composerMap)
    item.applyDefaultSize()
    c.addItem(item)
    
  • 矢印

  • ピクチャ

  • 図形

  • テーブル

デフォルトでは、新しく作成された作図項目の位置はゼロ(ページの左上隅)でサイズはゼロです。位置とサイズは常にミリメートルで測定されます

# set label 1cm from the top and 2cm from the left of the page
composerLabel.setItemPosition(20, 10)
# set both label's position and size (width 10cm, height 3cm)
composerLabel.setItemPosition(20, 10, 100, 30)

フレームは、デフォルトでは、各項目を中心に描かれています。フレームを削除する方法

composerLabel.setFrame(False)

手で作図アイテムを作成するほか、QGISは基本的に(XML構文を持つ).qptファイルに保存されたすべての項目を持つ作品である作図テンプレートをサポートしています。残念ながら、この機能はAPIではまだ利用できません。

作品の準備ができたら(作図項目が作成され、作品に追加されたら)、ラスタおよび/またはベクトル出力を生成するために進むことができます。

作品のためのデフォルトの出力設定は、ページサイズA4および解像度300 DPIです。必要に応じてそれらを変更できます。用紙サイズは、ミリメートル単位で指定されます

c.setPaperSize(width, height)
c.setPrintResolution(dpi)

ラスタイメージへの出力

次のコード断片は、ラスタイメージに組成物をレンダリングする方法を示して

dpi = c.printResolution()
dpmm = dpi / 25.4
width = int(dpmm * c.paperWidth())
height = int(dpmm * c.paperHeight())

# create output image and initialize it
image = QImage(QSize(width, height), QImage.Format_ARGB32)
image.setDotsPerMeterX(dpmm * 1000)
image.setDotsPerMeterY(dpmm * 1000)
image.fill(0)

# render the composition
imagePainter = QPainter(image)
sourceArea = QRectF(0, 0, c.paperWidth(), c.paperHeight())
targetArea = QRectF(0, 0, width, height)
c.render(imagePainter, targetArea, sourceArea)
imagePainter.end()

image.save("out.png", "png")

PDFへの出力

次のコードは、PDFファイルに作品をレンダリングします

printer = QPrinter()
printer.setOutputFormat(QPrinter.PdfFormat)
printer.setOutputFileName("out.pdf")
printer.setPaperSize(QSizeF(c.paperWidth(), c.paperHeight()), QPrinter.Millimeter)
printer.setFullPage(True)
printer.setColorMode(QPrinter.Color)
printer.setResolution(c.printResolution())

pdfPainter = QPainter(printer)
paperRectMM = printer.pageRect(QPrinter.Millimeter)
paperRectPixel = printer.pageRect(QPrinter.DevicePixel)
c.render(pdfPainter, paperRectPixel, paperRectMM)
pdfPainter.end()