QGIS API Documentation 4.3.0-Master (ffcfc20b9b4)
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 QGS_MARK_ALGORITHM_SOURCE
77
78 QgsMapLayer *sourceLayer = parameterAsLayer( parameters, u"SOURCE"_s, context );
79 QgsMapLayer *targetLayer = parameterAsLayer( parameters, u"TARGET"_s, context );
80 const bool saveAsDefault = parameterAsBool( parameters, u"DEFAULT"_s, context );
81
82 if ( !sourceLayer )
83 throw QgsProcessingException( QObject::tr( "Invalid source layer" ) );
84
85 if ( !targetLayer )
86 throw QgsProcessingException( QObject::tr( "Invalid target layer" ) );
87
88 mLayerId = targetLayer->id();
89
90 targetLayer->setMetadata( sourceLayer->metadata() );
91 if ( saveAsDefault )
92 {
93 bool ok;
94 targetLayer->saveDefaultMetadata( ok );
95 if ( !ok )
96 {
97 throw QgsProcessingException( QObject::tr( "Failed to save metadata as default metadata." ) );
98 }
99 }
100 return true;
101}
102
103QVariantMap QgsCopyLayerMetadataAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
104{
105 Q_UNUSED( parameters );
106 Q_UNUSED( context );
107
108 QVariantMap results;
109 results.insert( u"OUTPUT"_s, mLayerId );
110 return results;
111}
112
114
115QString QgsApplyLayerMetadataAlgorithm::name() const
116{
117 return u"setlayermetadata"_s;
118}
119
120QString QgsApplyLayerMetadataAlgorithm::displayName() const
121{
122 return QObject::tr( "Set layer metadata" );
123}
124
125QStringList QgsApplyLayerMetadataAlgorithm::tags() const
126{
127 return QObject::tr( "change,layer,metadata,qmd" ).split( ',' );
128}
129
130QString QgsApplyLayerMetadataAlgorithm::group() const
131{
132 return QObject::tr( "Metadata tools" );
133}
134
135QString QgsApplyLayerMetadataAlgorithm::groupId() const
136{
137 return u"metadatatools"_s;
138}
139
140QString QgsApplyLayerMetadataAlgorithm::shortHelpString() const
141{
142 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." );
143}
144
145QString QgsApplyLayerMetadataAlgorithm::shortDescription() const
146{
147 return QObject::tr( "Applies the metadata from a QMD file to a layer." );
148}
149
150QgsApplyLayerMetadataAlgorithm *QgsApplyLayerMetadataAlgorithm::createInstance() const
151{
152 return new QgsApplyLayerMetadataAlgorithm();
153}
154
155void QgsApplyLayerMetadataAlgorithm::initAlgorithm( const QVariantMap & )
156{
157 addParameter( new QgsProcessingParameterMapLayer( u"INPUT"_s, QObject::tr( "Layer" ) ) );
158 addParameter( new QgsProcessingParameterFile( u"METADATA"_s, QObject::tr( "Metadata file" ), Qgis::ProcessingFileParameterBehavior::File, u"qmd"_s ) );
159 addParameter( new QgsProcessingParameterBoolean( u"DEFAULT"_s, QObject::tr( "Save metadata as default" ), false ) );
160 addOutput( new QgsProcessingOutputMapLayer( u"OUTPUT"_s, QObject::tr( "Updated" ) ) );
161}
162
163bool QgsApplyLayerMetadataAlgorithm::prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
164{
165 QGS_MARK_ALGORITHM_SOURCE
166
167 QgsMapLayer *layer = parameterAsLayer( parameters, u"INPUT"_s, context );
168 const QString metadata = parameterAsFile( parameters, u"METADATA"_s, context );
169 const bool saveAsDefault = parameterAsBool( parameters, u"DEFAULT"_s, context );
170
171 if ( !layer )
172 throw QgsProcessingException( QObject::tr( "Invalid input layer" ) );
173
174 mLayerId = layer->id();
175
176 bool ok = false;
177 const QString msg = layer->loadNamedMetadata( metadata, ok );
178 if ( !ok )
179 {
180 throw QgsProcessingException( QObject::tr( "Failed to apply metadata. Error: %1" ).arg( msg ) );
181 }
182
183 if ( saveAsDefault )
184 {
185 bool ok;
186 layer->saveDefaultMetadata( ok );
187 if ( !ok )
188 {
189 throw QgsProcessingException( QObject::tr( "Failed to save metadata as default metadata." ) );
190 }
191 }
192
193 return true;
194}
195
196QVariantMap QgsApplyLayerMetadataAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
197{
198 Q_UNUSED( parameters );
199 Q_UNUSED( context );
200
201 QVariantMap results;
202 results.insert( u"OUTPUT"_s, mLayerId );
203 return results;
204}
205
207
208QString QgsExportLayerMetadataAlgorithm::name() const
209{
210 return u"exportlayermetadata"_s;
211}
212
213QString QgsExportLayerMetadataAlgorithm::displayName() const
214{
215 return QObject::tr( "Export layer metadata" );
216}
217
218QStringList QgsExportLayerMetadataAlgorithm::tags() const
219{
220 return QObject::tr( "export,layer,metadata,qmd" ).split( ',' );
221}
222
223QString QgsExportLayerMetadataAlgorithm::group() const
224{
225 return QObject::tr( "Metadata tools" );
226}
227
228QString QgsExportLayerMetadataAlgorithm::groupId() const
229{
230 return u"metadatatools"_s;
231}
232
233QString QgsExportLayerMetadataAlgorithm::shortHelpString() const
234{
235 return QObject::tr( "This algorithm exports layer's metadata to a QMD file." );
236}
237
238QString QgsExportLayerMetadataAlgorithm::shortDescription() const
239{
240 return QObject::tr( "Exports layer's metadata to a QMD file." );
241}
242
243QgsExportLayerMetadataAlgorithm *QgsExportLayerMetadataAlgorithm::createInstance() const
244{
245 return new QgsExportLayerMetadataAlgorithm();
246}
247
248void QgsExportLayerMetadataAlgorithm::initAlgorithm( const QVariantMap & )
249{
250 addParameter( new QgsProcessingParameterMapLayer( u"INPUT"_s, QObject::tr( "Layer" ) ) );
251 addParameter( new QgsProcessingParameterFileDestination( u"OUTPUT"_s, QObject::tr( "Output" ), QObject::tr( "QGIS Metadata File" ) + u" (*.qmd *.QMD)"_s ) );
252}
253
254QVariantMap QgsExportLayerMetadataAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
255{
256 QGS_MARK_ALGORITHM_SOURCE
257
258 QgsMapLayer *layer = parameterAsLayer( parameters, u"INPUT"_s, context );
259 const QString outputFile = parameterAsString( parameters, u"OUTPUT"_s, context );
260
261 if ( !layer )
262 throw QgsProcessingException( QObject::tr( "Invalid input layer" ) );
263
264 bool ok = false;
265 const QString message = layer->saveNamedMetadata( outputFile, ok );
266 if ( !ok )
267 {
268 throw QgsProcessingException( QObject::tr( "Failed to save metadata. Error: %1" ).arg( message ) );
269 }
270
271 QVariantMap results;
272 results.insert( u"OUTPUT"_s, outputFile );
273 return results;
274}
275
277
278QString QgsAddHistoryMetadataAlgorithm::name() const
279{
280 return u"addhistorymetadata"_s;
281}
282
283QString QgsAddHistoryMetadataAlgorithm::displayName() const
284{
285 return QObject::tr( "Add history metadata" );
286}
287
288QStringList QgsAddHistoryMetadataAlgorithm::tags() const
289{
290 return QObject::tr( "add,history,metadata" ).split( ',' );
291}
292
293QString QgsAddHistoryMetadataAlgorithm::group() const
294{
295 return QObject::tr( "Metadata tools" );
296}
297
298QString QgsAddHistoryMetadataAlgorithm::groupId() const
299{
300 return u"metadatatools"_s;
301}
302
303QString QgsAddHistoryMetadataAlgorithm::shortHelpString() const
304{
305 return QObject::tr( "This algorithm adds a new history entry to the layer's metadata." );
306}
307
308QString QgsAddHistoryMetadataAlgorithm::shortDescription() const
309{
310 return QObject::tr( "Adds a new history entry to the layer's metadata." );
311}
312
313QgsAddHistoryMetadataAlgorithm *QgsAddHistoryMetadataAlgorithm::createInstance() const
314{
315 return new QgsAddHistoryMetadataAlgorithm();
316}
317
318void QgsAddHistoryMetadataAlgorithm::initAlgorithm( const QVariantMap & )
319{
320 addParameter( new QgsProcessingParameterMapLayer( u"INPUT"_s, QObject::tr( "Layer" ) ) );
321 addParameter( new QgsProcessingParameterString( u"HISTORY"_s, QObject::tr( "History entry" ) ) );
322 addOutput( new QgsProcessingOutputMapLayer( u"OUTPUT"_s, QObject::tr( "Updated" ) ) );
323}
324
325bool QgsAddHistoryMetadataAlgorithm::prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
326{
327 QGS_MARK_ALGORITHM_SOURCE
328
329 QgsMapLayer *layer = parameterAsLayer( parameters, u"INPUT"_s, context );
330 const QString history = parameterAsString( parameters, u"HISTORY"_s, context );
331
332 if ( !layer )
333 throw QgsProcessingException( QObject::tr( "Invalid input layer" ) );
334
335 mLayerId = layer->id();
336
337 std::unique_ptr<QgsLayerMetadata> md( layer->metadata().clone() );
338 md->addHistoryItem( history );
339 layer->setMetadata( *md.get() );
340
341 return true;
342}
343
344QVariantMap QgsAddHistoryMetadataAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
345{
346 Q_UNUSED( parameters );
347 Q_UNUSED( context );
348
349 QVariantMap results;
350 results.insert( u"OUTPUT"_s, mLayerId );
351 return results;
352}
353
355
356QString QgsUpdateLayerMetadataAlgorithm::name() const
357{
358 return u"updatelayermetadata"_s;
359}
360
361QString QgsUpdateLayerMetadataAlgorithm::displayName() const
362{
363 return QObject::tr( "Update layer metadata" );
364}
365
366QStringList QgsUpdateLayerMetadataAlgorithm::tags() const
367{
368 return QObject::tr( "change,update,layer,metadata,qmd" ).split( ',' );
369}
370
371QString QgsUpdateLayerMetadataAlgorithm::group() const
372{
373 return QObject::tr( "Metadata tools" );
374}
375
376QString QgsUpdateLayerMetadataAlgorithm::groupId() const
377{
378 return u"metadatatools"_s;
379}
380
381QString QgsUpdateLayerMetadataAlgorithm::shortHelpString() const
382{
383 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." );
384}
385
386QString QgsUpdateLayerMetadataAlgorithm::shortDescription() const
387{
388 return QObject::tr( "Copies all non-empty metadata fields from one layer to another." );
389}
390
391QgsUpdateLayerMetadataAlgorithm *QgsUpdateLayerMetadataAlgorithm::createInstance() const
392{
393 return new QgsUpdateLayerMetadataAlgorithm();
394}
395
396void QgsUpdateLayerMetadataAlgorithm::initAlgorithm( const QVariantMap & )
397{
398 addParameter( new QgsProcessingParameterMapLayer( u"SOURCE"_s, QObject::tr( "Source layer" ) ) );
399 addParameter( new QgsProcessingParameterMapLayer( u"TARGET"_s, QObject::tr( "Target layer" ) ) );
400 addOutput( new QgsProcessingOutputMapLayer( u"OUTPUT"_s, QObject::tr( "Updated layer" ) ) );
401}
402
403bool QgsUpdateLayerMetadataAlgorithm::prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
404{
405 QGS_MARK_ALGORITHM_SOURCE
406
407 QgsMapLayer *sourceLayer = parameterAsLayer( parameters, u"SOURCE"_s, context );
408 QgsMapLayer *targetLayer = parameterAsLayer( parameters, u"TARGET"_s, context );
409
410 if ( !sourceLayer )
411 throw QgsProcessingException( QObject::tr( "Invalid source layer" ) );
412
413 if ( !targetLayer )
414 throw QgsProcessingException( QObject::tr( "Invalid target layer" ) );
415
416 mLayerId = targetLayer->id();
417
418 std::unique_ptr<QgsLayerMetadata> md( targetLayer->metadata().clone() );
419 md->combine( &sourceLayer->metadata() );
420 targetLayer->setMetadata( *md.get() );
421
422 return true;
423}
424
425QVariantMap QgsUpdateLayerMetadataAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
426{
427 Q_UNUSED( parameters );
428 Q_UNUSED( context );
429
430 QVariantMap results;
431 results.insert( u"OUTPUT"_s, mLayerId );
432 return results;
433}
434
436
437QString QgsSetMetadataFieldsAlgorithm::name() const
438{
439 return u"setmetadatafields"_s;
440}
441
442QString QgsSetMetadataFieldsAlgorithm::displayName() const
443{
444 return QObject::tr( "Set metadata fields" );
445}
446
447QStringList QgsSetMetadataFieldsAlgorithm::tags() const
448{
449 return QObject::tr( "set,metadata,title,abstract,identifier" ).split( ',' );
450}
451
452QString QgsSetMetadataFieldsAlgorithm::group() const
453{
454 return QObject::tr( "Metadata tools" );
455}
456
457QString QgsSetMetadataFieldsAlgorithm::groupId() const
458{
459 return u"metadatatools"_s;
460}
461
462QString QgsSetMetadataFieldsAlgorithm::shortHelpString() const
463{
464 return QObject::tr( "This algorithm sets various metadata fields for a layer." );
465}
466
467QString QgsSetMetadataFieldsAlgorithm::shortDescription() const
468{
469 return QObject::tr( "Sets various metadata fields for a layer." );
470}
471
472QgsSetMetadataFieldsAlgorithm *QgsSetMetadataFieldsAlgorithm::createInstance() const
473{
474 return new QgsSetMetadataFieldsAlgorithm();
475}
476
477void QgsSetMetadataFieldsAlgorithm::initAlgorithm( const QVariantMap & )
478{
479 addParameter( new QgsProcessingParameterMapLayer( u"INPUT"_s, QObject::tr( "Layer" ) ) );
480 addParameter( new QgsProcessingParameterString( u"IDENTIFIER"_s, QObject::tr( "Identifier" ), QVariant(), false, true ) );
481 addParameter( new QgsProcessingParameterString( u"PARENT_IDENTIFIER"_s, QObject::tr( "Parent identifier" ), QVariant(), false, true ) );
482 addParameter( new QgsProcessingParameterString( u"TITLE"_s, QObject::tr( "Title" ), QVariant(), false, true ) );
483 addParameter( new QgsProcessingParameterString( u"TYPE"_s, QObject::tr( "Type" ), QVariant(), false, true ) );
484 addParameter( new QgsProcessingParameterString( u"LANGUAGE"_s, QObject::tr( "Language" ), QVariant(), false, true ) );
485 addParameter( new QgsProcessingParameterString( u"ENCODING"_s, QObject::tr( "Encoding" ), QVariant(), false, true ) );
486 addParameter( new QgsProcessingParameterString( u"ABSTRACT"_s, QObject::tr( "Abstract" ), QVariant(), true, true ) );
487 addParameter( new QgsProcessingParameterCrs( u"CRS"_s, QObject::tr( "Coordinate reference system" ), QVariant(), true ) );
488 addParameter( new QgsProcessingParameterString( u"FEES"_s, QObject::tr( "Fees" ), QVariant(), false, true ) );
489 addParameter( new QgsProcessingParameterBoolean( u"IGNORE_EMPTY"_s, QObject::tr( "Ignore empty fields" ), false ) );
490 addOutput( new QgsProcessingOutputMapLayer( u"OUTPUT"_s, QObject::tr( "Updated" ) ) );
491}
492
493bool QgsSetMetadataFieldsAlgorithm::prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
494{
495 QGS_MARK_ALGORITHM_SOURCE
496
497 QgsMapLayer *layer = parameterAsLayer( parameters, u"INPUT"_s, context );
498
499 if ( !layer )
500 throw QgsProcessingException( QObject::tr( "Invalid input layer" ) );
501
502 mLayerId = layer->id();
503
504 const bool ignoreEmpty = parameterAsBool( parameters, u"IGNORE_EMPTY"_s, context );
505
506 std::unique_ptr<QgsLayerMetadata> md( layer->metadata().clone() );
507
508 if ( parameters.value( u"IDENTIFIER"_s ).isValid() )
509 {
510 const QString identifier = parameterAsString( parameters, u"IDENTIFIER"_s, context );
511 if ( !identifier.isEmpty() || !ignoreEmpty )
512 {
513 md->setIdentifier( identifier );
514 }
515 }
516
517 if ( parameters.value( u"PARENT_IDENTIFIER"_s ).isValid() )
518 {
519 const QString parentIdentifier = parameterAsString( parameters, u"PARENT_IDENTIFIER"_s, context );
520 if ( !parentIdentifier.isEmpty() || !ignoreEmpty )
521 {
522 md->setParentIdentifier( parentIdentifier );
523 }
524 }
525
526 if ( parameters.value( u"TITLE"_s ).isValid() )
527 {
528 const QString title = parameterAsString( parameters, u"TITLE"_s, context );
529 if ( !title.isEmpty() || !ignoreEmpty )
530 {
531 md->setTitle( title );
532 }
533 }
534
535 if ( parameters.value( u"TYPE"_s ).isValid() )
536 {
537 const QString type = parameterAsString( parameters, u"TYPE"_s, context );
538 if ( !type.isEmpty() || !ignoreEmpty )
539 {
540 md->setType( type );
541 }
542 }
543
544 if ( parameters.value( u"LANGUAGE"_s ).isValid() )
545 {
546 const QString language = parameterAsString( parameters, u"LANGUAGE"_s, context );
547 if ( !language.isEmpty() || !ignoreEmpty )
548 {
549 md->setLanguage( language );
550 }
551 }
552
553 if ( parameters.value( u"ENCODING"_s ).isValid() )
554 {
555 const QString encoding = parameterAsString( parameters, u"ENCODING"_s, context );
556 if ( !encoding.isEmpty() || !ignoreEmpty )
557 {
558 md->setEncoding( encoding );
559 }
560 }
561
562 if ( parameters.value( u"ABSTRACT"_s ).isValid() )
563 {
564 const QString abstract = parameterAsString( parameters, u"ABSTRACT"_s, context );
565 if ( !abstract.isEmpty() || !ignoreEmpty )
566 {
567 md->setAbstract( abstract );
568 }
569 }
570
571 if ( parameters.value( u"CRS"_s ).isValid() )
572 {
573 const QgsCoordinateReferenceSystem crs = parameterAsCrs( parameters, u"CRS"_s, context );
574 if ( crs.isValid() || !ignoreEmpty )
575 {
576 md->setCrs( crs );
577 }
578 }
579
580 if ( parameters.value( u"FEES"_s ).isValid() )
581 {
582 const QString fees = parameterAsString( parameters, u"FEES"_s, context );
583 if ( !fees.isEmpty() || !ignoreEmpty )
584 {
585 md->setFees( fees );
586 }
587 }
588
589 layer->setMetadata( *md.get() );
590
591 return true;
592}
593
594QVariantMap QgsSetMetadataFieldsAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
595{
596 Q_UNUSED( parameters );
597 Q_UNUSED( context );
598
599 QVariantMap results;
600 results.insert( u"OUTPUT"_s, mLayerId );
601 return results;
602}
603
@ File
Parameter is a single file.
Definition qgis.h:4008
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
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 ...
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.