43#include <QImageWriter>
44#include <QRegularExpression>
49#include "moc_qgsprocessingutils.cpp"
51using namespace Qt::StringLiterals;
55 return compatibleMapLayers< QgsRasterLayer >( project, sort );
61 return QList<QgsVectorLayer *>();
63 QList<QgsVectorLayer *> layers;
67 if ( canUseLayer( l, geometryTypes ) )
73 std::sort( layers.begin(), layers.end(), [](
const QgsVectorLayer *a,
const QgsVectorLayer *b ) ->
bool { return QString::localeAwareCompare( a->name(), b->name() ) < 0; } );
80 return compatibleMapLayers< QgsMeshLayer >( project, sort );
85 return compatibleMapLayers< QgsPluginLayer >( project, sort );
90 return compatibleMapLayers< QgsPointCloudLayer >( project, sort );
96 QList<QgsAnnotationLayer *> res = compatibleMapLayers< QgsAnnotationLayer >( project,
false );
102 std::sort( res.begin(), res.end(), [](
const QgsAnnotationLayer *a,
const QgsAnnotationLayer *b ) ->
bool { return QString::localeAwareCompare( a->name(), b->name() ) < 0; } );
110 return compatibleMapLayers< QgsVectorTileLayer >( project, sort );
115 return compatibleMapLayers< QgsTiledSceneLayer >( project, sort );
118template<
typename T> QList<T *> QgsProcessingUtils::compatibleMapLayers(
QgsProject *project,
bool sort )
124 const auto projectLayers = project->
layers<T *>();
125 for ( T *l : projectLayers )
127 if ( canUseLayer( l ) )
133 std::sort( layers.begin(), layers.end(), [](
const T *a,
const T *b ) ->
bool { return QString::localeAwareCompare( a->name(), b->name() ) < 0; } );
141 return QList<QgsMapLayer *>();
143 QList<QgsMapLayer *> layers;
145 const auto rasterLayers = compatibleMapLayers< QgsRasterLayer >( project,
false );
153 const auto meshLayers = compatibleMapLayers< QgsMeshLayer >( project,
false );
157 const auto pointCloudLayers = compatibleMapLayers< QgsPointCloudLayer >( project,
false );
161 const auto annotationLayers = compatibleMapLayers< QgsAnnotationLayer >( project,
false );
166 const auto vectorTileLayers = compatibleMapLayers< QgsVectorTileLayer >( project,
false );
170 const auto tiledSceneLayers = compatibleMapLayers< QgsTiledSceneLayer >( project,
false );
174 const auto pluginLayers = compatibleMapLayers< QgsPluginLayer >( project,
false );
180 std::sort( layers.begin(), layers.end(), [](
const QgsMapLayer *a,
const QgsMapLayer *b ) ->
bool { return QString::localeAwareCompare( a->name(), b->name() ) < 0; } );
187 return u
"%1://%2"_s.arg( providerKey, uri );
192 const thread_local QRegularExpression re( u
"^(\\w+?):\\/\\/(.+)$"_s );
193 const QRegularExpressionMatch match = re.match(
string );
194 if ( !match.hasMatch() )
197 providerKey = match.captured( 1 );
198 uri = match.captured( 2 );
206 if ( !store ||
string.isEmpty() )
209 QList< QgsMapLayer * > layers = store->
mapLayers().values();
216 switch ( layer->type() )
218 case Qgis::LayerType::Vector:
219 return !canUseLayer( qobject_cast< QgsVectorLayer * >( layer ) );
220 case Qgis::LayerType::Raster:
221 return !canUseLayer( qobject_cast< QgsRasterLayer * >( layer ) );
222 case Qgis::LayerType::Plugin:
223 case Qgis::LayerType::Group:
225 case Qgis::LayerType::Mesh:
226 return !canUseLayer( qobject_cast< QgsMeshLayer * >( layer ) );
227 case Qgis::LayerType::VectorTile:
228 return !canUseLayer( qobject_cast< QgsVectorTileLayer * >( layer ) );
229 case Qgis::LayerType::TiledScene:
230 return !canUseLayer( qobject_cast< QgsTiledSceneLayer * >( layer ) );
231 case Qgis::LayerType::PointCloud:
232 return !canUseLayer( qobject_cast< QgsPointCloudLayer * >( layer ) );
233 case Qgis::LayerType::Annotation:
234 return !canUseLayer( qobject_cast< QgsAnnotationLayer * >( layer ) );
242 auto isCompatibleType = [typeHint](
QgsMapLayer *l ) ->
bool {
245 case LayerHint::UnknownType:
248 case LayerHint::Vector:
251 case LayerHint::Raster:
254 case LayerHint::Mesh:
257 case LayerHint::PointCloud:
260 case LayerHint::Annotation:
263 case LayerHint::VectorTile:
266 case LayerHint::TiledScene:
274 if ( isCompatibleType( l ) && l->id() ==
string )
279 if ( isCompatibleType( l ) && l->name() ==
string )
284 if ( isCompatibleType( l ) && normalizeLayerSource( l->source() ) == normalizeLayerSource(
string ) )
301 if ( providerMetadata )
304 const QVariantMap parts = providerMetadata->
decodeUri( uri );
305 const QString layerName = parts.value( u
"layerName"_s ).toString();
307 if ( !layerName.isEmpty() )
311 else if (
const QString path = parts.value( u
"path"_s ).toString(); !path.isEmpty() )
313 name = QFileInfo( path ).baseName();
318 const QStringList components = uri.split(
'|' );
319 if ( components.isEmpty() )
322 if ( QFileInfo fi( components.at( 0 ) ); fi.isFile() )
323 name = fi.baseName();
325 name = QFileInfo( uri ).baseName();
328 if ( name.isEmpty() )
330 name = QgsDataSourceUri( uri ).table();
332 if ( name.isEmpty() )
337 QList< Qgis::LayerType > candidateTypes;
342 if ( providerMetadata )
375 QgsVectorLayer::LayerOptions options { transformContext };
379 std::unique_ptr< QgsVectorLayer > layer;
380 if ( providerMetadata )
382 layer = std::make_unique<QgsVectorLayer>( uri, name, providerMetadata->
key(), options );
387 layer = std::make_unique<QgsVectorLayer>( uri, name, u
"ogr"_s, options );
389 if ( layer->isValid() )
391 return layer.release();
396 QgsRasterLayer::LayerOptions rasterOptions;
400 std::unique_ptr< QgsRasterLayer > rasterLayer;
401 if ( providerMetadata )
403 rasterLayer = std::make_unique< QgsRasterLayer >( uri, name, providerMetadata->
key(), rasterOptions );
408 rasterLayer = std::make_unique< QgsRasterLayer >( uri, name, u
"gdal"_s, rasterOptions );
411 if ( rasterLayer->isValid() )
413 return rasterLayer.release();
418 QgsMeshLayer::LayerOptions meshOptions;
421 std::unique_ptr< QgsMeshLayer > meshLayer;
422 if ( providerMetadata )
424 meshLayer = std::make_unique< QgsMeshLayer >( uri, name, providerMetadata->
key(), meshOptions );
428 meshLayer = std::make_unique< QgsMeshLayer >( uri, name, u
"mdal"_s, meshOptions );
430 if ( meshLayer->isValid() )
432 return meshLayer.release();
437 QgsPointCloudLayer::LayerOptions pointCloudOptions;
445 std::unique_ptr< QgsPointCloudLayer > pointCloudLayer;
446 if ( providerMetadata )
448 pointCloudLayer = std::make_unique< QgsPointCloudLayer >( uri, name, providerMetadata->
key(), pointCloudOptions );
453 if ( !preferredProviders.empty() )
455 pointCloudLayer = std::make_unique< QgsPointCloudLayer >( uri, name, preferredProviders.at( 0 ).metadata()->key(), pointCloudOptions );
465 pointCloudLayer = std::make_unique< QgsPointCloudLayer >( uri, name, u
"pdal"_s, pointCloudOptions );
469 if ( pointCloudLayer && pointCloudLayer->isValid() )
471 return pointCloudLayer.release();
476 QgsDataSourceUri dsUri;
477 dsUri.
setParam(
"type",
"mbtiles" );
480 std::unique_ptr< QgsVectorTileLayer > tileLayer;
481 tileLayer = std::make_unique< QgsVectorTileLayer >( dsUri.
encodedUri(), name );
483 if ( tileLayer->isValid() )
485 return tileLayer.release();
490 QgsTiledSceneLayer::LayerOptions tiledSceneOptions;
493 std::unique_ptr< QgsTiledSceneLayer > tiledSceneLayer;
494 if ( providerMetadata )
496 tiledSceneLayer = std::make_unique< QgsTiledSceneLayer >( uri, name, providerMetadata->
key(), tiledSceneOptions );
501 if ( !preferredProviders.empty() )
503 tiledSceneLayer = std::make_unique< QgsTiledSceneLayer >( uri, name, preferredProviders.at( 0 ).metadata()->key(), tiledSceneOptions );
506 if ( tiledSceneLayer && tiledSceneLayer->isValid() )
508 return tiledSceneLayer.release();
516 if (
string.isEmpty() )
524 if (
auto *lProject = context.
project() )
526 QgsMapLayer *layer = mapLayerFromStore(
string, lProject->layerStore(), typeHint );
540 if ( !allowLoadingNewLayers )
543 layer = loadMapLayerFromString(
string, context.
transformContext(), typeHint, flags );
557 QVariant val = value;
558 bool selectedFeaturesOnly =
false;
559 long long featureLimit = -1;
560 QString filterExpression;
561 bool overrideGeometryCheck =
false;
563 if ( val.userType() == qMetaTypeId<QgsProcessingFeatureSourceDefinition>() )
574 else if ( val.userType() == qMetaTypeId<QgsProcessingOutputLayerDefinition>() )
581 if (
QgsVectorLayer *layer = qobject_cast< QgsVectorLayer * >( qvariant_cast<QObject *>( val ) ) )
583 auto source = std::make_unique< QgsProcessingFeatureSource >( layer, context,
false, featureLimit, filterExpression );
584 if ( overrideGeometryCheck )
585 source->setInvalidGeometryCheck( geometryCheck );
586 return source.release();
590 if ( val.userType() == qMetaTypeId<QgsProperty>() )
594 else if ( !val.isValid() || val.toString().isEmpty() )
597 if (
QgsVectorLayer *layer = qobject_cast< QgsVectorLayer * >( qvariant_cast<QObject *>( fallbackValue ) ) )
599 auto source = std::make_unique< QgsProcessingFeatureSource >( layer, context,
false, featureLimit, filterExpression );
600 if ( overrideGeometryCheck )
601 source->setInvalidGeometryCheck( geometryCheck );
602 return source.release();
605 layerRef = fallbackValue.toString();
609 layerRef = val.toString();
612 if ( layerRef.isEmpty() )
619 std::unique_ptr< QgsProcessingFeatureSource> source;
620 if ( selectedFeaturesOnly )
626 source = std::make_unique< QgsProcessingFeatureSource >( vl, context,
false, featureLimit, filterExpression );
629 if ( overrideGeometryCheck )
630 source->setInvalidGeometryCheck( geometryCheck );
631 return source.release();
636 QVariant val = value;
638 if ( val.userType() == qMetaTypeId<QgsCoordinateReferenceSystem>() )
643 else if ( val.userType() == qMetaTypeId<QgsProcessingFeatureSourceDefinition>() )
649 else if ( val.userType() == qMetaTypeId<QgsProcessingOutputLayerDefinition>() )
662 if (
QgsMapLayer *layer = qobject_cast< QgsMapLayer * >( qvariant_cast<QObject *>( val ) ) )
665 if ( val.userType() == qMetaTypeId<QgsProperty>() )
668 if ( !val.isValid() )
674 QString crsText = val.toString();
675 if ( crsText.isEmpty() )
676 crsText = fallbackValue.toString();
678 if ( crsText.isEmpty() )
682 if ( context.
project() && crsText.compare(
"ProjectCrs"_L1, Qt::CaseInsensitive ) == 0 )
698bool QgsProcessingUtils::canUseLayer(
const QgsMeshLayer *layer )
703bool QgsProcessingUtils::canUseLayer(
const QgsPluginLayer *layer )
705 return layer && layer->
isValid();
710 return layer && layer->
isValid();
713bool QgsProcessingUtils::canUseLayer(
const QgsRasterLayer *layer )
715 return layer && layer->
isValid();
720 return layer && layer->
isValid();
725 return layer && layer->
isValid();
730 return layer && layer->
isValid();
733bool QgsProcessingUtils::canUseLayer(
const QgsVectorLayer *layer,
const QList<int> &sourceTypes )
735 return layer && layer->
isValid() &&
736 ( sourceTypes.isEmpty()
747 QString normalized = source;
748 normalized.replace(
'\\',
'/' );
749 return normalized.trimmed();
758 if ( !source.isEmpty() )
763 if ( provider.compare(
"gdal"_L1, Qt::CaseInsensitive ) == 0 || provider.compare(
"ogr"_L1, Qt::CaseInsensitive ) == 0 || provider.compare(
"mdal"_L1, Qt::CaseInsensitive ) == 0 )
766 return u
"%1://%2"_s.arg( provider, source );
779 if ( !value.isValid() )
782 if ( value.userType() == qMetaTypeId<QgsProperty>() )
784 else if ( value.userType() == qMetaTypeId<QgsCoordinateReferenceSystem>() )
787 return u
"QgsCoordinateReferenceSystem()"_s;
791 else if ( value.userType() == qMetaTypeId<QgsRectangle>() )
796 else if ( value.userType() == qMetaTypeId<QgsReferencedRectangle>() )
801 else if ( value.userType() == qMetaTypeId<QgsPointXY>() )
806 else if ( value.userType() == qMetaTypeId<QgsReferencedPointXY>() )
812 switch ( value.userType() )
814 case QMetaType::Type::Bool:
815 return value.toBool() ? u
"True"_s : u
"False"_s;
817 case QMetaType::Type::Double:
818 return QString::number( value.toDouble() );
820 case QMetaType::Type::Int:
821 case QMetaType::Type::UInt:
822 return QString::number( value.toInt() );
824 case QMetaType::Type::LongLong:
825 case QMetaType::Type::ULongLong:
826 return QString::number( value.toLongLong() );
828 case QMetaType::Type::QVariantList:
831 const QVariantList vl = value.toList();
832 for (
const QVariant &v : vl )
836 return parts.join(
',' ).prepend(
'[' ).append(
']' );
839 case QMetaType::Type::QVariantMap:
841 const QVariantMap map = value.toMap();
843 parts.reserve( map.size() );
844 for (
auto it = map.constBegin(); it != map.constEnd(); ++it )
848 return parts.join(
',' ).prepend(
'{' ).append(
'}' );
851 case QMetaType::Type::QDateTime:
853 const QDateTime dateTime = value.toDateTime();
854 return u
"QDateTime(QDate(%1, %2, %3), QTime(%4, %5, %6))"_s.arg( dateTime.date().year() )
855 .arg( dateTime.date().month() )
856 .arg( dateTime.date().day() )
857 .arg( dateTime.time().hour() )
858 .arg( dateTime.time().minute() )
859 .arg( dateTime.time().second() );
872 s.replace(
'\\',
"\\\\"_L1 );
873 s.replace(
'\n',
"\\n"_L1 );
874 s.replace(
'\r',
"\\r"_L1 );
875 s.replace(
'\t',
"\\t"_L1 );
877 if ( s.contains(
'\'' ) && !s.contains(
'\"' ) )
879 s = s.prepend(
'"' ).append(
'"' );
883 s.replace(
'\'',
"\\\'"_L1 );
884 s = s.prepend(
'\'' ).append(
'\'' );
889void QgsProcessingUtils::parseDestinationString(
890 QString &destination, QString &providerKey, QString &uri, QString &layerName, QString &format, QMap<QString, QVariant> &options,
bool &useWriter, QString &extension
898 const thread_local QRegularExpression splitRx( u
"^(.{3,}?):(.*)$"_s );
899 QRegularExpressionMatch match = splitRx.match( destination );
900 if ( match.hasMatch() )
902 providerKey = match.captured( 1 );
903 uri = match.captured( 2 );
910 if ( providerKey ==
"postgis"_L1 )
912 providerKey = u
"postgres"_s;
914 if ( providerKey ==
"ogr"_L1 )
916 QgsDataSourceUri dsUri( uri );
919 if ( !dsUri.
table().isEmpty() )
921 layerName = dsUri.
table();
922 options.insert( u
"layerName"_s, layerName );
925 extension = QFileInfo( uri ).completeSuffix();
927 options.insert( u
"driverName"_s, format );
931 extension = QFileInfo( uri ).completeSuffix();
934 options.insert( u
"update"_s,
true );
941 providerKey = u
"ogr"_s;
943 const thread_local QRegularExpression splitRx( u
"^(.*)\\.(.*?)$"_s );
944 QRegularExpressionMatch match = splitRx.match( destination );
945 if ( match.hasMatch() )
947 extension = match.captured( 2 );
951 if ( format.isEmpty() )
954 destination = destination + u
".gpkg"_s;
957 options.insert( u
"driverName"_s, format );
963 QString &destination,
968 const QVariantMap &createOptions,
969 const QStringList &datasourceOptions,
970 const QStringList &layerOptions,
975 QVariantMap options = createOptions;
976 if ( !options.contains( u
"fileEncoding"_s ) )
982 if ( destination.isEmpty() || destination.startsWith(
"memory:"_L1 ) )
985 if ( destination.startsWith(
"memory:"_L1 ) )
986 destination = destination.mid( 7 );
988 if ( destination.isEmpty() )
989 destination = u
"output"_s;
993 if ( !layer || !layer->isValid() )
1000 for (
const QgsField &field : fields )
1003 if ( !field.alias().isEmpty() )
1004 feedback->pushWarning( QObject::tr(
"%1: Aliases are not compatible with scratch layers" ).arg( field.name() ) );
1005 if ( !field.alias().isEmpty() )
1006 feedback->pushWarning( QObject::tr(
"%1: Comments are not compatible with scratch layers" ).arg( field.name() ) );
1013 destination = layer->id();
1016 auto sink = std::make_unique<QgsProcessingFeatureSink>( layer->dataProvider(), destination, context );
1019 return sink.release();
1023 QString providerKey;
1028 bool useWriter =
false;
1029 parseDestinationString( destination, providerKey, uri, layerName, format, options, useWriter, extension );
1032 if ( useWriter && providerKey ==
"ogr"_L1 )
1036 QString finalFileName;
1037 QString finalLayerName;
1039 saveOptions.
fileEncoding = options.value( u
"fileEncoding"_s ).toString();
1040 saveOptions.
layerName = !layerName.isEmpty() ? layerName : options.value( u
"layerName"_s ).toString();
1045 if ( remappingDefinition )
1049 auto vl = std::make_unique< QgsVectorLayer >( destination );
1050 if ( vl->isValid() )
1054 newFields = vl->fields();
1063 std::unique_ptr< QgsVectorFileWriter > writer(
1066 if ( writer->hasError() )
1068 throw QgsProcessingException( QObject::tr(
"Could not create layer %1: %2" ).arg( destination, writer->errorMessage() ) );
1073 for (
const QgsField &field : fields )
1076 feedback->pushWarning( QObject::tr(
"%1: Aliases are not supported by %2" ).arg( field.name(), writer->driverLongName() ) );
1078 feedback->pushWarning( QObject::tr(
"%1: Comments are not supported by %2" ).arg( field.name(), writer->driverLongName() ) );
1082 destination = finalFileName;
1083 if ( !saveOptions.
layerName.isEmpty() && !finalLayerName.isEmpty() )
1084 destination += u
"|layername=%1"_s.arg( finalLayerName );
1086 if ( remappingDefinition )
1088 auto remapSink = std::make_unique< QgsRemappingProxyFeatureSink >( *remappingDefinition, writer.release(),
true );
1099 if ( remappingDefinition )
1104 if ( !layerName.isEmpty() )
1107 parts.insert( u
"layerName"_s, layerName );
1111 auto layer = std::make_unique<QgsVectorLayer>( uri, destination, providerKey, layerOptions );
1113 destination = layer->
id();
1125 for (
const QgsField &field : fields )
1128 feedback->pushWarning( QObject::tr(
"%1: Aliases are not supported by the %2 provider" ).arg( field.name(), providerKey ) );
1130 feedback->pushWarning( QObject::tr(
"%1: Comments are not supported by the %2 provider" ).arg( field.name(), providerKey ) );
1134 auto remapSink = std::make_unique< QgsRemappingProxyFeatureSink >( *remappingDefinition, layer->
dataProvider(),
false );
1144 auto exporter = std::make_unique<QgsVectorLayerExporter>( uri, providerKey, newFields, geometryType, crs,
true, options, sinkFlags );
1147 throw QgsProcessingException( QObject::tr(
"Could not create layer %1: %2" ).arg( destination, exporter->errorMessage() ) );
1151 if ( !layerName.isEmpty() )
1153 uri += u
"|layername=%1"_s.arg( layerName );
1160 for (
const QgsField &field : fields )
1163 feedback->pushWarning( QObject::tr(
"%1: Aliases are not supported by the %2 provider" ).arg( field.name(), providerKey ) );
1165 feedback->pushWarning( QObject::tr(
"%1: Comments are not supported by the %2 provider" ).arg( field.name(), providerKey ) );
1179 *sink =
createFeatureSink( destination, context, fields, geometryType, crs, options );
1224 if ( !input.isValid() )
1225 return u
"memory:%1"_s.arg(
id.toString() );
1227 if ( input.userType() == qMetaTypeId<QgsProcessingOutputLayerDefinition>() )
1234 else if ( input.userType() == qMetaTypeId<QgsProperty>() )
1241 QString res = input.toString();
1247 else if ( res.startsWith(
"memory:"_L1 ) )
1249 return QString( res +
'_' +
id.toString() );
1255 int lastIndex = res.lastIndexOf(
'.' );
1256 return lastIndex >= 0 ? QString( res.left( lastIndex ) +
'_' +
id.toString() + res.mid( lastIndex ) ) : QString( res +
'_' +
id.toString() );
1267 static std::vector< std::unique_ptr< QTemporaryDir > > sTempFolders;
1268 static QString sFolder;
1269 static QMutex sMutex;
1270 QMutexLocker locker( &sMutex );
1275 if ( basePath.isEmpty() )
1278 if ( basePath.isEmpty() )
1281 if ( sTempFolders.empty() )
1283 const QString templatePath = u
"%1/processing_XXXXXX"_s.arg( QDir::tempPath() );
1284 auto tempFolder = std::make_unique< QTemporaryDir >( templatePath );
1286 sTempFolders.emplace_back( std::move(
tempFolder ) );
1289 else if ( sFolder.isEmpty() || !sFolder.startsWith( basePath ) || sTempFolders.empty() )
1291 if ( !QDir().exists( basePath ) )
1292 QDir().mkpath( basePath );
1294 const QString templatePath = u
"%1/processing_XXXXXX"_s.arg( basePath );
1295 auto tempFolder = std::make_unique< QTemporaryDir >( templatePath );
1297 sTempFolders.emplace_back( std::move(
tempFolder ) );
1304 QString subPath = QUuid::createUuid().toString().remove(
'-' ).remove(
'{' ).remove(
'}' );
1305 QString path =
tempFolder( context ) +
'/' + subPath;
1306 if ( !QDir( path ).exists() )
1309 tmpDir.mkdir( path );
1316 auto getText = [map](
const QString &key ) -> QString {
1317 if ( map.contains( key ) )
1318 return map.value( key ).toString();
1323 s += u
"<html><body><p>"_s + getText( u
"ALG_DESC"_s ) + u
"</p>\n"_s;
1326 const auto parameterDefinitions =
algorithm->parameterDefinitions();
1332 if ( !getText( def->name() ).isEmpty() )
1334 inputs += u
"<h3>"_s + def->description() + u
"</h3>\n"_s;
1335 inputs += u
"<p>"_s + getText( def->name() ) + u
"</p>\n"_s;
1338 if ( !inputs.isEmpty() )
1339 s += u
"<h2>"_s + QObject::tr(
"Input parameters" ) + u
"</h2>\n"_s + inputs;
1342 const auto outputDefinitions =
algorithm->outputDefinitions();
1345 if ( !getText( def->name() ).isEmpty() )
1347 outputs += u
"<h3>"_s + def->description() + u
"</h3>\n"_s;
1348 outputs += u
"<p>"_s + getText( def->name() ) + u
"</p>\n"_s;
1351 if ( !outputs.isEmpty() )
1352 s += u
"<h2>"_s + QObject::tr(
"Outputs" ) + u
"</h2>\n"_s + outputs;
1354 if ( !map.value( u
"EXAMPLES"_s ).toString().isEmpty() )
1355 s += u
"<h2>%1</h2>\n<p>%2</p>"_s.arg( QObject::tr(
"Examples" ), getText( u
"EXAMPLES"_s ) );
1358 if ( !map.value( u
"ALG_CREATOR"_s ).toString().isEmpty() )
1359 s += u
"<p align=\"right\">"_s + QObject::tr(
"Algorithm author:" ) + u
" "_s + getText( u
"ALG_CREATOR"_s ) + u
"</p>"_s;
1360 if ( !map.value( u
"ALG_HELP_CREATOR"_s ).toString().isEmpty() )
1361 s += u
"<p align=\"right\">"_s + QObject::tr(
"Help author:" ) + u
" "_s + getText( u
"ALG_HELP_CREATOR"_s ) + u
"</p>"_s;
1362 if ( !map.value( u
"ALG_VERSION"_s ).toString().isEmpty() )
1363 s += u
"<p align=\"right\">"_s + QObject::tr(
"Algorithm version:" ) + u
" "_s + getText( u
"ALG_VERSION"_s ) + u
"</p>"_s;
1365 s +=
"</body></html>"_L1;
1374 if ( def->name().compare( name, Qt::CaseInsensitive ) == 0 )
1386 if ( def->name().compare( name, Qt::CaseInsensitive ) == 0 )
1395 bool selectedFeaturesOnly,
1396 const QString &baseName,
1397 const QStringList &compatibleFormats,
1398 const QString &preferredFormat,
1402 long long featureLimit,
1403 const QString &filterExpression,
1407 bool requiresTranslation =
false;
1411 requiresTranslation = requiresTranslation || selectedFeaturesOnly;
1414 requiresTranslation = requiresTranslation || featureLimit != -1 || !filterExpression.isEmpty();
1419 requiresTranslation = requiresTranslation || vl->
providerType() !=
"ogr"_L1;
1423 requiresTranslation = requiresTranslation || !vl->
subsetString().isEmpty();
1427 requiresTranslation = requiresTranslation || vl->
source().startsWith(
"/vsi"_L1 );
1431 if ( !requiresTranslation )
1434 if ( parts.contains( u
"path"_s ) )
1436 diskPath = parts.value( u
"path"_s ).toString();
1437 QFileInfo fi( diskPath );
1438 requiresTranslation = !compatibleFormats.contains( fi.suffix(), Qt::CaseInsensitive );
1442 const QString srcLayerName = parts.value( u
"layerName"_s ).toString();
1446 *layerName = srcLayerName;
1451 requiresTranslation = requiresTranslation || ( !srcLayerName.isEmpty() && srcLayerName != fi.baseName() );
1456 requiresTranslation =
true;
1460 if ( requiresTranslation )
1470 const int fidIndex = fields.
lookupField( u
"fid"_s );
1471 if ( fidIndex >= 0 )
1472 fields.
rename( fidIndex, u
"OLD_FID"_s );
1478 if ( featureLimit != -1 )
1482 if ( !filterExpression.isEmpty() )
1487 if ( selectedFeaturesOnly )
1492 constexpr int maxErrors { 10 };
1493 unsigned long errorCounter { 0 };
1501 const QString errorMessage = writer->errorMessage();
1502 if ( !renameFid && saveOptions.
driverName ==
"GPKG"_L1 && errorMessage.contains(
"fid", Qt::CaseInsensitive ) )
1505 feedback->
reportError( QObject::tr(
"Cannot store existing FID values in temporary GeoPackage layer, these will be moved to \"OLD_FID\" instead." ),
false );
1506 return convertToCompatibleFormatInternal( vl, selectedFeaturesOnly, baseName, compatibleFormats, preferredFormat, context, feedback, layerName, featureLimit, filterExpression,
true );
1510 if ( errorCounter++ < maxErrors )
1512 errorText = QObject::tr(
"Error writing feature # %1 to output layer: %2" ).arg( QString::number( f.
id() ), errorMessage );
1518 if ( errorCounter >= maxErrors )
1520 feedback->
reportError( QObject::tr(
"There were %1 errors writing features, only the first %2 have been reported." ).arg( QString::number( errorCounter ), QString::number( maxErrors ) ) );
1532 bool selectedFeaturesOnly,
1533 const QString &baseName,
1534 const QStringList &compatibleFormats,
1535 const QString &preferredFormat,
1538 long long featureLimit,
1539 const QString &filterExpression
1542 return convertToCompatibleFormatInternal( vl, selectedFeaturesOnly, baseName, compatibleFormats, preferredFormat, context, feedback,
nullptr, featureLimit, filterExpression,
false );
1547 bool selectedFeaturesOnly,
1548 const QString &baseName,
1549 const QStringList &compatibleFormats,
1550 const QString &preferredFormat,
1554 long long featureLimit,
1555 const QString &filterExpression
1559 return convertToCompatibleFormatInternal( layer, selectedFeaturesOnly, baseName, compatibleFormats, preferredFormat, context, feedback, &layerName, featureLimit, filterExpression,
false );
1565 QSet< QString > usedNames;
1566 for (
const QgsField &f : fieldsA )
1568 usedNames.insert( f.name().toLower() );
1571 for (
const QgsField &f : fieldsB )
1574 newField.
setName( fieldsBPrefix + f.name() );
1575 if ( usedNames.contains( newField.
name().toLower() ) )
1578 QString newName = newField.
name() +
'_' + QString::number( idx );
1579 while ( usedNames.contains( newName.toLower() ) || fieldsB.
indexOf( newName ) != -1 )
1582 newName = newField.
name() +
'_' + QString::number( idx );
1585 outFields.
append( newField );
1589 outFields.
append( newField );
1591 usedNames.insert( newField.
name() );
1600 if ( !fieldNames.isEmpty() )
1602 indices.reserve( fieldNames.count() );
1603 for (
const QString &f : fieldNames )
1607 indices.append( idx );
1612 indices.reserve( fields.
count() );
1613 for (
int i = 0; i < fields.
count(); ++i )
1614 indices.append( i );
1622 for (
int i : indices )
1623 fieldsSubset.
append( fields.
at( i ) );
1624 return fieldsSubset;
1630 if ( setting.isEmpty() )
1633 if ( setting.startsWith(
'.' ) )
1634 setting = setting.mid( 1 );
1637 if ( !supportedFormats.contains( setting, Qt::CaseInsensitive ) )
1646 if ( setting.isEmpty() )
1652 if ( detail.driverName.compare( setting, Qt::CaseInsensitive ) == 0 )
1653 return detail.driverName;
1663 if ( !extensions.isEmpty() )
1664 return extensions[0];
1676 return u
"mbtiles"_s;
1681 auto layerPointerToString = [](
QgsMapLayer *layer ) -> QString {
1690 auto cleanPointerValues = [&layerPointerToString](
const QVariant &value ) -> QVariant {
1691 if (
QgsMapLayer *layer = qobject_cast< QgsMapLayer * >( value.value< QObject * >() ) )
1694 return layerPointerToString( layer );
1696 else if ( value.userType() == QMetaType::type(
"QPointer< QgsMapLayer >" ) )
1699 return layerPointerToString( value.value< QPointer< QgsMapLayer > >().data() );
1708 for (
auto it = map.constBegin(); it != map.constEnd(); ++it )
1710 if ( it->userType() == QMetaType::Type::QVariantMap )
1714 else if ( it->userType() == QMetaType::Type::QVariantList )
1717 const QVariantList source = it.value().toList();
1718 dest.reserve( source.size() );
1719 for (
const QVariant &v : source )
1721 dest.append( cleanPointerValues( v ) );
1723 res.insert( it.key(), dest );
1727 res.insert( it.key(), cleanPointerValues( it.value() ) );
1737 for (
auto it = parameters.constBegin(); it != parameters.constEnd(); ++it )
1739 if ( it.value().userType() == QMetaType::Type::QVariantMap )
1741 const QVariantMap value = it.value().toMap();
1742 if ( value.value( u
"type"_s ).toString() ==
"data_defined"_L1 )
1744 const QString expression = value.value( u
"expression"_s ).toString();
1745 const QString field = value.value( u
"field"_s ).toString();
1746 if ( !expression.isEmpty() )
1750 else if ( !field.isEmpty() )
1757 error = QObject::tr(
"Invalid data defined parameter for %1, requires 'expression' or 'field' values." ).arg( it.key() );
1762 output.insert( it.key(), it.value() );
1765 else if ( it.value().userType() == QMetaType::Type::QString )
1767 const QString stringValue = it.value().toString();
1769 if ( stringValue.startsWith(
"field:"_L1 ) )
1773 else if ( stringValue.startsWith(
"expression:"_L1 ) )
1779 output.insert( it.key(), it.value() );
1784 output.insert( it.key(), it.value() );
1792 if ( !QTextCodec::availableCodecs().contains( defaultEncoding.toLatin1() ) )
1794 const QString systemCodec = QTextCodec::codecForLocale()->name();
1795 if ( !systemCodec.isEmpty() )
1799 return QString(
"UTF-8" );
1802 return defaultEncoding;
1807 const QList<QByteArray> supportedFormats = QImageWriter::supportedImageFormats();
1808 QStringList formats;
1809 formats.reserve( supportedFormats.size() );
1811 for (
const QByteArray &format : supportedFormats )
1813 if ( format ==
"svg" )
1817 formats.append( QString::fromUtf8( format ).toUpper() );
1820 std::sort( formats.begin(), formats.end(), [](
const QString &a,
const QString &b ) ->
bool {
1821 if ( a ==
"PNG"_L1 )
1825 if ( b ==
"PNG"_L1 )
1829 return a.localeAwareCompare( b ) < 0;
1838 QStringList fileFilters;
1839 fileFilters.reserve( formats.size() );
1841 for (
const QString &format : formats )
1843 const QString longName = format + QObject::tr(
" format" );
1844 const QString glob = u
"*."_s + format;
1846 fileFilters.append( u
"%1 (%2 %3)"_s.arg( longName, glob.toLower(), glob ) );
1849 return fileFilters.join(
";;"_L1 );
1855 const QDir userDir = QDir( settingsDir.filePath( u
"processing"_s ) );
1856 if ( !userDir.exists() )
1858 userDir.mkpath( u
"."_s );
1861 return userDir.absolutePath();
1866 return QDir( QDir::homePath() ).absoluteFilePath( u
"processing"_s );
1871 QDir modelFolder = QDir(
userFolder() ).filePath( u
"models"_s );
1872 if ( !modelFolder.exists() )
1874 modelFolder.mkpath( u
"."_s );
1876 return modelFolder.absolutePath();
1883 const QString settingValue =
QgsSettings().
value( u
"Processing/Configuration/MODELS_FOLDER"_s ).toString();
1884 if ( !settingValue.trimmed().isEmpty() )
1886 return settingValue.split(
';' );
1899 : mSource( originalSource )
1900 , mOwnsSource( ownsOriginalSource )
1902 , mSourceFields( mSource->
fields() )
1903 , mSourceWkbType( mSource->
wkbType() )
1907 , mInvalidGeometryCheck(
1911 , mInvalidGeometryCallback( context.invalidGeometryCallback( originalSource ) )
1912 , mTransformErrorCallback( context.transformErrorCallback() )
1913 , mInvalidGeometryCallbackSkip( context.defaultInvalidGeometryCallbackForCheck(
Qgis::InvalidGeometryCheck::SkipInvalid, originalSource ) )
1914 , mInvalidGeometryCallbackAbort( context.defaultInvalidGeometryCallbackForCheck(
Qgis::InvalidGeometryCheck::AbortOnInvalid, originalSource ) )
1915 , mFeatureLimit( featureLimit )
1916 , mFilterExpression( filterExpression )
1938 if ( mFeatureLimit != -1 && req.
limit() != -1 )
1939 req.
setLimit( std::min(
static_cast< long long >( req.
limit() ), mFeatureLimit ) );
1940 else if ( mFeatureLimit != -1 )
1943 if ( !mFilterExpression.isEmpty() )
1946 return mSource->getFeatures( req );
1955 return sourceAvailability;
1968 if ( mFeatureLimit != -1 && req.
limit() != -1 )
1969 req.
setLimit( std::min(
static_cast< long long >( req.
limit() ), mFeatureLimit ) );
1970 else if ( mFeatureLimit != -1 )
1973 if ( !mFilterExpression.isEmpty() )
1976 return mSource->getFeatures( req );
1986 return mSourceFields;
1991 return mSourceWkbType;
1996 if ( !mFilterExpression.isEmpty() )
1999 if ( mFeatureLimit == -1 )
2000 return mSource->featureCount();
2002 return std::min( mFeatureLimit, mSource->featureCount() );
2012 if ( mFilterExpression.isEmpty() )
2013 return mSource->uniqueValues( fieldIndex, limit );
2017 if ( fieldIndex < 0 || fieldIndex >=
fields().count() )
2018 return QSet<QVariant>();
2025 QSet<QVariant> values;
2030 values.insert( f.
attribute( fieldIndex ) );
2031 if ( limit > 0 && values.size() >= limit )
2039 if ( mFilterExpression.isEmpty() )
2040 return mSource->minimumValue( fieldIndex );
2044 if ( fieldIndex < 0 || fieldIndex >=
fields().count() )
2056 const QVariant v = f.
attribute( fieldIndex );
2067 if ( mFilterExpression.isEmpty() )
2068 return mSource->maximumValue( fieldIndex );
2072 if ( fieldIndex < 0 || fieldIndex >=
fields().count() )
2084 const QVariant v = f.
attribute( fieldIndex );
2095 return mSourceExtent;
2100 if ( mFilterExpression.isEmpty() )
2101 return mSource->allFeatureIds();
2118 return mSourceSpatialIndexPresence;
2129 return expressionContextScope;
2134 mInvalidGeometryCheck = method;
2135 switch ( mInvalidGeometryCheck )
2138 mInvalidGeometryCallback =
nullptr;
2142 mInvalidGeometryCallback = mInvalidGeometryCallbackSkip;
2146 mInvalidGeometryCallback = mInvalidGeometryCallbackAbort;
2153 return mInvalidGeometryCheck;
2162 , mContext( context )
2163 , mSinkName( sinkName )
2164 , mOwnsSink( ownsOriginalSink )
2171 mContext.feedback()->reportError(
lastError() );
2192 if ( !result && mContext.feedback() )
2195 if ( !error.isEmpty() )
2196 mContext.feedback()->reportError( QObject::tr(
"Feature could not be written to %1: %2" ).arg( mSinkName, error ) );
2198 mContext.feedback()->reportError( QObject::tr(
"Feature could not be written to %1" ).arg( mSinkName ) );
2206 if ( !result && mContext.feedback() )
2209 if ( !error.isEmpty() )
2210 mContext.feedback()->reportError( QObject::tr(
"%n feature(s) could not be written to %1: %2",
nullptr, features.count() ).arg( mSinkName, error ) );
2212 mContext.feedback()->reportError( QObject::tr(
"%n feature(s) could not be written to %1",
nullptr, features.count() ).arg( mSinkName ) );
2220 if ( !result && mContext.feedback() )
2223 if ( !error.isEmpty() )
2224 mContext.feedback()->reportError( QObject::tr(
"Features could not be written to %1: %2" ).arg( mSinkName, error ) );
2226 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.
static QString qgisSettingsDirPath()
Returns the path to the settings directory in user's home dir.
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 defaultModelFolder()
Returns the default location for Processing model files.
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 QString defaultOutputFolder()
Returns the default location for data files and outputs generated by Processing algorithms.
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 int parameterDefinitionIndex(const QgsProcessingAlgorithm *algorithm, const QString &name)
Returns the index of the parameter with matching name for a specified algorithm.
static QString defaultRasterFormat()
Returns the default raster format to use, in the absence of all other constraints (e....
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 QString userFolder()
Returns the location for Processing files stored within the user's current QGIS profile.
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 QStringList modelFolders()
Returns the list of locations for reading Processing model files.
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 QStringList supportedImageFormats()
Returns a list of image format extensions supported by QImageWriter.
static QString supportedImageFileFilters()
Returns a file filter string of all supported image formats, suitable for use in file picker dialogs.
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.
static const QgsSettingsEntryString * settingsDefaultOutputRasterLayerFormat
Settings entry default output raster layer format.
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 * 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 extensionsForFormat(const QString &format)
Returns a list of known file extensions for the given GDAL driver format.
static QList< QgsRasterFileWriter::FilterFormatDetails > supportedFiltersAndFormats(RasterFormatOptions options=SortRecommended)
Returns a list or pairs, with format filter string as first element and GDAL format key as second ele...
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.
Stores settings for use within QGIS.
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
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.