42#include <QRegularExpression>
46#include "moc_qgsprocessingutils.cpp"
50 return compatibleMapLayers< QgsRasterLayer >( project, sort );
56 return QList<QgsVectorLayer *>();
58 QList<QgsVectorLayer *> layers;
62 if ( canUseLayer( l, geometryTypes ) )
70 return QString::localeAwareCompare( a->name(), b->name() ) < 0;
78 return compatibleMapLayers< QgsMeshLayer >( project, sort );
83 return compatibleMapLayers< QgsPluginLayer >( project, sort );
88 return compatibleMapLayers< QgsPointCloudLayer >( project, sort );
94 QList<QgsAnnotationLayer *> res = compatibleMapLayers< QgsAnnotationLayer >( project,
false );
102 return QString::localeAwareCompare( a->name(), b->name() ) < 0;
111 return compatibleMapLayers< QgsVectorTileLayer >( project, sort );
116 return compatibleMapLayers< QgsTiledSceneLayer >( project, sort );
119template<
typename T> QList<T *> QgsProcessingUtils::compatibleMapLayers(
QgsProject *project,
bool sort )
125 const auto projectLayers = project->
layers<T *>();
126 for ( T *l : projectLayers )
128 if ( canUseLayer( l ) )
134 std::sort( layers.begin(), layers.end(), [](
const T * a,
const T * b ) ->
bool
136 return QString::localeAwareCompare( a->name(), b->name() ) < 0;
145 return QList<QgsMapLayer *>();
147 QList<QgsMapLayer *> layers;
149 const auto rasterLayers = compatibleMapLayers< QgsRasterLayer >( project,
false );
157 const auto meshLayers = compatibleMapLayers< QgsMeshLayer >( project,
false );
161 const auto pointCloudLayers = compatibleMapLayers< QgsPointCloudLayer >( project,
false );
165 const auto annotationLayers = compatibleMapLayers< QgsAnnotationLayer >( project,
false );
170 const auto vectorTileLayers = compatibleMapLayers< QgsVectorTileLayer >( project,
false );
174 const auto tiledSceneLayers = compatibleMapLayers< QgsTiledSceneLayer >( project,
false );
178 const auto pluginLayers = compatibleMapLayers< QgsPluginLayer >( project,
false );
186 return QString::localeAwareCompare( a->name(), b->name() ) < 0;
194 return QStringLiteral(
"%1://%2" ).arg( providerKey, uri );
199 const thread_local QRegularExpression re( QStringLiteral(
"^(\\w+?):\\/\\/(.+)$" ) );
200 const QRegularExpressionMatch match = re.match(
string );
201 if ( !match.hasMatch() )
204 providerKey = match.captured( 1 );
205 uri = match.captured( 2 );
213 if ( !store ||
string.isEmpty() )
216 QList< QgsMapLayer * > layers = store->
mapLayers().values();
218 layers.erase( std::remove_if( layers.begin(), layers.end(), [](
QgsMapLayer * layer )
220 switch ( layer->type() )
222 case Qgis::LayerType::Vector:
223 return !canUseLayer( qobject_cast< QgsVectorLayer * >( layer ) );
224 case Qgis::LayerType::Raster:
225 return !canUseLayer( qobject_cast< QgsRasterLayer * >( layer ) );
226 case Qgis::LayerType::Plugin:
227 case Qgis::LayerType::Group:
229 case Qgis::LayerType::Mesh:
230 return !canUseLayer( qobject_cast< QgsMeshLayer * >( layer ) );
231 case Qgis::LayerType::VectorTile:
232 return !canUseLayer( qobject_cast< QgsVectorTileLayer * >( layer ) );
233 case Qgis::LayerType::TiledScene:
234 return !canUseLayer( qobject_cast< QgsTiledSceneLayer * >( layer ) );
235 case Qgis::LayerType::PointCloud:
236 return !canUseLayer( qobject_cast< QgsPointCloudLayer * >( layer ) );
237 case Qgis::LayerType::Annotation:
238 return !canUseLayer( qobject_cast< QgsAnnotationLayer * >( layer ) );
243 auto isCompatibleType = [typeHint](
QgsMapLayer * l ) ->
bool
247 case LayerHint::UnknownType:
250 case LayerHint::Vector:
253 case LayerHint::Raster:
256 case LayerHint::Mesh:
259 case LayerHint::PointCloud:
262 case LayerHint::Annotation:
265 case LayerHint::VectorTile:
268 case LayerHint::TiledScene:
276 if ( isCompatibleType( l ) && l->id() ==
string )
281 if ( isCompatibleType( l ) && l->name() ==
string )
286 if ( isCompatibleType( l ) && normalizeLayerSource( l->source() ) == normalizeLayerSource(
string ) )
303 if ( providerMetadata )
306 const QVariantMap parts = providerMetadata->
decodeUri( uri );
307 const QString layerName = parts.value( QStringLiteral(
"layerName" ) ).toString();
309 if ( !layerName.isEmpty() )
313 else if (
const QString path = parts.value( QStringLiteral(
"path" ) ).toString(); !path.isEmpty() )
315 name = QFileInfo( path ).baseName();
320 const QStringList components = uri.split(
'|' );
321 if ( components.isEmpty() )
324 if ( QFileInfo fi( components.at( 0 ) ); fi.isFile() )
325 name = fi.baseName();
327 name = QFileInfo( uri ).baseName();
330 if ( name.isEmpty() )
332 name = QgsDataSourceUri( uri ).table();
334 if ( name.isEmpty() )
339 QList< Qgis::LayerType > candidateTypes;
344 if ( providerMetadata )
377 QgsVectorLayer::LayerOptions options { transformContext };
381 std::unique_ptr< QgsVectorLayer > layer;
382 if ( providerMetadata )
384 layer = std::make_unique<QgsVectorLayer>( uri, name, providerMetadata->
key(), options );
389 layer = std::make_unique<QgsVectorLayer>( uri, name, QStringLiteral(
"ogr" ), options );
391 if ( layer->isValid() )
393 return layer.release();
398 QgsRasterLayer::LayerOptions rasterOptions;
402 std::unique_ptr< QgsRasterLayer > rasterLayer;
403 if ( providerMetadata )
405 rasterLayer = std::make_unique< QgsRasterLayer >( uri, name, providerMetadata->
key(), rasterOptions );
410 rasterLayer = std::make_unique< QgsRasterLayer >( uri, name, QStringLiteral(
"gdal" ), rasterOptions );
413 if ( rasterLayer->isValid() )
415 return rasterLayer.release();
420 QgsMeshLayer::LayerOptions meshOptions;
423 std::unique_ptr< QgsMeshLayer > meshLayer;
424 if ( providerMetadata )
426 meshLayer = std::make_unique< QgsMeshLayer >( uri, name, providerMetadata->
key(), meshOptions );
430 meshLayer = std::make_unique< QgsMeshLayer >( uri, name, QStringLiteral(
"mdal" ), meshOptions );
432 if ( meshLayer->isValid() )
434 return meshLayer.release();
439 QgsPointCloudLayer::LayerOptions pointCloudOptions;
447 std::unique_ptr< QgsPointCloudLayer > pointCloudLayer;
448 if ( providerMetadata )
450 pointCloudLayer = std::make_unique< QgsPointCloudLayer >( uri, name, providerMetadata->
key(), pointCloudOptions );
455 if ( !preferredProviders.empty() )
457 pointCloudLayer = std::make_unique< QgsPointCloudLayer >( uri, name, preferredProviders.at( 0 ).metadata()->key(), pointCloudOptions );
467 pointCloudLayer = std::make_unique< QgsPointCloudLayer >( uri, name, QStringLiteral(
"pdal" ), pointCloudOptions );
471 if ( pointCloudLayer && pointCloudLayer->isValid() )
473 return pointCloudLayer.release();
478 QgsDataSourceUri dsUri;
479 dsUri.
setParam(
"type",
"mbtiles" );
482 std::unique_ptr< QgsVectorTileLayer > tileLayer;
483 tileLayer = std::make_unique< QgsVectorTileLayer >( dsUri.
encodedUri(), name );
485 if ( tileLayer->isValid() )
487 return tileLayer.release();
492 QgsTiledSceneLayer::LayerOptions tiledSceneOptions;
495 std::unique_ptr< QgsTiledSceneLayer > tiledSceneLayer;
496 if ( providerMetadata )
498 tiledSceneLayer = std::make_unique< QgsTiledSceneLayer >( uri, name, providerMetadata->
key(), tiledSceneOptions );
503 if ( !preferredProviders.empty() )
505 tiledSceneLayer = std::make_unique< QgsTiledSceneLayer >( uri, name, preferredProviders.at( 0 ).metadata()->key(), tiledSceneOptions );
508 if ( tiledSceneLayer && tiledSceneLayer->isValid() )
510 return tiledSceneLayer.release();
518 if (
string.isEmpty() )
522 if ( context.
project() && ( typeHint ==
LayerHint::Annotation ) &&
string.compare( QLatin1String(
"main" ), Qt::CaseInsensitive ) == 0 )
526 if (
auto *lProject = context.
project() )
528 QgsMapLayer *layer = mapLayerFromStore(
string, lProject->layerStore(), typeHint );
542 if ( !allowLoadingNewLayers )
545 layer = loadMapLayerFromString(
string, context.
transformContext(), typeHint, flags );
559 QVariant val = value;
560 bool selectedFeaturesOnly =
false;
561 long long featureLimit = -1;
562 QString filterExpression;
563 bool overrideGeometryCheck =
false;
565 if ( val.userType() == qMetaTypeId<QgsProcessingFeatureSourceDefinition>() )
576 else if ( val.userType() == qMetaTypeId<QgsProcessingOutputLayerDefinition>() )
583 if (
QgsVectorLayer *layer = qobject_cast< QgsVectorLayer * >( qvariant_cast<QObject *>( val ) ) )
585 auto source = std::make_unique< QgsProcessingFeatureSource >( layer, context,
false, featureLimit, filterExpression );
586 if ( overrideGeometryCheck )
587 source->setInvalidGeometryCheck( geometryCheck );
588 return source.release();
592 if ( val.userType() == qMetaTypeId<QgsProperty>() )
596 else if ( !val.isValid() || val.toString().isEmpty() )
599 if (
QgsVectorLayer *layer = qobject_cast< QgsVectorLayer * >( qvariant_cast<QObject *>( fallbackValue ) ) )
601 auto source = std::make_unique< QgsProcessingFeatureSource >( layer, context,
false, featureLimit, filterExpression );
602 if ( overrideGeometryCheck )
603 source->setInvalidGeometryCheck( geometryCheck );
604 return source.release();
607 layerRef = fallbackValue.toString();
611 layerRef = val.toString();
614 if ( layerRef.isEmpty() )
621 std::unique_ptr< QgsProcessingFeatureSource> source;
622 if ( selectedFeaturesOnly )
628 source = std::make_unique< QgsProcessingFeatureSource >( vl, context,
false, featureLimit, filterExpression );
631 if ( overrideGeometryCheck )
632 source->setInvalidGeometryCheck( geometryCheck );
633 return source.release();
638 QVariant val = value;
640 if ( val.userType() == qMetaTypeId<QgsCoordinateReferenceSystem>() )
645 else if ( val.userType() == qMetaTypeId<QgsProcessingFeatureSourceDefinition>() )
651 else if ( val.userType() == qMetaTypeId<QgsProcessingOutputLayerDefinition>() )
664 if (
QgsMapLayer *layer = qobject_cast< QgsMapLayer * >( qvariant_cast<QObject *>( val ) ) )
667 if ( val.userType() == qMetaTypeId<QgsProperty>() )
670 if ( !val.isValid() )
676 QString crsText = val.toString();
677 if ( crsText.isEmpty() )
678 crsText = fallbackValue.toString();
680 if ( crsText.isEmpty() )
684 if ( context.
project() && crsText.compare( QLatin1String(
"ProjectCrs" ), Qt::CaseInsensitive ) == 0 )
700bool QgsProcessingUtils::canUseLayer(
const QgsMeshLayer *layer )
705bool QgsProcessingUtils::canUseLayer(
const QgsPluginLayer *layer )
707 return layer && layer->
isValid();
712 return layer && layer->
isValid();
715bool QgsProcessingUtils::canUseLayer(
const QgsRasterLayer *layer )
717 return layer && layer->
isValid();
722 return layer && layer->
isValid();
727 return layer && layer->
isValid();
732 return layer && layer->
isValid();
735bool QgsProcessingUtils::canUseLayer(
const QgsVectorLayer *layer,
const QList<int> &sourceTypes )
737 return layer && layer->
isValid() &&
738 ( sourceTypes.isEmpty()
749 QString normalized = source;
750 normalized.replace(
'\\',
'/' );
751 return normalized.trimmed();
760 if ( !source.isEmpty() )
765 if ( provider.compare( QLatin1String(
"gdal" ), Qt::CaseInsensitive ) == 0
766 || provider.compare( QLatin1String(
"ogr" ), Qt::CaseInsensitive ) == 0
767 || provider.compare( QLatin1String(
"mdal" ), Qt::CaseInsensitive ) == 0 )
770 return QStringLiteral(
"%1://%2" ).arg( provider, source );
783 if ( !value.isValid() )
784 return QStringLiteral(
"None" );
786 if ( value.userType() == qMetaTypeId<QgsProperty>() )
787 return QStringLiteral(
"QgsProperty.fromExpression('%1')" ).arg( value.value<
QgsProperty >().
asExpression() );
788 else if ( value.userType() == qMetaTypeId<QgsCoordinateReferenceSystem>() )
791 return QStringLiteral(
"QgsCoordinateReferenceSystem()" );
795 else if ( value.userType() == qMetaTypeId<QgsRectangle>() )
803 else if ( value.userType() == qMetaTypeId<QgsReferencedRectangle>() )
811 else if ( value.userType() == qMetaTypeId<QgsPointXY>() )
817 else if ( value.userType() == qMetaTypeId<QgsReferencedPointXY>() )
825 switch ( value.userType() )
827 case QMetaType::Type::Bool:
828 return value.toBool() ? QStringLiteral(
"True" ) : QStringLiteral(
"False" );
830 case QMetaType::Type::Double:
831 return QString::number( value.toDouble() );
833 case QMetaType::Type::Int:
834 case QMetaType::Type::UInt:
835 return QString::number( value.toInt() );
837 case QMetaType::Type::LongLong:
838 case QMetaType::Type::ULongLong:
839 return QString::number( value.toLongLong() );
841 case QMetaType::Type::QVariantList:
844 const QVariantList vl = value.toList();
845 for (
const QVariant &v : vl )
849 return parts.join(
',' ).prepend(
'[' ).append(
']' );
852 case QMetaType::Type::QVariantMap:
854 const QVariantMap map = value.toMap();
856 parts.reserve( map.size() );
857 for (
auto it = map.constBegin(); it != map.constEnd(); ++it )
861 return parts.join(
',' ).prepend(
'{' ).append(
'}' );
864 case QMetaType::Type::QDateTime:
866 const QDateTime dateTime = value.toDateTime();
867 return QStringLiteral(
"QDateTime(QDate(%1, %2, %3), QTime(%4, %5, %6))" )
868 .arg( dateTime.date().year() )
869 .arg( dateTime.date().month() )
870 .arg( dateTime.date().day() )
871 .arg( dateTime.time().hour() )
872 .arg( dateTime.time().minute() )
873 .arg( dateTime.time().second() );
886 s.replace(
'\\', QLatin1String(
"\\\\" ) );
887 s.replace(
'\n', QLatin1String(
"\\n" ) );
888 s.replace(
'\r', QLatin1String(
"\\r" ) );
889 s.replace(
'\t', QLatin1String(
"\\t" ) );
891 if ( s.contains(
'\'' ) && !s.contains(
'\"' ) )
893 s = s.prepend(
'"' ).append(
'"' );
897 s.replace(
'\'', QLatin1String(
"\\\'" ) );
898 s = s.prepend(
'\'' ).append(
'\'' );
903void QgsProcessingUtils::parseDestinationString( QString &destination, QString &providerKey, QString &uri, QString &layerName, QString &format, QMap<QString, QVariant> &options,
bool &useWriter, QString &extension )
910 const thread_local QRegularExpression splitRx( QStringLiteral(
"^(.{3,}?):(.*)$" ) );
911 QRegularExpressionMatch match = splitRx.match( destination );
912 if ( match.hasMatch() )
914 providerKey = match.captured( 1 );
915 uri = match.captured( 2 );
922 if ( providerKey == QLatin1String(
"postgis" ) )
924 providerKey = QStringLiteral(
"postgres" );
926 if ( providerKey == QLatin1String(
"ogr" ) )
928 QgsDataSourceUri dsUri( uri );
931 if ( !dsUri.
table().isEmpty() )
933 layerName = dsUri.
table();
934 options.insert( QStringLiteral(
"layerName" ), layerName );
937 extension = QFileInfo( uri ).completeSuffix();
939 options.insert( QStringLiteral(
"driverName" ), format );
943 extension = QFileInfo( uri ).completeSuffix();
946 options.insert( QStringLiteral(
"update" ),
true );
953 providerKey = QStringLiteral(
"ogr" );
955 const thread_local QRegularExpression splitRx( QStringLiteral(
"^(.*)\\.(.*?)$" ) );
956 QRegularExpressionMatch match = splitRx.match( destination );
957 if ( match.hasMatch() )
959 extension = match.captured( 2 );
963 if ( format.isEmpty() )
965 format = QStringLiteral(
"GPKG" );
966 destination = destination + QStringLiteral(
".gpkg" );
969 options.insert( QStringLiteral(
"driverName" ), format );
976 QVariantMap options = createOptions;
977 if ( !options.contains( QStringLiteral(
"fileEncoding" ) ) )
983 if ( destination.isEmpty() || destination.startsWith( QLatin1String(
"memory:" ) ) )
986 if ( destination.startsWith( QLatin1String(
"memory:" ) ) )
987 destination = destination.mid( 7 );
989 if ( destination.isEmpty() )
990 destination = QStringLiteral(
"output" );
994 if ( !layer || !layer->isValid() )
1001 for (
const QgsField &field : fields )
1004 if ( !field.alias().isEmpty() )
1005 feedback->pushWarning( QObject::tr(
"%1: Aliases are not compatible with scratch layers" ).arg( field.name() ) );
1006 if ( !field.alias().isEmpty() )
1007 feedback->pushWarning( QObject::tr(
"%1: Comments are not compatible with scratch layers" ).arg( field.name() ) );
1014 destination = layer->id();
1017 auto sink = std::make_unique<QgsProcessingFeatureSink>( layer->dataProvider(), destination, context );
1020 return sink.release();
1024 QString providerKey;
1029 bool useWriter =
false;
1030 parseDestinationString( destination, providerKey, uri, layerName, format, options, useWriter, extension );
1033 if ( useWriter && providerKey == QLatin1String(
"ogr" ) )
1037 QString finalFileName;
1038 QString finalLayerName;
1040 saveOptions.
fileEncoding = options.value( QStringLiteral(
"fileEncoding" ) ).toString();
1041 saveOptions.
layerName = !layerName.isEmpty() ? layerName : options.value( QStringLiteral(
"layerName" ) ).toString();
1046 if ( remappingDefinition )
1050 auto vl = std::make_unique< QgsVectorLayer >( destination );
1051 if ( vl->isValid() )
1055 newFields = vl->fields();
1065 if ( writer->hasError() )
1067 throw QgsProcessingException( QObject::tr(
"Could not create layer %1: %2" ).arg( destination, writer->errorMessage() ) );
1072 for (
const QgsField &field : fields )
1075 feedback->pushWarning( QObject::tr(
"%1: Aliases are not supported by %2" ).arg( field.name(), writer->driverLongName() ) );
1077 feedback->pushWarning( QObject::tr(
"%1: Comments are not supported by %2" ).arg( field.name(), writer->driverLongName() ) );
1081 destination = finalFileName;
1082 if ( !saveOptions.
layerName.isEmpty() && !finalLayerName.isEmpty() )
1083 destination += QStringLiteral(
"|layername=%1" ).arg( finalLayerName );
1085 if ( remappingDefinition )
1087 auto remapSink = std::make_unique< QgsRemappingProxyFeatureSink >( *remappingDefinition, writer.release(),
true );
1098 if ( remappingDefinition )
1103 if ( !layerName.isEmpty() )
1106 parts.insert( QStringLiteral(
"layerName" ), layerName );
1110 auto layer = std::make_unique<QgsVectorLayer>( uri, destination, providerKey, layerOptions );
1112 destination = layer->
id();
1123 for (
const QgsField &field : fields )
1126 feedback->pushWarning( QObject::tr(
"%1: Aliases are not supported by the %2 provider" ).arg( field.name(), providerKey ) );
1128 feedback->pushWarning( QObject::tr(
"%1: Comments are not supported by the %2 provider" ).arg( field.name(), providerKey ) );
1132 auto remapSink = std::make_unique< QgsRemappingProxyFeatureSink >( *remappingDefinition, layer->
dataProvider(),
false );
1142 auto exporter = std::make_unique<QgsVectorLayerExporter>( uri, providerKey, newFields, geometryType, crs,
true, options, sinkFlags );
1145 throw QgsProcessingException( QObject::tr(
"Could not create layer %1: %2" ).arg( destination, exporter->errorMessage() ) );
1149 if ( !layerName.isEmpty() )
1151 uri += QStringLiteral(
"|layername=%1" ).arg( layerName );
1158 for (
const QgsField &field : fields )
1161 feedback->pushWarning( QObject::tr(
"%1: Aliases are not supported by the %2 provider" ).arg( field.name(), providerKey ) );
1163 feedback->pushWarning( QObject::tr(
"%1: Comments are not supported by the %2 provider" ).arg( field.name(), providerKey ) );
1175 *sink =
createFeatureSink( destination, context, fields, geometryType, crs, options );
1221 if ( !input.isValid() )
1222 return QStringLiteral(
"memory:%1" ).arg(
id.toString() );
1224 if ( input.userType() == qMetaTypeId<QgsProcessingOutputLayerDefinition>() )
1231 else if ( input.userType() == qMetaTypeId<QgsProperty>() )
1238 QString res = input.toString();
1244 else if ( res.startsWith( QLatin1String(
"memory:" ) ) )
1246 return QString( res +
'_' +
id.toString() );
1252 int lastIndex = res.lastIndexOf(
'.' );
1253 return lastIndex >= 0 ? QString( res.left( lastIndex ) +
'_' +
id.toString() + res.mid( lastIndex ) ) : QString( res +
'_' +
id.toString() );
1264 static std::vector< std::unique_ptr< QTemporaryDir > > sTempFolders;
1265 static QString sFolder;
1266 static QMutex sMutex;
1267 QMutexLocker locker( &sMutex );
1272 if ( basePath.isEmpty() )
1275 if ( basePath.isEmpty() )
1278 if ( sTempFolders.empty() )
1280 const QString templatePath = QStringLiteral(
"%1/processing_XXXXXX" ).arg( QDir::tempPath() );
1281 auto tempFolder = std::make_unique< QTemporaryDir >( templatePath );
1283 sTempFolders.emplace_back( std::move(
tempFolder ) );
1286 else if ( sFolder.isEmpty() || !sFolder.startsWith( basePath ) || sTempFolders.empty() )
1288 if ( !QDir().exists( basePath ) )
1289 QDir().mkpath( basePath );
1291 const QString templatePath = QStringLiteral(
"%1/processing_XXXXXX" ).arg( basePath );
1292 auto tempFolder = std::make_unique< QTemporaryDir >( templatePath );
1294 sTempFolders.emplace_back( std::move(
tempFolder ) );
1301 QString subPath = QUuid::createUuid().toString().remove(
'-' ).remove(
'{' ).remove(
'}' );
1302 QString path =
tempFolder( context ) +
'/' + subPath;
1303 if ( !QDir( path ).exists() )
1306 tmpDir.mkdir( path );
1313 auto getText = [map](
const QString & key )->QString
1315 if ( map.contains( key ) )
1316 return map.value( key ).toString();
1321 s += QStringLiteral(
"<html><body><p>" ) + getText( QStringLiteral(
"ALG_DESC" ) ) + QStringLiteral(
"</p>\n" );
1324 const auto parameterDefinitions =
algorithm->parameterDefinitions();
1330 if ( !getText( def->name() ).isEmpty() )
1332 inputs += QStringLiteral(
"<h3>" ) + def->description() + QStringLiteral(
"</h3>\n" );
1333 inputs += QStringLiteral(
"<p>" ) + getText( def->name() ) + QStringLiteral(
"</p>\n" );
1336 if ( !inputs.isEmpty() )
1337 s += QStringLiteral(
"<h2>" ) + QObject::tr(
"Input parameters" ) + QStringLiteral(
"</h2>\n" ) + inputs;
1340 const auto outputDefinitions =
algorithm->outputDefinitions();
1343 if ( !getText( def->name() ).isEmpty() )
1345 outputs += QStringLiteral(
"<h3>" ) + def->description() + QStringLiteral(
"</h3>\n" );
1346 outputs += QStringLiteral(
"<p>" ) + getText( def->name() ) + QStringLiteral(
"</p>\n" );
1349 if ( !outputs.isEmpty() )
1350 s += QStringLiteral(
"<h2>" ) + QObject::tr(
"Outputs" ) + QStringLiteral(
"</h2>\n" ) + outputs;
1352 if ( !map.value( QStringLiteral(
"EXAMPLES" ) ).toString().isEmpty() )
1353 s += QStringLiteral(
"<h2>%1</h2>\n<p>%2</p>" ).arg( QObject::tr(
"Examples" ), getText( QStringLiteral(
"EXAMPLES" ) ) );
1355 s += QLatin1String(
"<br>" );
1356 if ( !map.value( QStringLiteral(
"ALG_CREATOR" ) ).toString().isEmpty() )
1357 s += QStringLiteral(
"<p align=\"right\">" ) + QObject::tr(
"Algorithm author:" ) + QStringLiteral(
" " ) + getText( QStringLiteral(
"ALG_CREATOR" ) ) + QStringLiteral(
"</p>" );
1358 if ( !map.value( QStringLiteral(
"ALG_HELP_CREATOR" ) ).toString().isEmpty() )
1359 s += QStringLiteral(
"<p align=\"right\">" ) + QObject::tr(
"Help author:" ) + QStringLiteral(
" " ) + getText( QStringLiteral(
"ALG_HELP_CREATOR" ) ) + QStringLiteral(
"</p>" );
1360 if ( !map.value( QStringLiteral(
"ALG_VERSION" ) ).toString().isEmpty() )
1361 s += QStringLiteral(
"<p align=\"right\">" ) + QObject::tr(
"Algorithm version:" ) + QStringLiteral(
" " ) + getText( QStringLiteral(
"ALG_VERSION" ) ) + QStringLiteral(
"</p>" );
1363 s += QLatin1String(
"</body></html>" );
1372 if ( def->name().compare( name, Qt::CaseInsensitive ) == 0 )
1380 long long featureLimit,
const QString &filterExpression,
bool renameFid )
1382 bool requiresTranslation =
false;
1386 requiresTranslation = requiresTranslation || selectedFeaturesOnly;
1389 requiresTranslation = requiresTranslation || featureLimit != -1 || !filterExpression.isEmpty();
1394 requiresTranslation = requiresTranslation || vl->
providerType() != QLatin1String(
"ogr" );
1398 requiresTranslation = requiresTranslation || !vl->
subsetString().isEmpty();
1402 requiresTranslation = requiresTranslation || vl->
source().startsWith( QLatin1String(
"/vsi" ) );
1406 if ( !requiresTranslation )
1409 if ( parts.contains( QStringLiteral(
"path" ) ) )
1411 diskPath = parts.value( QStringLiteral(
"path" ) ).toString();
1412 QFileInfo fi( diskPath );
1413 requiresTranslation = !compatibleFormats.contains( fi.suffix(), Qt::CaseInsensitive );
1417 const QString srcLayerName = parts.value( QStringLiteral(
"layerName" ) ).toString();
1421 *layerName = srcLayerName;
1426 requiresTranslation = requiresTranslation || ( !srcLayerName.isEmpty() && srcLayerName != fi.baseName() );
1431 requiresTranslation =
true;
1435 if ( requiresTranslation )
1445 const int fidIndex = fields.
lookupField( QStringLiteral(
"fid" ) );
1446 if ( fidIndex >= 0 )
1447 fields.
rename( fidIndex, QStringLiteral(
"OLD_FID" ) );
1453 if ( featureLimit != -1 )
1457 if ( !filterExpression.isEmpty() )
1462 if ( selectedFeaturesOnly )
1467 constexpr int maxErrors { 10 };
1468 unsigned long errorCounter { 0 };
1476 const QString errorMessage = writer->errorMessage();
1477 if ( !renameFid && saveOptions.
driverName == QLatin1String(
"GPKG" ) && errorMessage.contains(
"fid", Qt::CaseInsensitive ) )
1480 feedback->
reportError( QObject::tr(
"Cannot store existing FID values in temporary GeoPackage layer, these will be moved to \"OLD_FID\" instead." ),
false );
1482 featureLimit, filterExpression,
true );
1486 if ( errorCounter++ < maxErrors )
1488 errorText = QObject::tr(
"Error writing feature # %1 to output layer: %2" ).arg( QString::number( f.
id() ), errorMessage );
1494 if ( errorCounter >= maxErrors )
1496 feedback->
reportError( QObject::tr(
"There were %1 errors writing features, only the first %2 have been reported." ).arg( QString::number( errorCounter ), QString::number( maxErrors ) ) );
1508 return convertToCompatibleFormatInternal( vl, selectedFeaturesOnly, baseName, compatibleFormats, preferredFormat, context, feedback,
nullptr, featureLimit, filterExpression,
false );
1514 return convertToCompatibleFormatInternal( layer, selectedFeaturesOnly, baseName, compatibleFormats, preferredFormat, context, feedback, &layerName, featureLimit, filterExpression,
false );
1520 QSet< QString > usedNames;
1521 for (
const QgsField &f : fieldsA )
1523 usedNames.insert( f.name().toLower() );
1526 for (
const QgsField &f : fieldsB )
1529 newField.
setName( fieldsBPrefix + f.name() );
1530 if ( usedNames.contains( newField.
name().toLower() ) )
1533 QString newName = newField.
name() +
'_' + QString::number( idx );
1534 while ( usedNames.contains( newName.toLower() ) || fieldsB.
indexOf( newName ) != -1 )
1537 newName = newField.
name() +
'_' + QString::number( idx );
1540 outFields.
append( newField );
1544 outFields.
append( newField );
1546 usedNames.insert( newField.
name() );
1556 if ( !fieldNames.isEmpty() )
1558 indices.reserve( fieldNames.count() );
1559 for (
const QString &f : fieldNames )
1563 indices.append( idx );
1568 indices.reserve( fields.
count() );
1569 for (
int i = 0; i < fields.
count(); ++i )
1570 indices.append( i );
1579 for (
int i : indices )
1580 fieldsSubset.
append( fields.
at( i ) );
1581 return fieldsSubset;
1587 if ( setting.isEmpty() )
1588 return QStringLiteral(
"gpkg" );
1590 if ( setting.startsWith(
'.' ) )
1591 setting = setting.mid( 1 );
1594 if ( !supportedFormats.contains( setting, Qt::CaseInsensitive ) )
1595 return QStringLiteral(
"gpkg" );
1603 if ( setting.isEmpty() )
1604 return QStringLiteral(
"tif" );
1606 if ( setting.startsWith(
'.' ) )
1607 setting = setting.mid( 1 );
1610 if ( !supportedFormats.contains( setting, Qt::CaseInsensitive ) )
1611 return QStringLiteral(
"tif" );
1618 return QStringLiteral(
"las" );
1623 return QStringLiteral(
"mbtiles" );
1628 auto layerPointerToString = [](
QgsMapLayer * layer ) -> QString
1630 if ( layer && layer->
providerType() == QLatin1String(
"memory" ) )
1638 auto cleanPointerValues = [&layerPointerToString](
const QVariant & value ) -> QVariant
1640 if (
QgsMapLayer *layer = qobject_cast< QgsMapLayer * >( value.value< QObject * >() ) )
1643 return layerPointerToString( layer );
1645 else if ( value.userType() == QMetaType::type(
"QPointer< QgsMapLayer >" ) )
1648 return layerPointerToString( value.value< QPointer< QgsMapLayer > >().data() );
1657 for (
auto it = map.constBegin(); it != map.constEnd(); ++it )
1659 if ( it->userType() == QMetaType::Type::QVariantMap )
1663 else if ( it->userType() == QMetaType::Type::QVariantList )
1666 const QVariantList source = it.value().toList();
1667 dest.reserve( source.size() );
1668 for (
const QVariant &v : source )
1670 dest.append( cleanPointerValues( v ) );
1672 res.insert( it.key(), dest );
1676 res.insert( it.key(), cleanPointerValues( it.value() ) );
1686 for (
auto it = parameters.constBegin(); it != parameters.constEnd(); ++it )
1688 if ( it.value().userType() == QMetaType::Type::QVariantMap )
1690 const QVariantMap value = it.value().toMap();
1691 if ( value.value( QStringLiteral(
"type" ) ).toString() == QLatin1String(
"data_defined" ) )
1693 const QString expression = value.value( QStringLiteral(
"expression" ) ).toString();
1694 const QString field = value.value( QStringLiteral(
"field" ) ).toString();
1695 if ( !expression.isEmpty() )
1699 else if ( !field.isEmpty() )
1706 error = QObject::tr(
"Invalid data defined parameter for %1, requires 'expression' or 'field' values." ).arg( it.key() );
1711 output.insert( it.key(), it.value() );
1714 else if ( it.value().userType() == QMetaType::Type::QString )
1716 const QString stringValue = it.value().toString();
1718 if ( stringValue.startsWith( QLatin1String(
"field:" ) ) )
1722 else if ( stringValue.startsWith( QLatin1String(
"expression:" ) ) )
1728 output.insert( it.key(), it.value() );
1733 output.insert( it.key(), it.value() );
1741 if ( ! QTextCodec::availableCodecs().contains( defaultEncoding.toLatin1() ) )
1743 const QString systemCodec = QTextCodec::codecForLocale()->name();
1744 if ( ! systemCodec.isEmpty() )
1748 return QString(
"UTF-8" );
1751 return defaultEncoding;
1759 : mSource( originalSource )
1760 , mOwnsSource( ownsOriginalSource )
1762 , mSourceFields( mSource->
fields() )
1763 , mSourceWkbType( mSource->
wkbType() )
1768 ?
Qgis::InvalidGeometryCheck::NoCheck
1770 , mInvalidGeometryCallback( context.invalidGeometryCallback( originalSource ) )
1771 , mTransformErrorCallback( context.transformErrorCallback() )
1772 , mInvalidGeometryCallbackSkip( context.defaultInvalidGeometryCallbackForCheck(
Qgis::InvalidGeometryCheck::SkipInvalid, originalSource ) )
1773 , mInvalidGeometryCallbackAbort( context.defaultInvalidGeometryCallbackForCheck(
Qgis::InvalidGeometryCheck::AbortOnInvalid, originalSource ) )
1774 , mFeatureLimit( featureLimit )
1775 , mFilterExpression( filterExpression )
1797 if ( mFeatureLimit != -1 && req.
limit() != -1 )
1798 req.
setLimit( std::min(
static_cast< long long >( req.
limit() ), mFeatureLimit ) );
1799 else if ( mFeatureLimit != -1 )
1802 if ( !mFilterExpression.isEmpty() )
1805 return mSource->getFeatures( req );
1814 return sourceAvailability;
1827 if ( mFeatureLimit != -1 && req.
limit() != -1 )
1828 req.
setLimit( std::min(
static_cast< long long >( req.
limit() ), mFeatureLimit ) );
1829 else if ( mFeatureLimit != -1 )
1832 if ( !mFilterExpression.isEmpty() )
1835 return mSource->getFeatures( req );
1845 return mSourceFields;
1850 return mSourceWkbType;
1855 if ( !mFilterExpression.isEmpty() )
1858 if ( mFeatureLimit == -1 )
1859 return mSource->featureCount();
1861 return std::min( mFeatureLimit, mSource->featureCount() );
1871 if ( mFilterExpression.isEmpty() )
1872 return mSource->uniqueValues( fieldIndex, limit );
1876 if ( fieldIndex < 0 || fieldIndex >=
fields().count() )
1877 return QSet<QVariant>();
1884 QSet<QVariant> values;
1889 values.insert( f.
attribute( fieldIndex ) );
1890 if ( limit > 0 && values.size() >= limit )
1898 if ( mFilterExpression.isEmpty() )
1899 return mSource->minimumValue( fieldIndex );
1903 if ( fieldIndex < 0 || fieldIndex >=
fields().count() )
1915 const QVariant v = f.
attribute( fieldIndex );
1926 if ( mFilterExpression.isEmpty() )
1927 return mSource->maximumValue( fieldIndex );
1931 if ( fieldIndex < 0 || fieldIndex >=
fields().count() )
1943 const QVariant v = f.
attribute( fieldIndex );
1954 return mSourceExtent;
1959 if ( mFilterExpression.isEmpty() )
1960 return mSource->allFeatureIds();
1965 .setFilterExpression( mFilterExpression ) );
1980 return mSourceSpatialIndexPresence;
1991 return expressionContextScope;
1996 mInvalidGeometryCheck = method;
1997 switch ( mInvalidGeometryCheck )
2000 mInvalidGeometryCallback =
nullptr;
2004 mInvalidGeometryCallback = mInvalidGeometryCallbackSkip;
2008 mInvalidGeometryCallback = mInvalidGeometryCallbackAbort;
2016 return mInvalidGeometryCheck;
2025 , mContext( context )
2026 , mSinkName( sinkName )
2027 , mOwnsSink( ownsOriginalSink )
2034 mContext.feedback()->reportError(
lastError() );
2055 if ( !result && mContext.feedback() )
2058 if ( !error.isEmpty() )
2059 mContext.feedback()->reportError( QObject::tr(
"Feature could not be written to %1: %2" ).arg( mSinkName, error ) );
2061 mContext.feedback()->reportError( QObject::tr(
"Feature could not be written to %1" ).arg( mSinkName ) );
2069 if ( !result && mContext.feedback() )
2072 if ( !error.isEmpty() )
2073 mContext.feedback()->reportError( QObject::tr(
"%n feature(s) could not be written to %1: %2",
nullptr, features.count() ).arg( mSinkName, error ) );
2075 mContext.feedback()->reportError( QObject::tr(
"%n feature(s) could not be written to %1",
nullptr, features.count() ).arg( mSinkName ) );
2083 if ( !result && mContext.feedback() )
2086 if ( !error.isEmpty() )
2087 mContext.feedback()->reportError( QObject::tr(
"Features could not be written to %1: %2" ).arg( mSinkName, error ) );
2089 mContext.feedback()->reportError( QObject::tr(
"Features could not be written to %1" ).arg( mSinkName ) );
Provides global constants and enumerations for use throughout the application.
@ Vector
Tables (i.e. vector layers with or without geometry). When used for a sink this indicates the sink ha...
@ VectorAnyGeometry
Any vector layer with geometry.
@ VectorPoint
Vector point layers.
@ VectorPolygon
Vector polygon layers.
@ VectorLine
Vector line layers.
@ FieldComments
Writer can support field comments.
@ FieldAliases
Writer can support field aliases.
SpatialIndexPresence
Enumeration of spatial index presence states.
@ Success
No errors were encountered.
@ NoGeometry
Geometry is not required. It may still be returned if e.g. required for a filter condition.
FeatureAvailability
Possible return value for QgsFeatureSource::hasFeatures() to determine if a source is empty.
@ FeaturesMaybeAvailable
There may be features available in this source.
@ NoFeaturesAvailable
There are certainly no features available in this source.
@ TiledScene
Tiled scene layer. Added in QGIS 3.34.
@ Annotation
Contains freeform, georeferenced annotations. Added in QGIS 3.16.
@ VectorTile
Vector tile layer. Added in QGIS 3.14.
@ Mesh
Mesh layer. Added in QGIS 3.2.
@ PointCloud
Point cloud layer. Added in QGIS 3.18.
@ EditAlias
Allows editing aliases.
@ EditComment
Allows editing comments.
QFlags< VectorDataProviderAttributeEditCapability > VectorDataProviderAttributeEditCapabilities
Attribute editing capabilities which may be supported by vector data providers.
InvalidGeometryCheck
Methods for handling of features with invalid geometries.
@ NoCheck
No invalid geometry checking.
@ AbortOnInvalid
Close iterator on encountering any features with invalid geometry. This requires a slow geometry vali...
@ SkipInvalid
Skip any features with invalid geometry. This requires a slow geometry validity check for every featu...
@ OverrideDefaultGeometryCheck
If set, the default geometry check method (as dictated by QgsProcessingContext) will be overridden fo...
@ SkipGeometryValidityChecks
Invalid geometry checks should always be skipped. This flag can be useful for algorithms which always...
WkbType
The WKB type describes the number of dimensions a geometry has.
@ Hidden
Parameter is hidden and should not be shown to users.
@ NoSymbology
Export only data.
QFlags< ProcessingFeatureSourceFlag > ProcessingFeatureSourceFlags
Flags which control how QgsProcessingFeatureSource fetches features.
Represents a map layer containing a set of georeferenced annotations, e.g.
Represents a coordinate reference system (CRS).
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
Contains information about the context in which a coordinate transform is executed.
Custom exception class for Coordinate Reference System related exceptions.
QByteArray encodedUri() const
Returns the complete encoded URI as a byte array.
QString table() const
Returns the table name stored in the URI.
void setParam(const QString &key, const QString &value)
Sets a generic parameter value on the URI.
QString database() const
Returns the database name stored in the URI.
Abstract interface for generating an expression context scope.
virtual QgsExpressionContextScope * createExpressionContextScope() const =0
This method needs to be reimplemented in all classes which implement this interface and return an exp...
Single scope for storing variables and functions for use within a QgsExpressionContext.
void setFields(const QgsFields &fields)
Convenience function for setting a fields for the context.
Wrapper for iterator of features from vector data provider or vector layer.
bool nextFeature(QgsFeature &f)
Fetch next feature and stores in f, returns true on success.
Wraps a request for features to a vector layer (or directly its vector data provider).
QgsFeatureRequest & setFlags(Qgis::FeatureRequestFlags flags)
Sets flags that affect how features will be fetched.
QgsFeatureRequest & setLimit(long long limit)
Set the maximum number of features to request.
long long limit() const
Returns the maximum number of features to request, or -1 if no limit set.
QgsFeatureRequest & combineFilterExpression(const QString &expression)
Modifies the existing filter expression to add an additional expression filter.
QgsFeatureRequest & setSubsetOfAttributes(const QgsAttributeList &attrs)
Set a subset of attributes that will be fetched.
QgsFeatureRequest & setInvalidGeometryCheck(Qgis::InvalidGeometryCheck check)
Sets invalid geometry checking behavior.
QgsFeatureRequest & setFilterExpression(const QString &expression)
Set the filter expression.
QgsFeatureRequest & setInvalidGeometryCallback(const std::function< void(const QgsFeature &)> &callback)
Sets a callback function to use when encountering an invalid geometry and invalidGeometryCheck() is s...
QgsFeatureRequest & setTransformErrorCallback(const std::function< void(const QgsFeature &)> &callback)
Sets a callback function to use when encountering a transform error when iterating features and a des...
An interface for objects which accept features via addFeature(s) methods.
QFlags< SinkFlag > SinkFlags
@ FastInsert
Use faster inserts, at the cost of updating the passed features to reflect changes made at the provid...
@ RegeneratePrimaryKey
This flag indicates, that a primary key field cannot be guaranteed to be unique and the sink should i...
An interface for objects which provide features via a getFeatures method.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Q_INVOKABLE QVariant attribute(const QString &name) const
Lookup attribute value by attribute name.
bool isCanceled() const
Tells whether the operation has been canceled already.
Encapsulate a field in an attribute table or data source.
void setName(const QString &name)
Set the field name.
Container of fields for a vector layer.
bool append(const QgsField &field, Qgis::FieldOrigin origin=Qgis::FieldOrigin::Provider, int originIndex=-1)
Appends a field.
Q_INVOKABLE int indexOf(const QString &fieldName) const
Gets the field index from the field name.
QgsField at(int i) const
Returns the field at particular index (must be in range 0..N-1).
Q_INVOKABLE int lookupField(const QString &fieldName) const
Looks up field's index from the field name.
bool rename(int fieldIdx, const QString &name)
Renames a name of field.
static QString stringToSafeFilename(const QString &string)
Converts a string to a safe filename, replacing characters which are not safe for filenames with an '...
A storage object for map layers, in which the layers are owned by the store and have their lifetime b...
QMap< QString, QgsMapLayer * > mapLayers() const
Returns a map of all layers by layer ID.
QgsMapLayer * addMapLayer(QgsMapLayer *layer, bool takeOwnership=true)
Add a layer to the store.
Base class for all map layer types.
QString source() const
Returns the source for the layer.
QString providerType() const
Returns the provider type (provider key) for this layer.
QgsCoordinateReferenceSystem crs
virtual void setTransformContext(const QgsCoordinateTransformContext &transformContext)=0
Sets the coordinate transform context to transformContext.
static QgsVectorLayer * createMemoryLayer(const QString &name, const QgsFields &fields, Qgis::WkbType geometryType=Qgis::WkbType::NoGeometry, const QgsCoordinateReferenceSystem &crs=QgsCoordinateReferenceSystem(), bool loadDefaultStyle=true) SIP_FACTORY
Creates a new memory layer using the specified parameters.
Represents a mesh layer supporting display of data on structured or unstructured meshes.
QgsMeshDataProvider * dataProvider() override
Returns the layer's data provider, it may be nullptr.
Base class for plugin layers.
Represents a map layer supporting display of point clouds.
Abstract base class for processing algorithms.
Contains information about the context in which a processing algorithm is executed.
QString defaultEncoding() const
Returns the default encoding to use for newly created files.
QgsProcessingFeedback * feedback()
Returns the associated feedback object.
QgsExpressionContext & expressionContext()
Returns the expression context.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context.
QgsProject * project() const
Returns the project in which the algorithm is being executed.
QgsMapLayerStore * temporaryLayerStore()
Returns a reference to the layer store used for storing temporary layers during algorithm execution.
QString temporaryFolder() const
Returns the (optional) temporary folder to use when running algorithms.
Custom exception class for processing related exceptions.
QgsProxyFeatureSink subclass which reports feature addition errors to a QgsProcessingContext.
void finalize() override
Finalizes the sink, flushing any buffered features to the destination.
~QgsProcessingFeatureSink() override
QgsProcessingFeatureSink(QgsFeatureSink *originalSink, const QString &sinkName, QgsProcessingContext &context, bool ownsOriginalSink=false)
Constructor for QgsProcessingFeatureSink, accepting an original feature sink originalSink and process...
bool addFeatures(QgsFeatureList &features, QgsFeatureSink::Flags flags=QgsFeatureSink::Flags()) override
Adds a list of features to the sink.
bool addFeature(QgsFeature &feature, QgsFeatureSink::Flags flags=QgsFeatureSink::Flags()) override
Adds a single feature to the sink.
Encapsulates settings relating to a feature source input to a processing algorithm.
bool selectedFeaturesOnly
true if only selected features in the source should be used by algorithms.
QgsProperty source
Source definition.
Qgis::InvalidGeometryCheck geometryCheck
Geometry check method to apply to this source.
Qgis::ProcessingFeatureSourceDefinitionFlags flags
Flags which dictate source behavior.
long long featureLimit
If set to a value > 0, places a limit on the maximum number of features which will be read from the s...
QString filterExpression
Optional expression filter to use for filtering features which will be read from the source.
QgsFeatureSource subclass which proxies methods to an underlying QgsFeatureSource,...
QgsRectangle sourceExtent() const override
Returns the extent of all geometries from the source.
QSet< QVariant > uniqueValues(int fieldIndex, int limit=-1) const override
Returns the set of unique values contained within the specified fieldIndex from this source.
QgsExpressionContextScope * createExpressionContextScope() const
Returns an expression context scope suitable for this source.
QgsProcessingFeatureSource(QgsFeatureSource *originalSource, const QgsProcessingContext &context, bool ownsOriginalSource=false, long long featureLimit=-1, const QString &filterExpression=QString())
Constructor for QgsProcessingFeatureSource, accepting an original feature source originalSource and p...
void setInvalidGeometryCheck(Qgis::InvalidGeometryCheck method)
Overrides the default geometry check method for the source.
Qgis::InvalidGeometryCheck invalidGeometryCheck() const
Returns the geometry check method for the source.
QVariant maximumValue(int fieldIndex) const override
Returns the maximum value for an attribute column or an invalid variant in case of error.
~QgsProcessingFeatureSource() override
QgsCoordinateReferenceSystem sourceCrs() const override
Returns the coordinate reference system for features in the source.
Qgis::WkbType wkbType() const override
Returns the geometry type for features returned by this source.
QVariant minimumValue(int fieldIndex) const override
Returns the minimum value for an attribute column or an invalid variant in case of error.
long long featureCount() const override
Returns the number of features contained in the source, or -1 if the feature count is unknown.
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request, Qgis::ProcessingFeatureSourceFlags flags) const
Returns an iterator for the features in the source, respecting the supplied feature flags.
Qgis::FeatureAvailability hasFeatures() const override
Determines if there are any features available in the source.
QString sourceName() const override
Returns a friendly display name for the source.
QgsFeatureIds allFeatureIds() const override
Returns a list of all feature IDs for features present in the source.
Qgis::SpatialIndexPresence hasSpatialIndex() const override
Returns an enum value representing the presence of a valid spatial index on the source,...
QgsFields fields() const override
Returns the fields associated with features in the source.
Base class for providing feedback from a processing algorithm.
virtual void reportError(const QString &error, bool fatalError=false)
Reports that the algorithm encountered an error while executing.
Base class for the definition of processing outputs.
Encapsulates settings relating to a feature sink or output raster layer for a processing algorithm.
QgsProperty sink
Sink/layer definition.
Base class for the definition of processing parameters.
static QList< QgsTiledSceneLayer * > compatibleTiledSceneLayers(QgsProject *project, bool sort=true)
Returns a list of tiled scene layers from a project which are compatible with the processing framewor...
static QString stringToPythonLiteral(const QString &string)
Converts a string to a Python string literal.
static QString defaultVectorExtension()
Returns the default vector extension to use, in the absence of all other constraints (e....
static QVariant generateIteratingDestination(const QVariant &input, const QVariant &id, QgsProcessingContext &context)
Converts an input parameter value for use in source iterating mode, where one individual sink is crea...
static QgsFields indicesToFields(const QList< int > &indices, const QgsFields &fields)
Returns a subset of fields based on the indices of desired fields.
static QList< int > fieldNamesToIndices(const QStringList &fieldNames, const QgsFields &fields)
Returns a list of field indices parsed from the given list of field names.
static QString layerToStringIdentifier(const QgsMapLayer *layer, const QString &layerName=QString())
Returns a string representation of the source for a layer.
static QVariantMap preprocessQgisProcessParameters(const QVariantMap ¶meters, bool &ok, QString &error)
Pre-processes a set of parameter values for the qgis_process command.
static QList< QgsAnnotationLayer * > compatibleAnnotationLayers(QgsProject *project, bool sort=true)
Returns a list of annotation layers from a project which are compatible with the processing framework...
static QString generateTempFilename(const QString &basename, const QgsProcessingContext *context=nullptr)
Returns a temporary filename for a given file, putting it into a temporary folder (creating that fold...
static QString normalizeLayerSource(const QString &source)
Normalizes a layer source string for safe comparison across different operating system environments.
static QString formatHelpMapAsHtml(const QVariantMap &map, const QgsProcessingAlgorithm *algorithm)
Returns a HTML formatted version of the help text encoded in a variant map for a specified algorithm.
static QgsFields combineFields(const QgsFields &fieldsA, const QgsFields &fieldsB, const QString &fieldsBPrefix=QString())
Combines two field lists, avoiding duplicate field names (in a case-insensitive manner).
static QString encodeProviderKeyAndUri(const QString &providerKey, const QString &uri)
Encodes a provider key and layer uri to a single string, for use with decodeProviderKeyAndUri().
LayerHint
Layer type hints.
@ TiledScene
Tiled scene layer type, since QGIS 3.34.
@ Annotation
Annotation layer type, since QGIS 3.22.
@ Vector
Vector layer type.
@ VectorTile
Vector tile layer type, since QGIS 3.32.
@ Mesh
Mesh layer type, since QGIS 3.6.
@ Raster
Raster layer type.
@ UnknownType
Unknown layer type.
@ PointCloud
Point cloud layer type, since QGIS 3.22.
static QgsProcessingFeatureSource * variantToSource(const QVariant &value, QgsProcessingContext &context, const QVariant &fallbackValue=QVariant())
Converts a variant value to a new feature source.
static QList< QgsRasterLayer * > compatibleRasterLayers(QgsProject *project, bool sort=true)
Returns a list of raster layers from a project which are compatible with the processing framework.
static int outputDefinitionIndex(const QgsProcessingAlgorithm *algorithm, const QString &name)
Returns the index of the output matching name for a specified algorithm.
static QgsRectangle combineLayerExtents(const QList< QgsMapLayer * > &layers, const QgsCoordinateReferenceSystem &crs, QgsProcessingContext &context)
Combines the extent of several map layers.
static QString resolveDefaultEncoding(const QString &defaultEncoding="System")
Returns the default encoding.
static QList< QgsPluginLayer * > compatiblePluginLayers(QgsProject *project, bool sort=true)
Returns a list of plugin layers from a project which are compatible with the processing framework.
static QString variantToPythonLiteral(const QVariant &value)
Converts a variant to a Python literal.
static QgsCoordinateReferenceSystem variantToCrs(const QVariant &value, QgsProcessingContext &context, const QVariant &fallbackValue=QVariant())
Converts a variant value to a coordinate reference system.
static QList< QgsVectorLayer * > compatibleVectorLayers(QgsProject *project, const QList< int > &sourceTypes=QList< int >(), bool sort=true)
Returns a list of vector layers from a project which are compatible with the processing framework.
static QVariantMap removePointerValuesFromMap(const QVariantMap &map)
Removes any raw pointer values from an input map, replacing them with appropriate string values where...
static bool decodeProviderKeyAndUri(const QString &string, QString &providerKey, QString &uri)
Decodes a provider key and layer uri from an encoded string, for use with encodeProviderKeyAndUri().
static void createFeatureSinkPython(QgsFeatureSink **sink, QString &destination, QgsProcessingContext &context, const QgsFields &fields, Qgis::WkbType geometryType, const QgsCoordinateReferenceSystem &crs, const QVariantMap &createOptions=QVariantMap())
Creates a feature sink ready for adding features.
static QList< QgsVectorTileLayer * > compatibleVectorTileLayers(QgsProject *project, bool sort=true)
Returns a list of vector tile layers from a project which are compatible with the processing framewor...
static QString convertToCompatibleFormatAndLayerName(const QgsVectorLayer *layer, bool selectedFeaturesOnly, const QString &baseName, const QStringList &compatibleFormats, const QString &preferredFormat, QgsProcessingContext &context, QgsProcessingFeedback *feedback, QString &layerName, long long featureLimit=-1, const QString &filterExpression=QString())
Converts a source vector layer to a file path and layer name of a vector layer of compatible format.
static QList< QgsMapLayer * > compatibleLayers(QgsProject *project, bool sort=true)
Returns a list of map layers from a project which are compatible with the processing framework.
static QString convertToCompatibleFormat(const QgsVectorLayer *layer, bool selectedFeaturesOnly, const QString &baseName, const QStringList &compatibleFormats, const QString &preferredFormat, QgsProcessingContext &context, QgsProcessingFeedback *feedback, long long featureLimit=-1, const QString &filterExpression=QString())
Converts a source vector layer to a file path of a vector layer of compatible format.
static QgsFeatureSink * createFeatureSink(QString &destination, QgsProcessingContext &context, const QgsFields &fields, Qgis::WkbType geometryType, const QgsCoordinateReferenceSystem &crs, const QVariantMap &createOptions=QVariantMap(), const QStringList &datasourceOptions=QStringList(), const QStringList &layerOptions=QStringList(), QgsFeatureSink::SinkFlags sinkFlags=QgsFeatureSink::SinkFlags(), QgsRemappingSinkDefinition *remappingDefinition=nullptr)
Creates a feature sink ready for adding features.
static QString defaultRasterExtension()
Returns the default raster extension to use, in the absence of all other constraints (e....
static QString defaultVectorTileExtension()
Returns the default vector tile extension to use, in the absence of all other constraints (e....
static QgsMapLayer * mapLayerFromString(const QString &string, QgsProcessingContext &context, bool allowLoadingNewLayers=true, QgsProcessingUtils::LayerHint typeHint=QgsProcessingUtils::LayerHint::UnknownType, QgsProcessing::LayerOptionsFlags flags=QgsProcessing::LayerOptionsFlags())
Interprets a string as a map layer within the supplied context.
static QString defaultPointCloudExtension()
Returns the default point cloud extension to use, in the absence of all other constraints (e....
static QList< QgsPointCloudLayer * > compatiblePointCloudLayers(QgsProject *project, bool sort=true)
Returns a list of point cloud layers from a project which are compatible with the processing framewor...
static QList< QgsMeshLayer * > compatibleMeshLayers(QgsProject *project, bool sort=true)
Returns a list of mesh layers from a project which are compatible with the processing framework.
static QString tempFolder(const QgsProcessingContext *context=nullptr)
Returns a session specific processing temporary folder for use in processing algorithms.
QFlags< LayerOptionsFlag > LayerOptionsFlags
static const QgsSettingsEntryString * settingsTempPath
Settings entry temp path.
static const QString TEMPORARY_OUTPUT
Constant used to indicate that a Processing algorithm output should be a temporary layer/file.
static const QgsSettingsEntryString * settingsDefaultOutputRasterLayerExt
Settings entry default output raster layer ext.
static const QgsSettingsEntryString * settingsDefaultOutputVectorLayerExt
Settings entry default output vector layer ext.
@ SkipIndexGeneration
Do not generate index when creating a layer. Makes sense only for point cloud layers.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
QgsAnnotationLayer * mainAnnotationLayer()
Returns the main annotation layer associated with the project.
QVector< T > layers() const
Returns a list of registered map layers with a specified layer type.
QgsCoordinateReferenceSystem crs
A store for object properties.
QString asExpression() const
Returns an expression string representing the state of the property, or an empty string if the proper...
Qgis::PropertyType propertyType() const
Returns the property type.
static QgsProperty fromExpression(const QString &expression, bool isActive=true)
Returns a new ExpressionBasedProperty created from the specified expression.
static QgsProperty fromField(const QString &fieldName, bool isActive=true)
Returns a new FieldBasedProperty created from the specified field name.
static QgsProperty fromValue(const QVariant &value, bool isActive=true)
Returns a new StaticProperty created from the specified value.
QVariantMap decodeUri(const QString &providerKey, const QString &uri)
Breaks a provider data source URI into its component paths (e.g.
static QgsProviderRegistry * instance(const QString &pluginPath=QString())
Means of accessing canonical single instance.
QList< QgsProviderRegistry::ProviderCandidateDetails > preferredProvidersForUri(const QString &uri) const
Returns the details for the preferred provider(s) for opening the specified uri.
QString encodeUri(const QString &providerKey, const QVariantMap &parts)
Reassembles a provider data source URI from its component paths (e.g.
QgsProviderMetadata * providerMetadata(const QString &providerKey) const
Returns metadata of the provider or nullptr if not found.
bool addFeature(QgsFeature &feature, QgsFeatureSink::Flags flags=QgsFeatureSink::Flags()) override
Adds a single feature to the sink.
bool flushBuffer() override
Flushes any internal buffer which may exist in the sink, causing any buffered features to be added to...
QgsFeatureSink * mSink
Underlying destination sink.
QString lastError() const override
Returns the most recent error encountered by the sink, e.g.
bool addFeatures(QgsFeatureList &features, QgsFeatureSink::Flags flags=QgsFeatureSink::Flags()) override
Adds a list of features to the sink.
QgsProxyFeatureSink(QgsFeatureSink *sink)
Constructs a new QgsProxyFeatureSink which forwards features onto a destination sink.
static QStringList supportedFormatExtensions(RasterFormatOptions options=SortRecommended)
Returns a list of file extensions for supported formats.
Represents a raster layer.
A rectangle specified with double values.
void combineExtentWith(const QgsRectangle &rect)
Expands the rectangle so that it covers both the original rectangle and the given rectangle.
QgsCoordinateReferenceSystem crs() const
Returns the associated coordinate reference system, or an invalid CRS if no reference system is set.
A QgsPointXY with associated coordinate reference system.
A QgsRectangle with associated coordinate reference system.
Defines the parameters used to remap features when creating a QgsRemappingProxyFeatureSink.
void setDestinationCrs(const QgsCoordinateReferenceSystem &destination)
Sets the destination crs used for reprojecting incoming features to the sink's destination CRS.
void setDestinationWkbType(Qgis::WkbType type)
Sets the WKB geometry type for the destination.
void setDestinationFields(const QgsFields &fields)
Sets the fields for the destination sink.
Represents a map layer supporting display of tiled scene objects.
static bool isNull(const QVariant &variant, bool silenceNullWarnings=false)
Returns true if the specified variant should be considered a NULL value.
virtual Qgis::VectorDataProviderAttributeEditCapabilities attributeEditCapabilities() const
Returns the provider's supported attribute editing capabilities.
Options to pass to QgsVectorFileWriter::writeAsVectorFormat().
QString fileEncoding
Encoding to use.
QString driverName
OGR driver to use.
QString layerName
Layer name. If let empty, it will be derived from the filename.
QStringList layerOptions
List of OGR layer creation options.
Qgis::FeatureSymbologyExport symbologyExport
Symbology to export.
QgsVectorFileWriter::ActionOnExistingFile actionOnExistingFile
Action on existing file.
QStringList datasourceOptions
List of OGR data source creation options.
static QStringList defaultLayerOptions(const QString &driverName)
Returns a list of the default layer options for a specified driver.
static QString driverForExtension(const QString &extension)
Returns the OGR driver name for a specified file extension.
static QgsVectorFileWriter * create(const QString &fileName, const QgsFields &fields, Qgis::WkbType geometryType, const QgsCoordinateReferenceSystem &srs, const QgsCoordinateTransformContext &transformContext, const QgsVectorFileWriter::SaveVectorOptions &options, QgsFeatureSink::SinkFlags sinkFlags=QgsFeatureSink::SinkFlags(), QString *newFilename=nullptr, QString *newLayer=nullptr)
Create a new vector file writer.
static QStringList defaultDatasetOptions(const QString &driverName)
Returns a list of the default dataset options for a specified driver.
static QStringList supportedFormatExtensions(VectorFormatOptions options=SortRecommended)
Returns a list of file extensions for supported formats, e.g "shp", "gpkg".
@ CreateOrOverwriteFile
Create or overwrite file.
@ AppendToLayerNoNewFields
Append features to existing layer, but do not create new fields.
QgsFeatureSource subclass for the selected features from a QgsVectorLayer.
Represents a vector layer which manages a vector based dataset.
bool isSpatial() const final
Returns true if this is a geometry layer and false in case of NoGeometry (table only) or UnknownGeome...
QgsRectangle extent() const final
Returns the extent of the layer.
Q_INVOKABLE Qgis::WkbType wkbType() const final
Returns the WKBType or WKBUnknown in case of error.
QgsFeatureIterator getSelectedFeatures(QgsFeatureRequest request=QgsFeatureRequest()) const
Returns an iterator of the selected features.
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const final
Queries the layer for features specified in request.
Q_INVOKABLE Qgis::GeometryType geometryType() const
Returns point, line or polygon.
QgsVectorDataProvider * dataProvider() final
Returns the layer's data provider, it may be nullptr.
Implements a map layer that is dedicated to rendering of vector tiles.
Handles storage of information regarding WKB types and their properties.
@ UnknownCount
Provider returned an unknown feature count.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into allowing algorithms to be written in pure substantial changes are required in order to port existing x Processing algorithms for QGIS x The most significant changes are outlined not GeoAlgorithm For algorithms which operate on features one by consider subclassing the QgsProcessingFeatureBasedAlgorithm class This class allows much of the boilerplate code for looping over features from a vector layer to be bypassed and instead requires implementation of a processFeature method Ensure that your algorithm(or algorithm 's parent class) implements the new pure virtual createInstance(self) call
bool qgsVariantLessThan(const QVariant &lhs, const QVariant &rhs)
Compares two QVariant values and returns whether the first is less than the second.
bool qgsVariantGreaterThan(const QVariant &lhs, const QVariant &rhs)
Compares two QVariant values and returns whether the first is greater than the second.
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
QList< QgsFeature > QgsFeatureList
QSet< QgsFeatureId > QgsFeatureIds
QList< int > QgsAttributeList
QString convertToCompatibleFormatInternal(const QgsVectorLayer *vl, bool selectedFeaturesOnly, const QString &baseName, const QStringList &compatibleFormats, const QString &preferredFormat, QgsProcessingContext &context, QgsProcessingFeedback *feedback, QString *layerName, long long featureLimit, const QString &filterExpression, bool renameFid)
bool skipCrsValidation
Controls whether the layer is allowed to have an invalid/unknown CRS.
bool skipCrsValidation
Controls whether the layer is allowed to have an invalid/unknown CRS.
bool skipIndexGeneration
Set to true if point cloud index generation should be skipped.
bool skipCrsValidation
Controls whether the layer is allowed to have an invalid/unknown CRS.
bool loadDefaultStyle
Sets to true if the default layer style should be loaded.
bool skipCrsValidation
Controls whether the layer is allowed to have an invalid/unknown CRS.
Setting options for loading vector layers.
bool skipCrsValidation
Controls whether the layer is allowed to have an invalid/unknown CRS.
bool loadDefaultStyle
Set to true if the default layer style should be loaded.