QGIS API Documentation 3.99.0-Master (357b655ed83)
Loading...
Searching...
No Matches
qgsmetadataalgorithms.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsmetadataalgorithms.cpp
3 ---------------------
4 begin : November 2024
5 copyright : (C) 2024 by Alexander Bruy
6 email : alexander dot bruy at gmail dot com
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
19
20#include <QString>
21
22using namespace Qt::StringLiterals;
23
25
26QString QgsCopyLayerMetadataAlgorithm::name() const
27{
28 return u"copylayermetadata"_s;
29}
30
31QString QgsCopyLayerMetadataAlgorithm::displayName() const
32{
33 return QObject::tr( "Copy layer metadata" );
34}
35
36QStringList QgsCopyLayerMetadataAlgorithm::tags() const
37{
38 return QObject::tr( "change,layer,metadata,qmd" ).split( ',' );
39}
40
41QString QgsCopyLayerMetadataAlgorithm::group() const
42{
43 return QObject::tr( "Metadata tools" );
44}
45
46QString QgsCopyLayerMetadataAlgorithm::groupId() const
47{
48 return u"metadatatools"_s;
49}
50
51QString QgsCopyLayerMetadataAlgorithm::shortHelpString() const
52{
53 return QObject::tr( "This algorithm copies metadata from a source layer to a target layer.\n\nAny existing metadata in the target layer will be replaced." );
54}
55
56QString QgsCopyLayerMetadataAlgorithm::shortDescription() const
57{
58 return QObject::tr( "Copies the metadata from one layer to another." );
59}
60
61QgsCopyLayerMetadataAlgorithm *QgsCopyLayerMetadataAlgorithm::createInstance() const
62{
63 return new QgsCopyLayerMetadataAlgorithm();
64}
65
66void QgsCopyLayerMetadataAlgorithm::initAlgorithm( const QVariantMap & )
67{
68 addParameter( new QgsProcessingParameterMapLayer( u"SOURCE"_s, QObject::tr( "Source layer" ) ) );
69 addParameter( new QgsProcessingParameterMapLayer( u"TARGET"_s, QObject::tr( "Target layer" ) ) );
70 addParameter( new QgsProcessingParameterBoolean( u"DEFAULT"_s, QObject::tr( "Save metadata as default" ), false ) );
71 addOutput( new QgsProcessingOutputMapLayer( u"OUTPUT"_s, QObject::tr( "Updated layer" ) ) );
72}
73
74bool QgsCopyLayerMetadataAlgorithm::prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
75{
76 QgsMapLayer *sourceLayer = parameterAsLayer( parameters, u"SOURCE"_s, context );
77 QgsMapLayer *targetLayer = parameterAsLayer( parameters, u"TARGET"_s, context );
78 const bool saveAsDefault = parameterAsBool( parameters, u"DEFAULT"_s, context );
79
80 if ( !sourceLayer )
81 throw QgsProcessingException( QObject::tr( "Invalid source layer" ) );
82
83 if ( !targetLayer )
84 throw QgsProcessingException( QObject::tr( "Invalid target layer" ) );
85
86 mLayerId = targetLayer->id();
87
88 targetLayer->setMetadata( sourceLayer->metadata() );
89 if ( saveAsDefault )
90 {
91 bool ok;
92 targetLayer->saveDefaultMetadata( ok );
93 if ( !ok )
94 {
95 throw QgsProcessingException( QObject::tr( "Failed to save metadata as default metadata." ) );
96 }
97 }
98 return true;
99}
100
101QVariantMap QgsCopyLayerMetadataAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
102{
103 Q_UNUSED( parameters );
104 Q_UNUSED( context );
105
106 QVariantMap results;
107 results.insert( u"OUTPUT"_s, mLayerId );
108 return results;
109}
110
112
113QString QgsApplyLayerMetadataAlgorithm::name() const
114{
115 return u"setlayermetadata"_s;
116}
117
118QString QgsApplyLayerMetadataAlgorithm::displayName() const
119{
120 return QObject::tr( "Set layer metadata" );
121}
122
123QStringList QgsApplyLayerMetadataAlgorithm::tags() const
124{
125 return QObject::tr( "change,layer,metadata,qmd" ).split( ',' );
126}
127
128QString QgsApplyLayerMetadataAlgorithm::group() const
129{
130 return QObject::tr( "Metadata tools" );
131}
132
133QString QgsApplyLayerMetadataAlgorithm::groupId() const
134{
135 return u"metadatatools"_s;
136}
137
138QString QgsApplyLayerMetadataAlgorithm::shortHelpString() const
139{
140 return QObject::tr( "This algorithm applies the metadata to a layer. The metadata must be defined as QMD file.\n\nAny existing metadata in the layer will be replaced." );
141}
142
143QString QgsApplyLayerMetadataAlgorithm::shortDescription() const
144{
145 return QObject::tr( "Applies the metadata from a QMD file to a layer." );
146}
147
148QgsApplyLayerMetadataAlgorithm *QgsApplyLayerMetadataAlgorithm::createInstance() const
149{
150 return new QgsApplyLayerMetadataAlgorithm();
151}
152
153void QgsApplyLayerMetadataAlgorithm::initAlgorithm( const QVariantMap & )
154{
155 addParameter( new QgsProcessingParameterMapLayer( u"INPUT"_s, QObject::tr( "Layer" ) ) );
156 addParameter( new QgsProcessingParameterFile( u"METADATA"_s, QObject::tr( "Metadata file" ), Qgis::ProcessingFileParameterBehavior::File, u"qmd"_s ) );
157 addParameter( new QgsProcessingParameterBoolean( u"DEFAULT"_s, QObject::tr( "Save metadata as default" ), false ) );
158 addOutput( new QgsProcessingOutputMapLayer( u"OUTPUT"_s, QObject::tr( "Updated" ) ) );
159}
160
161bool QgsApplyLayerMetadataAlgorithm::prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
162{
163 QgsMapLayer *layer = parameterAsLayer( parameters, u"INPUT"_s, context );
164 const QString metadata = parameterAsFile( parameters, u"METADATA"_s, context );
165 const bool saveAsDefault = parameterAsBool( parameters, u"DEFAULT"_s, context );
166
167 if ( !layer )
168 throw QgsProcessingException( QObject::tr( "Invalid input layer" ) );
169
170 mLayerId = layer->id();
171
172 bool ok = false;
173 const QString msg = layer->loadNamedMetadata( metadata, ok );
174 if ( !ok )
175 {
176 throw QgsProcessingException( QObject::tr( "Failed to apply metadata. Error: %1" ).arg( msg ) );
177 }
178
179 if ( saveAsDefault )
180 {
181 bool ok;
182 layer->saveDefaultMetadata( ok );
183 if ( !ok )
184 {
185 throw QgsProcessingException( QObject::tr( "Failed to save metadata as default metadata." ) );
186 }
187 }
188
189 return true;
190}
191
192QVariantMap QgsApplyLayerMetadataAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
193{
194 Q_UNUSED( parameters );
195 Q_UNUSED( context );
196
197 QVariantMap results;
198 results.insert( u"OUTPUT"_s, mLayerId );
199 return results;
200}
201
203
204QString QgsExportLayerMetadataAlgorithm::name() const
205{
206 return u"exportlayermetadata"_s;
207}
208
209QString QgsExportLayerMetadataAlgorithm::displayName() const
210{
211 return QObject::tr( "Export layer metadata" );
212}
213
214QStringList QgsExportLayerMetadataAlgorithm::tags() const
215{
216 return QObject::tr( "export,layer,metadata,qmd" ).split( ',' );
217}
218
219QString QgsExportLayerMetadataAlgorithm::group() const
220{
221 return QObject::tr( "Metadata tools" );
222}
223
224QString QgsExportLayerMetadataAlgorithm::groupId() const
225{
226 return u"metadatatools"_s;
227}
228
229QString QgsExportLayerMetadataAlgorithm::shortHelpString() const
230{
231 return QObject::tr( "This algorithm exports layer's metadata to a QMD file." );
232}
233
234QString QgsExportLayerMetadataAlgorithm::shortDescription() const
235{
236 return QObject::tr( "Exports layer's metadata to a QMD file." );
237}
238
239QgsExportLayerMetadataAlgorithm *QgsExportLayerMetadataAlgorithm::createInstance() const
240{
241 return new QgsExportLayerMetadataAlgorithm();
242}
243
244void QgsExportLayerMetadataAlgorithm::initAlgorithm( const QVariantMap & )
245{
246 addParameter( new QgsProcessingParameterMapLayer( u"INPUT"_s, QObject::tr( "Layer" ) ) );
247 addParameter( new QgsProcessingParameterFileDestination( u"OUTPUT"_s, QObject::tr( "Output" ), QObject::tr( "QGIS Metadata File" ) + u" (*.qmd *.QMD)"_s ) );
248}
249
250QVariantMap QgsExportLayerMetadataAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
251{
252 QgsMapLayer *layer = parameterAsLayer( parameters, u"INPUT"_s, context );
253 const QString outputFile = parameterAsString( parameters, u"OUTPUT"_s, context );
254
255 if ( !layer )
256 throw QgsProcessingException( QObject::tr( "Invalid input layer" ) );
257
258 bool ok = false;
259 const QString message = layer->saveNamedMetadata( outputFile, ok );
260 if ( !ok )
261 {
262 throw QgsProcessingException( QObject::tr( "Failed to save metadata. Error: %1" ).arg( message ) );
263 }
264
265 QVariantMap results;
266 results.insert( u"OUTPUT"_s, outputFile );
267 return results;
268}
269
271
272QString QgsAddHistoryMetadataAlgorithm::name() const
273{
274 return u"addhistorymetadata"_s;
275}
276
277QString QgsAddHistoryMetadataAlgorithm::displayName() const
278{
279 return QObject::tr( "Add history metadata" );
280}
281
282QStringList QgsAddHistoryMetadataAlgorithm::tags() const
283{
284 return QObject::tr( "add,history,metadata" ).split( ',' );
285}
286
287QString QgsAddHistoryMetadataAlgorithm::group() const
288{
289 return QObject::tr( "Metadata tools" );
290}
291
292QString QgsAddHistoryMetadataAlgorithm::groupId() const
293{
294 return u"metadatatools"_s;
295}
296
297QString QgsAddHistoryMetadataAlgorithm::shortHelpString() const
298{
299 return QObject::tr( "This algorithm adds a new history entry to the layer's metadata." );
300}
301
302QString QgsAddHistoryMetadataAlgorithm::shortDescription() const
303{
304 return QObject::tr( "Adds a new history entry to the layer's metadata." );
305}
306
307QgsAddHistoryMetadataAlgorithm *QgsAddHistoryMetadataAlgorithm::createInstance() const
308{
309 return new QgsAddHistoryMetadataAlgorithm();
310}
311
312void QgsAddHistoryMetadataAlgorithm::initAlgorithm( const QVariantMap & )
313{
314 addParameter( new QgsProcessingParameterMapLayer( u"INPUT"_s, QObject::tr( "Layer" ) ) );
315 addParameter( new QgsProcessingParameterString( u"HISTORY"_s, QObject::tr( "History entry" ) ) );
316 addOutput( new QgsProcessingOutputMapLayer( u"OUTPUT"_s, QObject::tr( "Updated" ) ) );
317}
318
319bool QgsAddHistoryMetadataAlgorithm::prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
320{
321 QgsMapLayer *layer = parameterAsLayer( parameters, u"INPUT"_s, context );
322 const QString history = parameterAsString( parameters, u"HISTORY"_s, context );
323
324 if ( !layer )
325 throw QgsProcessingException( QObject::tr( "Invalid input layer" ) );
326
327 mLayerId = layer->id();
328
329 std::unique_ptr<QgsLayerMetadata> md( layer->metadata().clone() );
330 md->addHistoryItem( history );
331 layer->setMetadata( *md.get() );
332
333 return true;
334}
335
336QVariantMap QgsAddHistoryMetadataAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
337{
338 Q_UNUSED( parameters );
339 Q_UNUSED( context );
340
341 QVariantMap results;
342 results.insert( u"OUTPUT"_s, mLayerId );
343 return results;
344}
345
347
348QString QgsUpdateLayerMetadataAlgorithm::name() const
349{
350 return u"updatelayermetadata"_s;
351}
352
353QString QgsUpdateLayerMetadataAlgorithm::displayName() const
354{
355 return QObject::tr( "Update layer metadata" );
356}
357
358QStringList QgsUpdateLayerMetadataAlgorithm::tags() const
359{
360 return QObject::tr( "change,update,layer,metadata,qmd" ).split( ',' );
361}
362
363QString QgsUpdateLayerMetadataAlgorithm::group() const
364{
365 return QObject::tr( "Metadata tools" );
366}
367
368QString QgsUpdateLayerMetadataAlgorithm::groupId() const
369{
370 return u"metadatatools"_s;
371}
372
373QString QgsUpdateLayerMetadataAlgorithm::shortHelpString() const
374{
375 return QObject::tr( "This algorithm copies all non-empty metadata fields from a source layer to a target layer.\n\nLeaves empty input fields unchanged in the target." );
376}
377
378QString QgsUpdateLayerMetadataAlgorithm::shortDescription() const
379{
380 return QObject::tr( "Copies all non-empty metadata fields from one layer to another." );
381}
382
383QgsUpdateLayerMetadataAlgorithm *QgsUpdateLayerMetadataAlgorithm::createInstance() const
384{
385 return new QgsUpdateLayerMetadataAlgorithm();
386}
387
388void QgsUpdateLayerMetadataAlgorithm::initAlgorithm( const QVariantMap & )
389{
390 addParameter( new QgsProcessingParameterMapLayer( u"SOURCE"_s, QObject::tr( "Source layer" ) ) );
391 addParameter( new QgsProcessingParameterMapLayer( u"TARGET"_s, QObject::tr( "Target layer" ) ) );
392 addOutput( new QgsProcessingOutputMapLayer( u"OUTPUT"_s, QObject::tr( "Updated layer" ) ) );
393}
394
395bool QgsUpdateLayerMetadataAlgorithm::prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
396{
397 QgsMapLayer *sourceLayer = parameterAsLayer( parameters, u"SOURCE"_s, context );
398 QgsMapLayer *targetLayer = parameterAsLayer( parameters, u"TARGET"_s, context );
399
400 if ( !sourceLayer )
401 throw QgsProcessingException( QObject::tr( "Invalid source layer" ) );
402
403 if ( !targetLayer )
404 throw QgsProcessingException( QObject::tr( "Invalid target layer" ) );
405
406 mLayerId = targetLayer->id();
407
408 std::unique_ptr<QgsLayerMetadata> md( targetLayer->metadata().clone() );
409 md->combine( &sourceLayer->metadata() );
410 targetLayer->setMetadata( *md.get() );
411
412 return true;
413}
414
415QVariantMap QgsUpdateLayerMetadataAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
416{
417 Q_UNUSED( parameters );
418 Q_UNUSED( context );
419
420 QVariantMap results;
421 results.insert( u"OUTPUT"_s, mLayerId );
422 return results;
423}
424
426
427QString QgsSetMetadataFieldsAlgorithm::name() const
428{
429 return u"setmetadatafields"_s;
430}
431
432QString QgsSetMetadataFieldsAlgorithm::displayName() const
433{
434 return QObject::tr( "Set metadata fields" );
435}
436
437QStringList QgsSetMetadataFieldsAlgorithm::tags() const
438{
439 return QObject::tr( "set,metadata,title,abstract,identifier" ).split( ',' );
440}
441
442QString QgsSetMetadataFieldsAlgorithm::group() const
443{
444 return QObject::tr( "Metadata tools" );
445}
446
447QString QgsSetMetadataFieldsAlgorithm::groupId() const
448{
449 return u"metadatatools"_s;
450}
451
452QString QgsSetMetadataFieldsAlgorithm::shortHelpString() const
453{
454 return QObject::tr( "This algorithm sets various metadata fields for a layer." );
455}
456
457QString QgsSetMetadataFieldsAlgorithm::shortDescription() const
458{
459 return QObject::tr( "Sets various metadata fields for a layer." );
460}
461
462QgsSetMetadataFieldsAlgorithm *QgsSetMetadataFieldsAlgorithm::createInstance() const
463{
464 return new QgsSetMetadataFieldsAlgorithm();
465}
466
467void QgsSetMetadataFieldsAlgorithm::initAlgorithm( const QVariantMap & )
468{
469 addParameter( new QgsProcessingParameterMapLayer( u"INPUT"_s, QObject::tr( "Layer" ) ) );
470 addParameter( new QgsProcessingParameterString( u"IDENTIFIER"_s, QObject::tr( "Identifier" ), QVariant(), false, true ) );
471 addParameter( new QgsProcessingParameterString( u"PARENT_IDENTIFIER"_s, QObject::tr( "Parent identifier" ), QVariant(), false, true ) );
472 addParameter( new QgsProcessingParameterString( u"TITLE"_s, QObject::tr( "Title" ), QVariant(), false, true ) );
473 addParameter( new QgsProcessingParameterString( u"TYPE"_s, QObject::tr( "Type" ), QVariant(), false, true ) );
474 addParameter( new QgsProcessingParameterString( u"LANGUAGE"_s, QObject::tr( "Language" ), QVariant(), false, true ) );
475 addParameter( new QgsProcessingParameterString( u"ENCODING"_s, QObject::tr( "Encoding" ), QVariant(), false, true ) );
476 addParameter( new QgsProcessingParameterString( u"ABSTRACT"_s, QObject::tr( "Abstract" ), QVariant(), true, true ) );
477 addParameter( new QgsProcessingParameterCrs( u"CRS"_s, QObject::tr( "Coordinate reference system" ), QVariant(), true ) );
478 addParameter( new QgsProcessingParameterString( u"FEES"_s, QObject::tr( "Fees" ), QVariant(), false, true ) );
479 addParameter( new QgsProcessingParameterBoolean( u"IGNORE_EMPTY"_s, QObject::tr( "Ignore empty fields" ), false ) );
480 addOutput( new QgsProcessingOutputMapLayer( u"OUTPUT"_s, QObject::tr( "Updated" ) ) );
481}
482
483bool QgsSetMetadataFieldsAlgorithm::prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
484{
485 QgsMapLayer *layer = parameterAsLayer( parameters, u"INPUT"_s, context );
486
487 if ( !layer )
488 throw QgsProcessingException( QObject::tr( "Invalid input layer" ) );
489
490 mLayerId = layer->id();
491
492 const bool ignoreEmpty = parameterAsBool( parameters, u"IGNORE_EMPTY"_s, context );
493
494 std::unique_ptr<QgsLayerMetadata> md( layer->metadata().clone() );
495
496 if ( parameters.value( u"IDENTIFIER"_s ).isValid() )
497 {
498 const QString identifier = parameterAsString( parameters, u"IDENTIFIER"_s, context );
499 if ( !identifier.isEmpty() || !ignoreEmpty )
500 {
501 md->setIdentifier( identifier );
502 }
503 }
504
505 if ( parameters.value( u"PARENT_IDENTIFIER"_s ).isValid() )
506 {
507 const QString parentIdentifier = parameterAsString( parameters, u"PARENT_IDENTIFIER"_s, context );
508 if ( !parentIdentifier.isEmpty() || !ignoreEmpty )
509 {
510 md->setParentIdentifier( parentIdentifier );
511 }
512 }
513
514 if ( parameters.value( u"TITLE"_s ).isValid() )
515 {
516 const QString title = parameterAsString( parameters, u"TITLE"_s, context );
517 if ( !title.isEmpty() || !ignoreEmpty )
518 {
519 md->setTitle( title );
520 }
521 }
522
523 if ( parameters.value( u"TYPE"_s ).isValid() )
524 {
525 const QString type = parameterAsString( parameters, u"TYPE"_s, context );
526 if ( !type.isEmpty() || !ignoreEmpty )
527 {
528 md->setType( type );
529 }
530 }
531
532 if ( parameters.value( u"LANGUAGE"_s ).isValid() )
533 {
534 const QString language = parameterAsString( parameters, u"LANGUAGE"_s, context );
535 if ( !language.isEmpty() || !ignoreEmpty )
536 {
537 md->setLanguage( language );
538 }
539 }
540
541 if ( parameters.value( u"ENCODING"_s ).isValid() )
542 {
543 const QString encoding = parameterAsString( parameters, u"ENCODING"_s, context );
544 if ( !encoding.isEmpty() || !ignoreEmpty )
545 {
546 md->setEncoding( encoding );
547 }
548 }
549
550 if ( parameters.value( u"ABSTRACT"_s ).isValid() )
551 {
552 const QString abstract = parameterAsString( parameters, u"ABSTRACT"_s, context );
553 if ( !abstract.isEmpty() || !ignoreEmpty )
554 {
555 md->setAbstract( abstract );
556 }
557 }
558
559 if ( parameters.value( u"CRS"_s ).isValid() )
560 {
561 const QgsCoordinateReferenceSystem crs = parameterAsCrs( parameters, u"CRS"_s, context );
562 if ( crs.isValid() || !ignoreEmpty )
563 {
564 md->setCrs( crs );
565 }
566 }
567
568 if ( parameters.value( u"FEES"_s ).isValid() )
569 {
570 const QString fees = parameterAsString( parameters, u"FEES"_s, context );
571 if ( !fees.isEmpty() || !ignoreEmpty )
572 {
573 md->setFees( fees );
574 }
575 }
576
577 layer->setMetadata( *md.get() );
578
579 return true;
580}
581
582QVariantMap QgsSetMetadataFieldsAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
583{
584 Q_UNUSED( parameters );
585 Q_UNUSED( context );
586
587 QVariantMap results;
588 results.insert( u"OUTPUT"_s, mLayerId );
589 return results;
590}
591
@ File
Parameter is a single file.
Definition qgis.h:3860
Represents a coordinate reference system (CRS).
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
QgsLayerMetadata * clone() const override
Clones the metadata object.
Base class for all map layer types.
Definition qgsmaplayer.h:83
virtual QString loadNamedMetadata(const QString &uri, bool &resultFlag)
Retrieve a named metadata for this layer if one exists (either as a .qmd file on disk or as a record ...
QString id
Definition qgsmaplayer.h:86
QgsLayerMetadata metadata
Definition qgsmaplayer.h:89
virtual void setMetadata(const QgsLayerMetadata &metadata)
Sets the layer's metadata store.
virtual QString saveDefaultMetadata(bool &resultFlag)
Save the current metadata of this layer as the default metadata (either as a .qmd file on disk or as ...
QString saveNamedMetadata(const QString &uri, bool &resultFlag)
Save the current metadata of this layer as a named metadata (either as a .qmd file on disk or as a re...
Contains information about the context in which a processing algorithm is executed.
Custom exception class for processing related exceptions.
Base class for providing feedback from a processing algorithm.
A map layer output for processing algorithms, where layers may be either vector or raster.
A boolean parameter for processing algorithms.
A coordinate reference system parameter for processing algorithms.
A generic file based destination parameter, for specifying the destination path for a file (non-map l...
An input file or folder parameter for processing algorithms.
A map layer parameter for processing algorithms.
A string parameter for processing algorithms.