QgsComposition* QgsConfigParser::createPrintComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, const QMap< QString, QString >& parameterMap ) const { QList<QgsComposerMap*> composerMaps; QList<QgsComposerLabel*> composerLabels; QgsComposition* c = initComposition( composerTemplate, mapRenderer, composerMaps, composerLabels ); if ( !c ) { return 0; } QMap< QString, QString >::const_iterator dpiIt = parameterMap.find( "DPI" ); if ( dpiIt != parameterMap.constEnd() ) { c->setPrintResolution( dpiIt.value().toInt() ); } //replace composer map parameters QList<QgsComposerMap*>::iterator mapIt = composerMaps.begin(); QgsComposerMap* currentMap = 0; for ( ; mapIt != composerMaps.end(); ++mapIt ) { currentMap = *mapIt; if ( !currentMap ) { continue; } QString mapId = "MAP" + QString::number( currentMap->id() ); QMap< QString, QString >::const_iterator extentIt = parameterMap.find( mapId + ":EXTENT" ); if ( extentIt == parameterMap.constEnd() ) //map extent is mandatory { //remove map from composition if not referenced by the request c->removeItem( *mapIt ); delete( *mapIt ); continue; } QStringList coordList = extentIt.value().split( "," ); if ( coordList.size() < 4 ) { c->removeItem( *mapIt ); delete( *mapIt ); continue; //need at least four coordinates } bool xMinOk, yMinOk, xMaxOk, yMaxOk; double xmin = coordList.at( 0 ).toDouble( &xMinOk ); double ymin = coordList.at( 1 ).toDouble( &yMinOk ); double xmax = coordList.at( 2 ).toDouble( &xMaxOk ); double ymax = coordList.at( 3 ).toDouble( &yMaxOk ); if ( !xMinOk || !yMinOk || !xMaxOk || !yMaxOk ) { c->removeItem( *mapIt ); delete( *mapIt ); continue; } //Change x- and y- of extent for WMS 1.3.0 and geographic coordinate systems QMap<QString, QString>::const_iterator versionIt = parameterMap.find( "VERSION" ); if ( versionIt != parameterMap.end() ) { if ( mapRenderer && versionIt.value() == "1.3.0" && mapRenderer->destinationCrs().geographicFlag() ) { //switch coordinates of extent double tmp; tmp = xmin; xmin = ymin; ymin = tmp; tmp = xmax; xmax = ymax; ymax = tmp; } } currentMap->setNewExtent( QgsRectangle( xmin, ymin, xmax, ymax ) ); //scale QMap< QString, QString >::const_iterator scaleIt = parameterMap.find( mapId + ":SCALE" ); if ( scaleIt != parameterMap.constEnd() ) { bool scaleOk; double scale = scaleIt->toDouble( &scaleOk ); if ( scaleOk ) { currentMap->setNewScale( scale ); } } //rotation QMap< QString, QString >::const_iterator rotationIt = parameterMap.find( mapId + ":ROTATION" ); if ( rotationIt != parameterMap.constEnd() ) { bool rotationOk; double rotation = rotationIt->toDouble( &rotationOk ); if ( rotationOk ) { currentMap->setMapRotation( rotation ); } } //layers / styles QMap< QString, QString >::const_iterator layersIt = parameterMap.find( mapId + ":LAYERS" ); QMap< QString, QString >::const_iterator stylesIt = parameterMap.find( mapId + ":STYLES" ); if ( layersIt != parameterMap.constEnd() ) { QStringList layerSet; QStringList wmsLayerList = layersIt->split( "," ); QStringList wmsStyleList; if ( stylesIt != parameterMap.constEnd() ) { wmsStyleList = stylesIt->split( "," ); } for ( int i = 0; i < wmsLayerList.size(); ++i ) { QString styleName; if ( wmsStyleList.size() > i ) { styleName = wmsStyleList.at( i ); } QList<QgsMapLayer*> layerList = mapLayerFromStyle( wmsLayerList.at( i ), styleName ); QList<QgsMapLayer*>::const_iterator mapIdIt = layerList.constBegin(); for ( ; mapIdIt != layerList.constEnd(); ++mapIdIt ) { if ( *mapIdIt ) { layerSet.push_back(( *mapIdIt )->id() ); } } } currentMap->setLayerSet( layerSet ); currentMap->setKeepLayerSet( true ); } //grid space x / y QMap< QString, QString >::const_iterator gridSpaceXIt = parameterMap.find( mapId + ":GRID_INTERVAL_X" ); if ( gridSpaceXIt != parameterMap.constEnd() ) { bool intervalXOk; double intervalX = gridSpaceXIt->toDouble( &intervalXOk ); if ( intervalXOk ) { currentMap->setGridIntervalX( intervalX ); } } else { currentMap->setGridIntervalX( 0 ); } QMap< QString, QString >::const_iterator gridSpaceYIt = parameterMap.find( mapId + ":GRID_INTERVAL_Y" ); if ( gridSpaceYIt != parameterMap.constEnd() ) { bool intervalYOk; double intervalY = gridSpaceYIt->toDouble( &intervalYOk ); if ( intervalYOk ) { currentMap->setGridIntervalY( intervalY ); } } else { currentMap->setGridIntervalY( 0 ); } } //replace label text QList<QgsComposerLabel*>::const_iterator labelIt = composerLabels.constBegin(); QgsComposerLabel* currentLabel = 0; for ( ; labelIt != composerLabels.constEnd(); ++labelIt ) { currentLabel = *labelIt; QMap< QString, QString >::const_iterator titleIt = parameterMap.find( currentLabel->id().toUpper() ); if ( titleIt == parameterMap.constEnd() ) { //remove exported labels not referenced in the request if ( !currentLabel->id().isEmpty() ) { c->removeItem( currentLabel ); delete( currentLabel ); } continue; } if ( !titleIt.key().isEmpty() ) //no label text replacement with empty key { currentLabel->setText( titleIt.value() ); currentLabel->adjustSizeToText(); } } return c; }
QgsComposition* QgsConfigParser::createPrintComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, const QMap< QString, QString >& parameterMap ) const { QList<QgsComposerMap*> composerMaps; QList<QgsComposerLabel*> composerLabels; QgsComposition* c = initComposition( composerTemplate, mapRenderer, composerMaps, composerLabels ); if ( !c ) { return 0; } QMap< QString, QString >::const_iterator dpiIt = parameterMap.find( "DPI" ); if ( dpiIt != parameterMap.constEnd() ) { c->setPrintResolution( dpiIt.value().toInt() ); } //replace composer map parameters QList<QgsComposerMap*>::iterator mapIt = composerMaps.begin(); QgsComposerMap* currentMap = 0; for ( ; mapIt != composerMaps.end(); ++mapIt ) { currentMap = *mapIt; if ( !currentMap ) { continue; } //search composer map title in parameter map-> string QMap< QString, QString >::const_iterator titleIt = parameterMap.find( "MAP" + QString::number( currentMap->id() ) ); if ( titleIt == parameterMap.constEnd() ) { continue; } QString replaceString = titleIt.value(); QStringList replacementList = replaceString.split( "/" ); //get map extent from string if ( replacementList.size() > 0 ) { QStringList coordList = replacementList.at( 0 ).split( "," ); if ( coordList.size() > 3 ) { bool xMinOk, yMinOk, xMaxOk, yMaxOk; double xmin = coordList.at( 0 ).toDouble( &xMinOk ); double ymin = coordList.at( 1 ).toDouble( &yMinOk ); double xmax = coordList.at( 2 ).toDouble( &xMaxOk ); double ymax = coordList.at( 3 ).toDouble( &yMaxOk ); if ( xMinOk && yMinOk && xMaxOk && yMaxOk ) { currentMap->setNewExtent( QgsRectangle( xmin, ymin, xmax, ymax ) ); } } } //get rotation from string if ( replacementList.size() > 1 ) { bool rotationOk; double rotation = replacementList.at( 1 ).toDouble( &rotationOk ); if ( rotationOk ) { currentMap->setMapRotation( rotation ); } } //get layer list from string if ( replacementList.size() > 2 ) { QStringList layerSet; QStringList wmsLayerList = replacementList.at( 2 ).split( "," ); QStringList wmsStyleList; if ( replacementList.size() > 3 ) { wmsStyleList = replacementList.at( 3 ).split( "," ); } for ( int i = 0; i < wmsLayerList.size(); ++i ) { QString styleName; if ( wmsStyleList.size() > i ) { styleName = wmsStyleList.at( i ); } QList<QgsMapLayer*> layerList = mapLayerFromStyle( wmsLayerList.at( i ), styleName ); QList<QgsMapLayer*>::const_iterator mapIdIt = layerList.constBegin(); for ( ; mapIdIt != layerList.constEnd(); ++mapIdIt ) { if ( *mapIdIt ) { layerSet.push_back(( *mapIdIt )->getLayerID() ); } } } currentMap->setLayerSet( layerSet ); currentMap->setKeepLayerSet( true ); } } //replace composer label text return c; }