37 #include <QRegularExpression>
43 return QList<QgsRasterLayer *>();
45 QList<QgsRasterLayer *> layers;
50 if ( canUseLayer( l ) )
58 return QString::localeAwareCompare( a->name(), b->name() ) < 0;
67 return QList<QgsVectorLayer *>();
69 QList<QgsVectorLayer *> layers;
73 if ( canUseLayer( l, geometryTypes ) )
81 return QString::localeAwareCompare( a->name(), b->name() ) < 0;
90 return QList<QgsMeshLayer *>();
92 QList<QgsMeshLayer *> layers;
96 if ( canUseLayer( l ) )
104 return QString::localeAwareCompare( a->name(), b->name() ) < 0;
113 return QList<QgsMapLayer *>();
115 QList<QgsMapLayer *> layers;
133 return QString::localeAwareCompare( a->name(), b->name() ) < 0;
141 return QStringLiteral(
"%1://%2" ).arg( providerKey, uri );
146 QRegularExpression re( QStringLiteral(
"^(\\w+?):\\/\\/(.+)$" ) );
147 const QRegularExpressionMatch match = re.match(
string );
148 if ( !match.hasMatch() )
151 providerKey = match.captured( 1 );
152 uri = match.captured( 2 );
160 if ( !store ||
string.isEmpty() )
163 QList< QgsMapLayer * > layers = store->
mapLayers().values();
165 layers.erase( std::remove_if( layers.begin(), layers.end(), [](
QgsMapLayer * layer )
167 switch ( layer->type() )
169 case QgsMapLayerType::VectorLayer:
170 return !canUseLayer( qobject_cast< QgsVectorLayer * >( layer ) );
171 case QgsMapLayerType::RasterLayer:
172 return !canUseLayer( qobject_cast< QgsRasterLayer * >( layer ) );
173 case QgsMapLayerType::PluginLayer:
175 case QgsMapLayerType::MeshLayer:
176 return !canUseLayer( qobject_cast< QgsMeshLayer * >( layer ) );
177 case QgsMapLayerType::VectorTileLayer:
178 return !canUseLayer( qobject_cast< QgsVectorTileLayer * >( layer ) );
179 case QgsMapLayerType::AnnotationLayer:
181 case QgsMapLayerType::PointCloudLayer:
187 auto isCompatibleType = [typeHint](
QgsMapLayer * l ) ->
bool
191 case LayerHint::UnknownType:
194 case LayerHint::Vector:
197 case LayerHint::Raster:
200 case LayerHint::Mesh:
208 if ( isCompatibleType( l ) && l->id() == string )
213 if ( isCompatibleType( l ) && l->name() == string )
218 if ( isCompatibleType( l ) && normalizeLayerSource( l->source() ) == normalizeLayerSource(
string ) )
234 if ( !useProvider || ( provider == QLatin1String(
"ogr" ) || provider == QLatin1String(
"gdal" ) || provider == QLatin1String(
"mdal" ) ) )
236 QStringList components = uri.split(
'|' );
237 if ( components.isEmpty() )
241 if ( QFileInfo::exists( uri ) )
242 fi = QFileInfo( uri );
243 else if ( QFileInfo::exists( components.at( 0 ) ) )
244 fi = QFileInfo( components.at( 0 ) );
247 name = fi.baseName();
258 options.loadDefaultStyle =
false;
259 options.skipCrsValidation =
true;
261 std::unique_ptr< QgsVectorLayer > layer;
264 layer = qgis::make_unique<QgsVectorLayer>( uri, name, provider, options );
269 layer = qgis::make_unique<QgsVectorLayer>( uri, name, QStringLiteral(
"ogr" ), options );
271 if ( layer->isValid() )
273 return layer.release();
282 std::unique_ptr< QgsRasterLayer > rasterLayer;
285 rasterLayer = qgis::make_unique< QgsRasterLayer >( uri, name, provider, rasterOptions );
290 rasterLayer = qgis::make_unique< QgsRasterLayer >( uri, name, QStringLiteral(
"gdal" ), rasterOptions );
293 if ( rasterLayer->isValid() )
295 return rasterLayer.release();
303 std::unique_ptr< QgsMeshLayer > meshLayer;
306 meshLayer = qgis::make_unique< QgsMeshLayer >( uri, name, provider, meshOptions );
310 meshLayer = qgis::make_unique< QgsMeshLayer >( uri, name, QStringLiteral(
"mdal" ), meshOptions );
312 if ( meshLayer->isValid() )
314 return meshLayer.release();
322 if (
string.isEmpty() )
327 if (
auto *lProject = context.
project() )
329 QgsMapLayer *layer = mapLayerFromStore(
string, lProject->layerStore(), typeHint );
338 if ( !allowLoadingNewLayers )
341 layer = loadMapLayerFromString(
string, context.
transformContext(), typeHint );
355 QVariant val = value;
356 bool selectedFeaturesOnly =
false;
357 long long featureLimit = -1;
358 bool overrideGeometryCheck =
false;
367 overrideGeometryCheck = fromVar.
flags & QgsProcessingFeatureSourceDefinition::Flag::FlagOverrideDefaultGeometryCheck;
377 if (
QgsVectorLayer *layer = qobject_cast< QgsVectorLayer * >( qvariant_cast<QObject *>( val ) ) )
379 std::unique_ptr< QgsProcessingFeatureSource> source = qgis::make_unique< QgsProcessingFeatureSource >( layer, context,
false, featureLimit );
380 if ( overrideGeometryCheck )
381 source->setInvalidGeometryCheck( geometryCheck );
382 return source.release();
390 else if ( !val.isValid() || val.toString().isEmpty() )
393 if (
QgsVectorLayer *layer = qobject_cast< QgsVectorLayer * >( qvariant_cast<QObject *>( fallbackValue ) ) )
395 std::unique_ptr< QgsProcessingFeatureSource> source = qgis::make_unique< QgsProcessingFeatureSource >( layer, context,
false, featureLimit );
396 if ( overrideGeometryCheck )
397 source->setInvalidGeometryCheck( geometryCheck );
398 return source.release();
401 layerRef = fallbackValue.toString();
405 layerRef = val.toString();
408 if ( layerRef.isEmpty() )
415 std::unique_ptr< QgsProcessingFeatureSource> source;
416 if ( selectedFeaturesOnly )
422 source = qgis::make_unique< QgsProcessingFeatureSource >( vl, context,
false, featureLimit );
425 if ( overrideGeometryCheck )
426 source->setInvalidGeometryCheck( geometryCheck );
427 return source.release();
432 QVariant val = value;
458 if (
QgsMapLayer *layer = qobject_cast< QgsMapLayer * >( qvariant_cast<QObject *>( val ) ) )
464 if ( !val.isValid() )
470 QString crsText = val.toString();
471 if ( crsText.isEmpty() )
472 crsText = fallbackValue.toString();
474 if ( crsText.isEmpty() )
478 if ( context.
project() && crsText.compare( QLatin1String(
"ProjectCrs" ), Qt::CaseInsensitive ) == 0 )
491 bool QgsProcessingUtils::canUseLayer(
const QgsMeshLayer *layer )
498 return layer && layer->
isValid();
501 bool QgsProcessingUtils::canUseLayer(
const QgsRasterLayer *layer )
503 return layer && layer->
isValid();
506 bool QgsProcessingUtils::canUseLayer(
const QgsVectorLayer *layer,
const QList<int> &sourceTypes )
508 return layer && layer->
isValid() &&
509 ( sourceTypes.isEmpty()
520 QString normalized = source;
521 normalized.replace(
'\\',
'/' );
522 return normalized.trimmed();
527 if ( !value.isValid() )
528 return QStringLiteral(
"None" );
531 return QStringLiteral(
"QgsProperty.fromExpression('%1')" ).arg( value.value<
QgsProperty >().
asExpression() );
535 return QStringLiteral(
"QgsCoordinateReferenceSystem()" );
569 switch ( value.type() )
572 return value.toBool() ? QStringLiteral(
"True" ) : QStringLiteral(
"False" );
574 case QVariant::Double:
575 return QString::number( value.toDouble() );
579 return QString::number( value.toInt() );
581 case QVariant::LongLong:
582 case QVariant::ULongLong:
583 return QString::number( value.toLongLong() );
588 const QVariantList vl = value.toList();
589 for (
const QVariant &v : vl )
593 return parts.join(
',' ).prepend(
'[' ).append(
']' );
598 const QVariantMap map = value.toMap();
600 parts.reserve( map.size() );
601 for (
auto it = map.constBegin(); it != map.constEnd(); ++it )
605 return parts.join(
',' ).prepend(
'{' ).append(
'}' );
608 case QVariant::DateTime:
610 const QDateTime dateTime = value.toDateTime();
611 return QStringLiteral(
"QDateTime(QDate(%1, %2, %3), QTime(%4, %5, %6))" )
612 .arg( dateTime.date().year() )
613 .arg( dateTime.date().month() )
614 .arg( dateTime.date().day() )
615 .arg( dateTime.time().hour() )
616 .arg( dateTime.time().minute() )
617 .arg( dateTime.time().second() );
630 s.replace(
'\\', QLatin1String(
"\\\\" ) );
631 s.replace(
'\n', QLatin1String(
"\\n" ) );
632 s.replace(
'\r', QLatin1String(
"\\r" ) );
633 s.replace(
'\t', QLatin1String(
"\\t" ) );
634 s.replace(
'"', QLatin1String(
"\\\"" ) );
635 s.replace(
'\'', QLatin1String(
"\\\'" ) );
636 s = s.prepend(
'\'' ).append(
'\'' );
640 void QgsProcessingUtils::parseDestinationString( QString &destination, QString &providerKey, QString &uri, QString &layerName, QString &format, QMap<QString, QVariant> &options,
bool &useWriter, QString &extension )
647 QRegularExpression splitRx( QStringLiteral(
"^(.{3,}?):(.*)$" ) );
648 QRegularExpressionMatch match = splitRx.match( destination );
649 if ( match.hasMatch() )
651 providerKey = match.captured( 1 );
652 uri = match.captured( 2 );
659 if ( providerKey == QLatin1String(
"postgis" ) )
661 providerKey = QStringLiteral(
"postgres" );
663 if ( providerKey == QLatin1String(
"ogr" ) )
666 if ( !dsUri.database().isEmpty() )
668 if ( !dsUri.table().isEmpty() )
670 layerName = dsUri.table();
671 options.insert( QStringLiteral(
"layerName" ), layerName );
673 uri = dsUri.database();
674 extension = QFileInfo( uri ).completeSuffix();
676 options.insert( QStringLiteral(
"driverName" ), format );
680 extension = QFileInfo( uri ).completeSuffix();
683 options.insert( QStringLiteral(
"update" ),
true );
690 providerKey = QStringLiteral(
"ogr" );
692 QRegularExpression splitRx( QStringLiteral(
"^(.*)\\.(.*?)$" ) );
693 QRegularExpressionMatch match = splitRx.match( destination );
694 if ( match.hasMatch() )
696 extension = match.captured( 2 );
700 if ( format.isEmpty() )
702 format = QStringLiteral(
"GPKG" );
703 destination = destination + QStringLiteral(
".gpkg" );
706 options.insert( QStringLiteral(
"driverName" ), format );
713 QVariantMap options = createOptions;
714 if ( !options.contains( QStringLiteral(
"fileEncoding" ) ) )
720 if ( destination.isEmpty() || destination.startsWith( QLatin1String(
"memory:" ) ) )
723 if ( destination.startsWith( QLatin1String(
"memory:" ) ) )
724 destination = destination.mid( 7 );
726 if ( destination.isEmpty() )
727 destination = QStringLiteral(
"output" );
731 if ( !layer || !layer->isValid() )
739 destination = layer->id();
742 std::unique_ptr< QgsProcessingFeatureSink > sink(
new QgsProcessingFeatureSink( layer->dataProvider(), destination, context ) );
745 return sink.release();
754 bool useWriter =
false;
755 parseDestinationString( destination, providerKey, uri, layerName, format, options, useWriter, extension );
758 if ( useWriter && providerKey == QLatin1String(
"ogr" ) )
762 QString finalFileName;
763 QString finalLayerName;
765 saveOptions.
fileEncoding = options.value( QStringLiteral(
"fileEncoding" ) ).toString();
766 saveOptions.
layerName = !layerName.isEmpty() ? layerName : options.value( QStringLiteral(
"layerName" ) ).toString();
771 if ( remappingDefinition )
775 std::unique_ptr< QgsVectorLayer > vl = qgis::make_unique< QgsVectorLayer >( destination );
780 newFields = vl->fields();
790 if ( writer->hasError() )
792 throw QgsProcessingException( QObject::tr(
"Could not create layer %1: %2" ).arg( destination, writer->errorMessage() ) );
794 destination = finalFileName;
795 if ( !saveOptions.
layerName.isEmpty() && !finalLayerName.isEmpty() )
796 destination += QStringLiteral(
"|layername=%1" ).arg( finalLayerName );
798 if ( remappingDefinition )
800 std::unique_ptr< QgsRemappingProxyFeatureSink > remapSink = qgis::make_unique< QgsRemappingProxyFeatureSink >( *remappingDefinition, writer.release(),
true );
811 if ( remappingDefinition )
816 if ( !layerName.isEmpty() )
819 parts.insert( QStringLiteral(
"layerName" ), layerName );
823 std::unique_ptr< QgsVectorLayer > layer = qgis::make_unique<QgsVectorLayer>( uri, destination, providerKey, layerOptions );
825 destination = layer->id();
826 if ( layer->isValid() )
833 std::unique_ptr< QgsRemappingProxyFeatureSink > remapSink = qgis::make_unique< QgsRemappingProxyFeatureSink >( *remappingDefinition, layer->dataProvider(),
false );
843 std::unique_ptr< QgsVectorLayerExporter > exporter = qgis::make_unique<QgsVectorLayerExporter>( uri, providerKey, newFields, geometryType,
crs,
true, options, sinkFlags );
844 if ( exporter->errorCode() )
846 throw QgsProcessingException( QObject::tr(
"Could not create layer %1: %2" ).arg( destination, exporter->errorMessage() ) );
850 if ( !layerName.isEmpty() )
852 uri += QStringLiteral(
"|layername=%1" ).arg( layerName );
910 if ( !input.isValid() )
911 return QStringLiteral(
"memory:%1" ).arg(
id.toString() );
927 QString res = input.toString();
933 else if ( res.startsWith( QLatin1String(
"memory:" ) ) )
935 return QString( res +
'_' +
id.toString() );
941 int lastIndex = res.lastIndexOf(
'.' );
942 return QString( res.left( lastIndex ) +
'_' +
id.toString() + res.mid( lastIndex ) );
953 static std::vector< std::unique_ptr< QTemporaryDir > > sTempFolders;
954 static QString sFolder;
955 static QMutex sMutex;
956 QMutexLocker locker( &sMutex );
957 const QString basePath =
QgsSettings().
value( QStringLiteral(
"Processing/Configuration/TEMP_PATH2" ) ).toString();
958 if ( basePath.isEmpty() )
961 if ( sTempFolders.empty() )
963 const QString templatePath = QStringLiteral(
"%1/processing_XXXXXX" ).arg( QDir::tempPath() );
964 std::unique_ptr< QTemporaryDir >
tempFolder = qgis::make_unique< QTemporaryDir >( templatePath );
966 sTempFolders.emplace_back( std::move(
tempFolder ) );
969 else if ( sFolder.isEmpty() || !sFolder.startsWith( basePath ) || sTempFolders.empty() )
971 if ( !QDir().exists( basePath ) )
972 QDir().mkpath( basePath );
974 const QString templatePath = QStringLiteral(
"%1/processing_XXXXXX" ).arg( basePath );
975 std::unique_ptr< QTemporaryDir >
tempFolder = qgis::make_unique< QTemporaryDir >( templatePath );
977 sTempFolders.emplace_back( std::move(
tempFolder ) );
984 QString subPath = QUuid::createUuid().toString().remove(
'-' ).remove(
'{' ).remove(
'}' );
986 if ( !QDir( path ).exists() )
989 tmpDir.mkdir( path );
996 auto getText = [map](
const QString & key )->QString
998 if ( map.contains( key ) )
999 return map.value( key ).toString();
1003 QString s = QObject::tr(
"<html><body><h2>Algorithm description</h2>\n" );
1004 s += QStringLiteral(
"<p>" ) + getText( QStringLiteral(
"ALG_DESC" ) ) + QStringLiteral(
"</p>\n" );
1011 inputs += QStringLiteral(
"<h3>" ) + def->description() + QStringLiteral(
"</h3>\n" );
1012 inputs += QStringLiteral(
"<p>" ) + getText( def->name() ) + QStringLiteral(
"</p>\n" );
1014 if ( !inputs.isEmpty() )
1015 s += QObject::tr(
"<h2>Input parameters</h2>\n" ) + inputs;
1021 outputs += QStringLiteral(
"<h3>" ) + def->description() + QStringLiteral(
"</h3>\n" );
1022 outputs += QStringLiteral(
"<p>" ) + getText( def->name() ) + QStringLiteral(
"</p>\n" );
1024 if ( !outputs.isEmpty() )
1025 s += QObject::tr(
"<h2>Outputs</h2>\n" ) + outputs;
1027 s += QLatin1String(
"<br>" );
1028 if ( !map.value( QStringLiteral(
"ALG_CREATOR" ) ).toString().isEmpty() )
1029 s += QObject::tr(
"<p align=\"right\">Algorithm author: %1</p>" ).arg( getText( QStringLiteral(
"ALG_CREATOR" ) ) );
1030 if ( !map.value( QStringLiteral(
"ALG_HELP_CREATOR" ) ).toString().isEmpty() )
1031 s += QObject::tr(
"<p align=\"right\">Help author: %1</p>" ).arg( getText( QStringLiteral(
"ALG_HELP_CREATOR" ) ) );
1032 if ( !map.value( QStringLiteral(
"ALG_VERSION" ) ).toString().isEmpty() )
1033 s += QObject::tr(
"<p align=\"right\">Algorithm version: %1</p>" ).arg( getText( QStringLiteral(
"ALG_VERSION" ) ) );
1035 s += QLatin1String(
"</body></html>" );
1040 long long featureLimit )
1042 bool requiresTranslation =
false;
1046 requiresTranslation = requiresTranslation || selectedFeaturesOnly;
1049 requiresTranslation = requiresTranslation || featureLimit != -1;
1054 requiresTranslation = requiresTranslation || vl->
providerType() != QLatin1String(
"ogr" );
1058 requiresTranslation = requiresTranslation || !vl->
subsetString().isEmpty();
1062 requiresTranslation = requiresTranslation || vl->
source().startsWith( QLatin1String(
"/vsi" ) );
1066 if ( !requiresTranslation )
1069 if ( parts.contains( QStringLiteral(
"path" ) ) )
1071 diskPath = parts.value( QStringLiteral(
"path" ) ).toString();
1072 QFileInfo fi( diskPath );
1073 requiresTranslation = !compatibleFormats.contains( fi.suffix(), Qt::CaseInsensitive );
1077 const QString srcLayerName = parts.value( QStringLiteral(
"layerName" ) ).toString();
1081 *layerName = srcLayerName;
1086 requiresTranslation = requiresTranslation || ( !srcLayerName.isEmpty() && srcLayerName != fi.baseName() );
1091 requiresTranslation =
true;
1095 if ( requiresTranslation )
1105 if ( featureLimit != -1 )
1107 if ( selectedFeaturesOnly )
1114 if ( selectedFeaturesOnly )
1142 return convertToCompatibleFormatInternal( layer, selectedFeaturesOnly, baseName, compatibleFormats, preferredFormat, context, feedback, &layerName, featureLimit );
1148 QSet< QString > usedNames;
1149 for (
const QgsField &f : fieldsA )
1151 usedNames.insert( f.name().toLower() );
1154 for (
const QgsField &f : fieldsB )
1157 newField.
setName( fieldsBPrefix + f.name() );
1158 if ( usedNames.contains( newField.
name().toLower() ) )
1161 QString newName = newField.
name() +
'_' + QString::number( idx );
1162 while ( usedNames.contains( newName.toLower() ) )
1165 newName = newField.
name() +
'_' + QString::number( idx );
1168 outFields.
append( newField );
1172 outFields.
append( newField );
1174 usedNames.insert( newField.
name() );
1184 if ( !fieldNames.isEmpty() )
1186 indices.reserve( fieldNames.count() );
1187 for (
const QString &f : fieldNames )
1191 indices.append( idx );
1196 indices.reserve( fields.
count() );
1197 for (
int i = 0; i < fields.
count(); ++i )
1198 indices.append( i );
1207 for (
int i : indices )
1208 fieldsSubset.
append( fields.
at( i ) );
1209 return fieldsSubset;
1215 const int setting = settings.
value( QStringLiteral(
"Processing/Configuration/DefaultOutputVectorLayerExt" ), -1 ).toInt();
1216 if ( setting == -1 )
1217 return QStringLiteral(
"gpkg" );
1224 const int setting = settings.
value( QStringLiteral(
"Processing/Configuration/DefaultOutputRasterLayerExt" ), -1 ).toInt();
1225 if ( setting == -1 )
1226 return QStringLiteral(
"tif" );
1235 : mSource( originalSource )
1236 , mOwnsSource( ownsOriginalSource )
1239 : context.invalidGeometryCheck() )
1240 , mInvalidGeometryCallback( context.invalidGeometryCallback( originalSource ) )
1241 , mTransformErrorCallback( context.transformErrorCallback() )
1242 , mInvalidGeometryCallbackSkip( context.defaultInvalidGeometryCallbackForCheck(
QgsFeatureRequest::GeometrySkipInvalid, originalSource ) )
1243 , mInvalidGeometryCallbackAbort( context.defaultInvalidGeometryCallbackForCheck(
QgsFeatureRequest::GeometryAbortOnInvalid, originalSource ) )
1244 , mFeatureLimit( featureLimit )
1266 if ( mFeatureLimit != -1 && req.
limit() != -1 )
1267 req.
setLimit( std::min(
static_cast< long long >( req.
limit() ), mFeatureLimit ) );
1268 else if ( mFeatureLimit != -1 )
1280 return sourceAvailability;
1293 if ( mFeatureLimit != -1 && req.
limit() != -1 )
1294 req.
setLimit( std::min(
static_cast< long long >( req.
limit() ), mFeatureLimit ) );
1295 else if ( mFeatureLimit != -1 )
1308 return mSource->
fields();
1318 if ( mFeatureLimit == -1 )
1321 return std::min( mFeatureLimit,
static_cast< long long >( mSource->
featureCount() ) );
1368 return expressionContextScope;
1373 mInvalidGeometryCheck = method;
1374 switch ( mInvalidGeometryCheck )
1377 mInvalidGeometryCallback =
nullptr;
1381 mInvalidGeometryCallback = mInvalidGeometryCallbackSkip;
1385 mInvalidGeometryCallback = mInvalidGeometryCallbackAbort;
1397 , mContext( context )
1398 , mSinkName( sinkName )
1399 , mOwnsSink( ownsOriginalSink )
1411 if ( !result && mContext.
feedback() )
1414 if ( !error.isEmpty() )
1415 mContext.
feedback()->
reportError( QObject::tr(
"Feature could not be written to %1: %2" ).arg( mSinkName, error ) );
1417 mContext.
feedback()->
reportError( QObject::tr(
"Feature could not be written to %1" ).arg( mSinkName ) );
1425 if ( !result && mContext.
feedback() )
1428 if ( !error.isEmpty() )
1429 mContext.
feedback()->
reportError( QObject::tr(
"%1 feature(s) could not be written to %2: %3" ).arg( features.count() ).arg( mSinkName, error ) );
1431 mContext.
feedback()->
reportError( QObject::tr(
"%1 feature(s) could not be written to %2" ).arg( features.count() ).arg( mSinkName ) );
1439 if ( !result && mContext.
feedback() )
1442 if ( !error.isEmpty() )
1443 mContext.
feedback()->
reportError( QObject::tr(
"Features could not be written to %1: %2" ).arg( mSinkName, error ) );
1445 mContext.
feedback()->
reportError( QObject::tr(
"Features could not be written to %1" ).arg( mSinkName ) );
This class represents a coordinate reference system (CRS).
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
bool createFromString(const QString &definition)
Set up this CRS from a string definition.
QString authid() const
Returns the authority identifier for the CRS.
Contains information about the context in which a coordinate transform is executed.
Custom exception class for Coordinate Reference System related exceptions.
Class for storing the component parts of a RDBMS data source URI (e.g.
QString table() const
Returns the table 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)
This class wraps a request for features to a vector layer (or directly its vector data provider).
InvalidGeometryCheck
Handling of features with invalid geometries.
@ GeometryNoCheck
No invalid geometry checking.
@ GeometryAbortOnInvalid
Close iterator on encountering any features with invalid geometry. This requires a slow geometry vali...
@ GeometrySkipInvalid
Skip any features with invalid geometry. This requires a slow geometry validity check for every featu...
QgsFeatureRequest & setLimit(long limit)
Set the maximum number of features to request.
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 & setInvalidGeometryCheck(InvalidGeometryCheck check)
Sets invalid geometry checking behavior.
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...
long limit() const
Returns the maximum number of features to request, or -1 if no limit set.
An interface for objects which accept features via addFeature(s) methods.
@ 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.
virtual QgsFields fields() const =0
Returns the fields associated with features in the source.
virtual QSet< QVariant > uniqueValues(int fieldIndex, int limit=-1) const
Returns the set of unique values contained within the specified fieldIndex from this source.
virtual QgsCoordinateReferenceSystem sourceCrs() const =0
Returns the coordinate reference system for features in the source.
SpatialIndexPresence
Enumeration of spatial index presence states.
virtual QgsWkbTypes::Type wkbType() const =0
Returns the geometry type for features returned by this source.
virtual FeatureAvailability hasFeatures() const
Determines if there are any features available in the source.
FeatureAvailability
Possible return value for 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.
virtual QVariant minimumValue(int fieldIndex) const
Returns the minimum value for an attribute column or an invalid variant in case of error.
virtual QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const =0
Returns an iterator for the features in the source.
virtual long featureCount() const =0
Returns the number of features contained in the source, or -1 if the feature count is unknown.
virtual QString sourceName() const =0
Returns a friendly display name for the source.
virtual QVariant maximumValue(int fieldIndex) const
Returns the maximum value for an attribute column or an invalid variant in case of error.
virtual QgsFeatureIds allFeatureIds() const
Returns a list of all feature IDs for features present in the source.
virtual SpatialIndexPresence hasSpatialIndex() const
Returns an enum value representing the presence of a valid spatial index on the source,...
virtual QgsRectangle sourceExtent() const
Returns the extent of all geometries from the source.
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
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, FieldOrigin origin=OriginProvider, int originIndex=-1)
Appends a field. The field must have unique name, otherwise it is rejected (returns false)
int count() const
Returns number of items.
QgsField at(int i) const
Gets field at particular index (must be in range 0..N-1)
int lookupField(const QString &fieldName) const
Looks up field's index from the field name.
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, QgsWkbTypes::Type geometryType=QgsWkbTypes::NoGeometry, const QgsCoordinateReferenceSystem &crs=QgsCoordinateReferenceSystem())
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.
A class to represent a 2D point.
Abstract base class for processing algorithms.
QgsProcessingOutputDefinitions outputDefinitions() const
Returns an ordered list of output definitions utilized by the algorithm.
QgsProcessingParameterDefinitions parameterDefinitions() const
Returns an ordered list of parameter definitions utilized by the algorithm.
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.
QgsMapLayerStore * temporaryLayerStore()
Returns a reference to the layer store used for storing temporary layers during algorithm execution.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context.
QgsExpressionContext & expressionContext()
Returns the expression context.
QgsProject * project() const
Returns the project in which the algorithm is being executed.
QgsProcessingFeedback * feedback()
Returns the associated feedback object.
Custom exception class for processing related exceptions.
QgsProxyFeatureSink subclass which reports feature addition errors to a QgsProcessingContext.
~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.
Flags flags
Flags which dictate source behavior.
bool selectedFeaturesOnly
true if only selected features in the source should be used by algorithms.
QgsFeatureRequest::InvalidGeometryCheck geometryCheck
Geometry check method to apply to this source.
QgsProperty source
Source definition.
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...
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.
QgsFeatureSource::FeatureAvailability hasFeatures() const override
Determines if there are any features available in the source.
QVariant maximumValue(int fieldIndex) const override
Returns the maximum value for an attribute column or an invalid variant in case of error.
long featureCount() const override
Returns the number of features contained in the source, or -1 if the feature count is unknown.
~QgsProcessingFeatureSource() override
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request, Flags flags) const
Returns an iterator for the features in the source, respecting the supplied feature flags.
QgsCoordinateReferenceSystem sourceCrs() const override
Returns the coordinate reference system for features in the source.
QVariant minimumValue(int fieldIndex) const override
Returns the minimum value for an attribute column or an invalid variant in case of error.
QgsWkbTypes::Type wkbType() const override
Returns the geometry type for features returned by this source.
@ FlagSkipGeometryValidityChecks
Invalid geometry checks should always be skipped. This flag can be useful for algorithms which always...
QString sourceName() const override
Returns a friendly display name for the source.
SpatialIndexPresence hasSpatialIndex() const override
Returns an enum value representing the presence of a valid spatial index on the source,...
QgsFeatureIds allFeatureIds() const override
Returns a list of all feature IDs for features present in the source.
QgsProcessingFeatureSource(QgsFeatureSource *originalSource, const QgsProcessingContext &context, bool ownsOriginalSource=false, long long featureLimit=-1)
Constructor for QgsProcessingFeatureSource, accepting an original feature source originalSource and p...
QgsFields fields() const override
Returns the fields associated with features in the source.
void setInvalidGeometryCheck(QgsFeatureRequest::InvalidGeometryCheck method)
Overrides the default geometry check method for 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 QString convertToCompatibleFormat(const QgsVectorLayer *layer, bool selectedFeaturesOnly, const QString &baseName, const QStringList &compatibleFormats, const QString &preferredFormat, QgsProcessingContext &context, QgsProcessingFeedback *feedback, long long featureLimit=-1)
Converts a source vector layer to a file path of a vector layer of compatible format.
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 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 QgsFeatureSink * createFeatureSink(QString &destination, QgsProcessingContext &context, const QgsFields &fields, QgsWkbTypes::Type 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 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()
static QString tempFolder()
Returns a session specific processing temporary folder for use in processing algorithms.
LayerHint
Layer type hints.
@ Vector
Vector layer type.
@ Mesh
Mesh layer type, since QGIS 3.6.
@ Raster
Raster layer type.
@ UnknownType
Unknown layer type.
static QString generateTempFilename(const QString &basename)
Returns a temporary filename for a given file, putting it into a temporary folder (creating that fold...
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 void createFeatureSinkPython(QgsFeatureSink **sink, QString &destination, QgsProcessingContext &context, const QgsFields &fields, QgsWkbTypes::Type geometryType, const QgsCoordinateReferenceSystem &crs, const QVariantMap &createOptions=QVariantMap()) SIP_THROW(QgsProcessingException)
Creates a feature sink ready for adding features.
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)
Converts a source vector layer to a file path and layer name of a vector layer of compatible format.
static QgsRectangle combineLayerExtents(const QList< QgsMapLayer * > &layers, const QgsCoordinateReferenceSystem &crs, QgsProcessingContext &context)
Combines the extent of several map layers.
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 QgsMapLayer * mapLayerFromString(const QString &string, QgsProcessingContext &context, bool allowLoadingNewLayers=true, QgsProcessingUtils::LayerHint typeHint=QgsProcessingUtils::LayerHint::UnknownType)
Interprets a string as a map layer within the supplied context.
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 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 defaultRasterExtension()
Returns the default raster extension to use, in the absence of all other constraints (e....
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 const QString TEMPORARY_OUTPUT
Constant used to indicate that a Processing algorithm output should be a temporary layer/file.
@ TypeVectorLine
Vector line layers.
@ TypeVectorPolygon
Vector polygon layers.
@ TypeVector
Tables (i.e. vector layers with or without geometry). When used for a sink this indicates the sink ha...
@ TypeVectorPoint
Vector point layers.
@ TypeVectorAnyGeometry
Any vector layer with geometry.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
QVector< T > layers() const
Returns a list of registered map layers with a specified layer type.
QgsCoordinateReferenceSystem crs
A store for object properties.
@ StaticProperty
Static property (QgsStaticProperty)
QString asExpression() const
Returns an expression string representing the state of the property, or an empty string if the proper...
QVariant value(const QgsExpressionContext &context, const QVariant &defaultValue=QVariant(), bool *ok=nullptr) const
Calculates the current value of the property, including any transforms which are set for the property...
Type propertyType() const
Returns the property type.
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.
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.
A simple feature sink which proxies feature addition on to another feature sink.
bool addFeature(QgsFeature &feature, QgsFeatureSink::Flags flags=QgsFeatureSink::Flags()) override
Adds a single feature to the sink.
QString lastError() const override
Returns the most recent error encountered by the sink, e.g.
QgsFeatureSink * destinationSink()
Returns the destination QgsFeatureSink which the proxy will forward features to.
bool addFeatures(QgsFeatureList &features, QgsFeatureSink::Flags flags=QgsFeatureSink::Flags()) override
Adds a list of features to the 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.
double yMaximum() const SIP_HOLDGIL
Returns the y maximum value (top side of rectangle).
double xMaximum() const SIP_HOLDGIL
Returns the x maximum value (right side of rectangle).
double xMinimum() const SIP_HOLDGIL
Returns the x minimum value (left side of rectangle).
double yMinimum() const SIP_HOLDGIL
Returns the y minimum value (bottom side of rectangle).
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(QgsWkbTypes::Type type)
Sets the WKB geometry type for the destination.
void setDestinationFields(const QgsFields &fields)
Sets the fields for the destination sink.
This class is a composition of two QSettings instances:
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
Options to pass to 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.
QgsVectorFileWriter::SymbologyExport symbologyExport
Symbology to export.
QgsVectorFileWriter::ActionOnExistingFile actionOnExistingFile
Action on existing file.
QStringList datasourceOptions
List of OGR data source creation options.
static QgsVectorFileWriter * create(const QString &fileName, const QgsFields &fields, QgsWkbTypes::Type 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 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 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 data sets.
Q_INVOKABLE QgsWkbTypes::Type wkbType() const FINAL
Returns the WKBType or WKBUnknown in case of error.
Q_INVOKABLE QgsWkbTypes::GeometryType geometryType() const
Returns point, line or polygon.
bool isSpatial() const FINAL
Returns true if this is a geometry layer and false in case of NoGeometry (table only) or UnknownGeome...
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const FINAL
Queries the layer for features specified in request.
QgsFields fields() const FINAL
Returns the list of fields of this layer.
QgsFeatureIterator getSelectedFeatures(QgsFeatureRequest request=QgsFeatureRequest()) const
Returns an iterator of the selected features.
QgsRectangle extent() const FINAL
Returns the extent of the layer.
Implements a map layer that is dedicated to rendering of vector tiles.
Handles storage of information regarding WKB types and their properties.
Type
The WKB type describes the number of dimensions a geometry has.
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
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
QList< QgsFeature > QgsFeatureList
QSet< QgsFeatureId > QgsFeatureIds
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 QgsCoordinateReferenceSystem & crs
Setting options for loading mesh layers.
bool skipCrsValidation
Controls whether the layer is allowed to have an invalid/unknown CRS.
Setting options for loading raster layers.
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.
Setting options for loading vector layers.