27 QString QgsLayoutMapExtentToLayerAlgorithm::name()
const
29 return QStringLiteral(
"printlayoutmapextenttolayer" );
32 QString QgsLayoutMapExtentToLayerAlgorithm::displayName()
const
34 return QObject::tr(
"Print layout map extent to layer" );
37 QStringList QgsLayoutMapExtentToLayerAlgorithm::tags()
const
39 return QObject::tr(
"layout,composer,composition,visible" ).split(
',' );
42 QString QgsLayoutMapExtentToLayerAlgorithm::group()
const
44 return QObject::tr(
"Cartography" );
47 QString QgsLayoutMapExtentToLayerAlgorithm::groupId()
const
49 return QStringLiteral(
"cartography" );
52 QString QgsLayoutMapExtentToLayerAlgorithm::shortDescription()
const
54 return QObject::tr(
"Creates a polygon layer containing the extent of a print layout map item." );
57 void QgsLayoutMapExtentToLayerAlgorithm::initAlgorithm(
const QVariantMap & )
61 auto crsParam = qgis::make_unique< QgsProcessingParameterCrs >( QStringLiteral(
"CRS" ), QObject::tr(
"Override CRS" ), QVariant(),
true );
63 addParameter( crsParam.release() );
71 QString QgsLayoutMapExtentToLayerAlgorithm::shortHelpString()
const
73 return QObject::tr(
"This algorithm creates a polygon layer containing the extent of a print layout map item (or items), "
74 "with attributes specifying the map size (in layout units), scale and rotation.\n\n"
75 "If the map item parameter is specified, then only the matching map extent will be exported. If it "
76 "is not specified, all map extents from the layout will be exported.\n\n"
77 "Optionally, a specific output CRS can be specified. If it is not specified, the original map "
78 "item CRS will be used." );
81 QgsLayoutMapExtentToLayerAlgorithm *QgsLayoutMapExtentToLayerAlgorithm::createInstance()
const
83 return new QgsLayoutMapExtentToLayerAlgorithm();
89 QgsPrintLayout *layout = parameterAsLayout( parameters, QStringLiteral(
"LAYOUT" ), context );
91 throw QgsProcessingException( QObject::tr(
"Cannot find layout with name \"%1\"" ).arg( parameters.value( QStringLiteral(
"LAYOUT" ) ).toString() ) );
93 QgsLayoutItemMap *map = qobject_cast< QgsLayoutItemMap * >( parameterAsLayoutItem( parameters, QStringLiteral(
"MAP" ), context, layout ) );
94 if ( !map && parameters.value( QStringLiteral(
"MAP" ) ).isValid() )
95 throw QgsProcessingException( QObject::tr(
"Cannot find matching map item with ID %1" ).arg( parameters.value( QStringLiteral(
"MAP" ) ).toString() ) );
97 QList< QgsLayoutItemMap *> maps;
105 mFeatures.reserve( maps.size() );
108 if ( !mCrs.isValid() )
109 mCrs = !overrideCrs.
isValid() ? map->crs() : overrideCrs;
112 if ( map->crs() != mCrs )
120 feedback->
reportError( QObject::tr(
"Error reprojecting map to destination CRS" ) );
125 mWidth = map->rect().width();
126 mHeight = map->rect().height();
127 mScale = map->scale();
128 mRotation = map->mapRotation();
142 fields.
append(
QgsField( QStringLiteral(
"map" ), QVariant::String ) );
143 fields.
append(
QgsField( QStringLiteral(
"width" ), QVariant::Double ) );
144 fields.
append(
QgsField( QStringLiteral(
"height" ), QVariant::Double ) );
145 fields.
append(
QgsField( QStringLiteral(
"scale" ), QVariant::Double ) );
146 fields.
append(
QgsField( QStringLiteral(
"rotation" ), QVariant::Double ) );
149 std::unique_ptr< QgsFeatureSink > sink( parameterAsSink( parameters, QStringLiteral(
"OUTPUT" ), context, dest, fields,
QgsWkbTypes::Polygon, mCrs ) );
159 outputs.insert( QStringLiteral(
"OUTPUT" ), dest );
161 outputs.insert( QStringLiteral(
"WIDTH" ), mFeatures.size() == 1 ? mWidth : QVariant() );
162 outputs.insert( QStringLiteral(
"HEIGHT" ), mFeatures.size() == 1 ? mHeight : QVariant() );
163 outputs.insert( QStringLiteral(
"SCALE" ), mFeatures.size() == 1 ? mScale : QVariant() );
164 outputs.insert( QStringLiteral(
"ROTATION" ), mFeatures.size() == 1 ? mRotation : QVariant() );