QGIS API: コンポーザ/レイアウト

v2.0ではコンポーザ、v3.0ではレイアウトと呼称しているようです。
両者で多少用途が違うのかもしれません。

以下では、画像でエクスポートする例を示します。

v2.x

   1:
   2: 	// コンポジションの設定
   3: 	QgsMapRenderer *pRenderer = mapCanvas->mapRenderer();
   4: 	QgsComposition composition( pRenderer );
   5: 	composition.setPlotStyle( QgsComposition::Print );
   6: 	composition.setPrintResolution( 254 );
   7:
   8: 	// 紙サイズを設定
   9: 	QSize sizeCanvas = mapCanvas->size();
  10: 	sizeCanvas *= sizeCanvas.width() > sizeCanvas.height() ?
  11: 		200.0/sizeCanvas.width() : 200.0/sizeCanvas.height();
  12:
  13: 	// ラベルを書き込む範囲を追加
  14: 	sizeCanvas.rheight() += 25.0;
  15: 	composition.setPaperSize( sizeCanvas.width(), sizeCanvas.height() );
  16:
  17: 	// マップアイテムを作成
  18: 	QgsComposerMap composerMap( &composition, 0, 0, sizeCanvas.width(), sizeCanvas.height() );
  19: 	// アイテム内のマップキャンバスの表示範囲を再設定
  20: 	composerMap.setNewExtent( mapCanvas->extent() );
  21: 	// マップアイテムをコンポジションに追加
  22: 	composition.addItem( &composerMap );
  23:
  24: 	// ラベルアイテムを作成
  25: 	QgsComposerLabel label( &composition );
  26: 	label.setText( "何かテキスト" );
  27: 	// テキストがHTMLで記述されていて、マークアップを反映したい場合
  28: 	label.setHtmlState( 1 );
  29: 	// フォント
  30: 	QFont font( "Sans", 6 );
  31: 	label.setFont( font );
  32: 	// 位置を指定してコンポジションに追加
  33: 	label.setSceneRect( QRectF( 0, 200, 200, 25 ) );
  34: 	composition.addItem( &label );
  35:
  36: 	// エクスポート画像を作成
  37: 	int nDpi = composition.printResolution();
  38: 	double dDpm = nDpi / 25.4;
  39: 	int nWidth = int( dDpm * composition.paperWidth() );
  40: 	int nHeight = int( dDpm * composition.paperHeight() );
  41: 	QImage img( QSize( nWidth, nHeight ), QImage::Format_ARGB32 );
  42: 	img.setDotsPerMeterX( dDpm * 1000 );
  43: 	img.setDotsPerMeterY( dDpm * 1000 );
  44: 	img.fill( Qt::white );
  45:
  46: 	// エクスポート画像にコンポジションの内容をレンダリング
  47: 	QPainter painter( &img );
  48: 	QRectF rcSource( 0, 0, composition.paperWidth(), composition.paperHeight() );
  49: 	QRectF rcTarget( 0, 0, nWidth, nHeight );
  50: 	composition.render( &painter, rcTarget, rcSource );
  51: 	painter.end();
  52:
  53: 	// 画像を保存
  54: 	img.save( strFName, "png" );

2016年4月追記

画像で保存するところで便利な関数がありました。
上記コードの36行目以降は以下のようにたった2行でよさそうです。

  QImage img = composition.printPageAsRaster( 0 );

  img.save( strFName, "png" );

エクスポート画像にワールドファイルを付加するには

エクスポート画像に対応したワールドファイルを付けるための便利な関数もあります。
以下のようにします。

  composition.setGenerateWorldFile( true );

  double daWld[6];
  composition.computeWorldFileParameters
    ( daWld[0], daWld[1], daWld[2], daWld[3], daWld[4], daWld[5] );

あとは、取得した6つの値を順に1行ずつテキストに保存します。

v3.x

   1:   // create composition
   2:   // ポインタで生成しかできない。
   3:   // QGraphicsScene::QGraphicsScene(const QGraphicsScene &)': 関数は明示的に削除されました
   4:   QgsPrintLayout *pLayout = new QgsPrintLayout( QgsProject::instance() );
   5:   pLayout->initializeDefaults();
   6:   pLayout->setUnits( QgsUnitTypes::LayoutMillimeters );
   7:
   8:   // set paper size
   9:   QgsLayoutPageCollection *pCol = pLayout->pageCollection();
  10:   QgsLayoutItemPage *pPage = pCol->pages()[0];
  11:   QSize sizeCanvas = centralwidget->size();
  12:   sizeCanvas *= 200.0 / sizeCanvas.width();
  13:   pPage->setPageSize( QgsLayoutSize(sizeCanvas) );
  14:
  15:   // add a map to the composition
  16:   QgsLayoutItemMap *pMap = new QgsLayoutItemMap( pLayout );
  17:   pMap->setRect( QRectF(0, 0, sizeCanvas.width(), sizeCanvas.height()) );
  18:   pMap->setPos( 0, 0 );
  19:   pMap->setExtent( centralwidget->extent() );
  20:   pMap->attemptSetSceneRect( QRectF( 0, 0, sizeCanvas.width(), sizeCanvas.height() ) );
  21:   pLayout->addItem( pMap );
  22:
  23:   // add label
  24:   QgsLayoutItemLabel *pLabel = new QgsLayoutItemLabel( pLayout );
  25:   pLabel->setText( "test" );
  26:   pLabel->setMode( QgsLayoutItemLabel::ModeHtml );
  27:   QFont font( "Sans", 18 );
  28:   pLabel->setFont( font );
  29:   pLabel->setPos( sizeCanvas.width() / 2.0, 0 );
  30:   pLabel->setHAlign( Qt::AlignHCenter );
  31:   pLabel->adjustSizeToText();
  32:   pLayout->addItem( pLabel );
  33:
  34:   // add frame
  35:   QgsLayoutItemShape *pFrame = new QgsLayoutItemShape( pLayout );
  36:   pFrame->attemptSetSceneRect(
          QRectF(10.0, 10.0, sizeCanvas.width() - 20.0, sizeCanvas.height() - 20.0) );
  37:   pFrame->setShapeType( QgsLayoutItemShape::Rectangle );
  38:   QgsStringMap mapFrameProp;
  39:   mapFrameProp["outline_color"] = "255,255,0";
  40:   mapFrameProp["outline_width"] = "1.0";
  41:   mapFrameProp["style"] = "no";
  42:   QgsFillSymbol *psymbolFrame = QgsFillSymbol::createSimple( mapFrameProp );
  43:   pFrame->setSymbol( psymbolFrame );  // オーナー移動せず クローン作製される
  44:   pLayout->addItem( pFrame );
  45:   delete psymbolFrame;
  46:
  47:   // create output image and initialize it 
  48:   QgsLayoutExporter exporter = QgsLayoutExporter( pLayout );
  49:   QString strWldFName = QFileInfo( strFName ).completeBaseName() + ".wld";
  50:   exporter.georeferenceOutput( strWldFName );
  51:   QgsLayoutExporter::ImageExportSettings settings;
  52:   settings.generateWorldFile = true;
  53:   settings.imageSize = sizeCanvas * 10;
  54:   exporter.exportToImage( strFName, settings );
  55:
  56:   delete pLayout;
アーカイブ