34using namespace Qt::StringLiterals;
39static QgsFields createFields(
const QList<QgsMeshDatasetGroupMetadata> &groupMetadataList,
int vectorOption )
44 if ( meta.isVector() )
46 if ( vectorOption == 0 || vectorOption == 2 )
48 fields.
append(
QgsField( u
"%1_x"_s.arg( meta.name() ), QMetaType::Type::Double ) );
49 fields.
append(
QgsField( u
"%1_y"_s.arg( meta.name() ), QMetaType::Type::Double ) );
52 if ( vectorOption == 1 || vectorOption == 2 )
54 fields.
append(
QgsField( u
"%1_mag"_s.arg( meta.name() ), QMetaType::Type::Double ) );
55 fields.
append(
QgsField( u
"%1_dir"_s.arg( meta.name() ), QMetaType::Type::Double ) );
66 QVector<double> ret( exportOption == 2 ? 4 : 2 );
68 if ( exportOption == 0 || exportOption == 2 )
73 if ( exportOption == 1 || exportOption == 2 )
77 double magnitude = sqrt( x * x + y * y );
78 double direction = ( asin( x / magnitude ) ) / M_PI * 180;
80 direction = 180 - direction;
82 if ( exportOption == 1 )
87 if ( exportOption == 2 )
100 QVector<double> vectorValues = vectorValue( value, vectorOption );
101 for (
double v : vectorValues )
103 if ( v == std::numeric_limits<double>::quiet_NaN() )
104 attributes.append( QVariant() );
106 attributes.append( v );
111 if ( value.
scalar() == std::numeric_limits<double>::quiet_NaN() )
112 attributes.append( QVariant() );
114 attributes.append( value.
scalar() );
121 int triangularFaceIndex,
128 bool faceActive = activeFaces.
active( nativeFaceIndex );
140 value = datasetValues.
value( nativeFaceIndex );
147 const int v1 = face[0], v2 = face[1], v3 = face[2];
152 const double x = QgsMeshLayerUtils::interpolateFromVerticesData( p1, p2, p3, val1.
x(), val2.
x(), val3.
x(), point );
153 double y = std::numeric_limits<double>::quiet_NaN();
154 bool isVector = metadata.
isVector();
156 y = QgsMeshLayerUtils::interpolateFromVerticesData( p1, p2, p3, val1.
y(), val2.
y(), val3.
y(), point );
167QString QgsExportMeshOnElement::group()
const
169 return QObject::tr(
"Mesh" );
172QString QgsExportMeshOnElement::groupId()
const
177QString QgsExportMeshVerticesAlgorithm::shortHelpString()
const
179 return QObject::tr(
"This algorithm exports a mesh layer's vertices to a point vector layer, with the dataset values on vertices as attribute values." );
182QString QgsExportMeshVerticesAlgorithm::shortDescription()
const
184 return QObject::tr(
"Exports mesh vertices to a point vector layer." );
187QString QgsExportMeshVerticesAlgorithm::name()
const
189 return u
"exportmeshvertices"_s;
192QString QgsExportMeshVerticesAlgorithm::displayName()
const
194 return QObject::tr(
"Export mesh vertices" );
199 return new QgsExportMeshVerticesAlgorithm();
202QgsGeometry QgsExportMeshVerticesAlgorithm::meshElement(
int index )
const
204 QGS_MARK_ALGORITHM_SOURCE
209void QgsExportMeshOnElement::initAlgorithm(
const QVariantMap &configuration )
211 Q_UNUSED( configuration );
220 addParameter(
new QgsProcessingParameterCrs( u
"CRS_OUTPUT"_s, QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
222 QStringList exportVectorOptions;
223 exportVectorOptions << QObject::tr(
"Cartesian (x,y)" ) << QObject::tr(
"Polar (magnitude,degree)" ) << QObject::tr(
"Cartesian and Polar" );
224 addParameter(
new QgsProcessingParameterEnum( u
"VECTOR_OPTION"_s, QObject::tr(
"Export vector option" ), exportVectorOptions,
false, 0 ) );
234 if ( timeType ==
"dataset-time-step"_L1 )
239 else if ( timeType ==
"defined-date-time"_L1 )
242 if ( dateTime.isValid() )
243 relativeTime =
QgsInterval( layerReferenceTime.secsTo( dateTime ) );
245 else if ( timeType ==
"current-context-time"_L1 )
248 if ( dateTime.isValid() )
249 relativeTime =
QgsInterval( layerReferenceTime.secsTo( dateTime ) );
258 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
260 if ( !meshLayer || !meshLayer->
isValid() )
268 outputCrs = meshLayer->
crs();
283 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
284 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
286 switch ( meshElementType() )
289 mElementCount = mNativeMesh.faceCount();
292 mElementCount = mNativeMesh.vertexCount();
295 mElementCount = mNativeMesh.edgeCount();
299 for (
int i = 0; i < datasetGroups.count(); ++i )
301 int groupIndex = datasetGroups.at( i );
306 if ( supportedDataType().contains( dataGroup.metadata.dataType() ) )
308 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, mElementCount );
309 mDataPerGroup.append( dataGroup );
312 feedback->
setProgress( 100 * i / datasetGroups.count() );
315 mExportVectorOption = parameterAsInt( parameters, u
"VECTOR_OPTION"_s, context );
322 QGS_MARK_ALGORITHM_SOURCE
327 return QVariantMap();
329 feedback->
setProgressText( QObject::tr(
"Creating output vector layer" ) );
332 QList<QgsMeshDatasetGroupMetadata> metaList;
333 metaList.reserve( mDataPerGroup.size() );
334 for (
const DataGroup &dataGroup : std::as_const( mDataPerGroup ) )
335 metaList.append( dataGroup.metadata );
336 QgsFields fields = createFields( metaList, mExportVectorOption );
340 std::unique_ptr<QgsFeatureSink> sink( parameterAsSink( parameters, u
"OUTPUT"_s, context, identifier, fields, sinkGeometryType(), outputCrs ) );
342 return QVariantMap();
347 return QVariantMap();
349 feedback->
setProgressText( QObject::tr(
"Creating points for each vertices" ) );
352 for (
int i = 0; i < mElementCount; ++i )
355 for (
const DataGroup &dataGroup : std::as_const( mDataPerGroup ) )
358 addAttributes( value, attributes, dataGroup.metadata.isVector(), mExportVectorOption );
369 geom = meshElement( i );
371 feedback->
reportError( QObject::tr(
"Could not transform point to destination CRS" ) );
384 return QVariantMap();
393 ret[u
"OUTPUT"_s] = identifier;
398QString QgsExportMeshFacesAlgorithm::shortHelpString()
const
400 return QObject::tr(
"This algorithm exports a mesh layer's faces to a polygon vector layer, with the dataset values on faces as attribute values." );
403QString QgsExportMeshFacesAlgorithm::shortDescription()
const
405 return QObject::tr(
"Exports mesh faces to a polygon vector layer." );
408QString QgsExportMeshFacesAlgorithm::name()
const
410 return u
"exportmeshfaces"_s;
413QString QgsExportMeshFacesAlgorithm::displayName()
const
415 return QObject::tr(
"Export mesh faces" );
420 return new QgsExportMeshFacesAlgorithm();
423QgsGeometry QgsExportMeshFacesAlgorithm::meshElement(
int index )
const
425 QGS_MARK_ALGORITHM_SOURCE
427 const QgsMeshFace &face = mNativeMesh.face( index );
428 QVector<QgsPoint> vertices( face.size() );
429 for (
int i = 0; i < face.size(); ++i )
430 vertices[i] = mNativeMesh.vertex( face.at( i ) );
431 auto polygon = std::make_unique<QgsPolygon>();
436QString QgsExportMeshEdgesAlgorithm::shortHelpString()
const
438 return QObject::tr(
"This algorithm exports a mesh layer's edges to a line vector layer, with the dataset values on edges as attribute values." );
441QString QgsExportMeshEdgesAlgorithm::shortDescription()
const
443 return QObject::tr(
"Exports mesh edges to a line vector layer." );
446QString QgsExportMeshEdgesAlgorithm::name()
const
448 return u
"exportmeshedges"_s;
451QString QgsExportMeshEdgesAlgorithm::displayName()
const
453 return QObject::tr(
"Export mesh edges" );
458 return new QgsExportMeshEdgesAlgorithm();
461QgsGeometry QgsExportMeshEdgesAlgorithm::meshElement(
int index )
const
463 QGS_MARK_ALGORITHM_SOURCE
465 const QgsMeshEdge &edge = mNativeMesh.edge( index );
466 QVector<QgsPoint> vertices( 2 );
467 vertices[0] = mNativeMesh.vertex( edge.first );
468 vertices[1] = mNativeMesh.vertex( edge.second );
473QString QgsExportMeshOnGridAlgorithm::name()
const
475 return u
"exportmeshongrid"_s;
478QString QgsExportMeshOnGridAlgorithm::displayName()
const
480 return QObject::tr(
"Export mesh on grid" );
483QString QgsExportMeshOnGridAlgorithm::group()
const
485 return QObject::tr(
"Mesh" );
488QString QgsExportMeshOnGridAlgorithm::groupId()
const
493QString QgsExportMeshOnGridAlgorithm::shortHelpString()
const
496 "This algorithm exports a mesh layer's dataset values to a gridded point vector layer, with the dataset values on each point as attribute values.\n"
497 "For data on volume (3D stacked dataset values), the exported dataset values are averaged on faces using the method defined in the mesh layer properties (default is Multi level averaging "
499 "1D meshes are not supported."
503QString QgsExportMeshOnGridAlgorithm::shortDescription()
const
505 return QObject::tr(
"Exports mesh dataset values to a gridded point vector layer." );
510 return new QgsExportMeshOnGridAlgorithm();
513void QgsExportMeshOnGridAlgorithm::initAlgorithm(
const QVariantMap &configuration )
515 Q_UNUSED( configuration );
527 addParameter(
new QgsProcessingParameterCrs( u
"CRS_OUTPUT"_s, QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
529 QStringList exportVectorOptions;
530 exportVectorOptions << QObject::tr(
"Cartesian (x,y)" ) << QObject::tr(
"Polar (magnitude,degree)" ) << QObject::tr(
"Cartesian and Polar" );
531 addParameter(
new QgsProcessingParameterEnum( u
"VECTOR_OPTION"_s, QObject::tr(
"Export vector option" ), exportVectorOptions,
false, 0 ) );
535static void extractDatasetValues(
536 const QList<int> &datasetGroups,
540 const QSet<int> supportedDataType,
541 QList<DataGroup> &datasetPerGroup,
545 for (
int i = 0; i < datasetGroups.count(); ++i )
547 int groupIndex = datasetGroups.at( i );
552 if ( supportedDataType.contains( dataGroup.metadata.dataType() ) )
555 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, valueCount );
559 dataGroup.dataset3dStakedValue = meshLayer->
dataset3dValues( datasetIndex, 0, valueCount );
561 datasetPerGroup.append( dataGroup );
564 feedback->
setProgress( 100 * i / datasetGroups.count() );
570 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
572 if ( !meshLayer || !meshLayer->
isValid() )
577 outputCrs = meshLayer->
crs();
592 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
593 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
595 extractDatasetValues( datasetGroups, meshLayer, nativeMesh, relativeTime, supportedDataType(), mDataPerGroup, feedback );
596 mTriangularMesh.update( meshLayer->
nativeMesh(), mTransform );
598 mExportVectorOption = parameterAsInt( parameters, u
"VECTOR_OPTION"_s, context );
605 QGS_MARK_ALGORITHM_SOURCE
610 return QVariantMap();
612 feedback->
setProgressText( QObject::tr(
"Creating output vector layer" ) );
617 for ( DataGroup &dataGroup : mDataPerGroup )
619 if ( dataGroup.dataset3dStakedValue.isValid() )
620 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
623 QList<QgsMeshDatasetGroupMetadata> metaList;
624 metaList.reserve( mDataPerGroup.size() );
625 for (
const DataGroup &dataGroup : std::as_const( mDataPerGroup ) )
626 metaList.append( dataGroup.metadata );
627 QgsFields fields = createFields( metaList, mExportVectorOption );
632 std::unique_ptr<QgsFeatureSink> sink( parameterAsSink( parameters, u
"OUTPUT"_s, context, identifier, fields,
Qgis::WkbType::Point, outputCrs ) );
634 return QVariantMap();
639 return QVariantMap();
645 const double gridSpacing = parameterAsDouble( parameters, u
"GRID_SPACING"_s, context );
651 QgsRectangle extent = parameterAsExtent( parameters, u
"EXTENT"_s, context );
653 extent = mTriangularMesh.extent();
654 int pointXCount = int( extent.
width() / gridSpacing ) + 1;
655 int pointYCount = int( extent.
height() / gridSpacing ) + 1;
657 for (
int ix = 0; ix < pointXCount; ++ix )
659 for (
int iy = 0; iy < pointYCount; ++iy )
662 int triangularFaceIndex = mTriangularMesh.faceIndexForPoint_v2( point );
663 if ( triangularFaceIndex >= 0 )
667 int nativeFaceIndex = mTriangularMesh.trianglesToNativeFaces().at( triangularFaceIndex );
668 for (
int i = 0; i < mDataPerGroup.count(); ++i )
670 const DataGroup &dataGroup = mDataPerGroup.at( i );
671 bool faceActive = dataGroup.activeFaces.active( nativeFaceIndex );
674 QgsMeshDatasetValue value = extractDatasetValue( point, nativeFaceIndex, triangularFaceIndex, mTriangularMesh, dataGroup.activeFaces, dataGroup.datasetValues, dataGroup.metadata );
676 if ( dataGroup.metadata.isVector() )
678 QVector<double> vector = vectorValue( dataGroup.datasetValues.value( i ), mExportVectorOption );
679 for (
double v : vector )
681 attributes.append( v );
685 attributes.append( value.
scalar() );
696 feedback->
reportError( QObject::tr(
"Could not transform point to destination CRS" ) );
717 ret[u
"OUTPUT"_s] = identifier;
722QSet<int> QgsExportMeshOnGridAlgorithm::supportedDataType()
727QString QgsMeshRasterizeAlgorithm::name()
const
729 return u
"meshrasterize"_s;
732QString QgsMeshRasterizeAlgorithm::displayName()
const
734 return QObject::tr(
"Rasterize mesh dataset" );
737QString QgsMeshRasterizeAlgorithm::group()
const
739 return QObject::tr(
"Mesh" );
742QString QgsMeshRasterizeAlgorithm::groupId()
const
747QString QgsMeshRasterizeAlgorithm::shortHelpString()
const
750 "This algorithm creates a raster layer from a mesh dataset.\n"
751 "For data on volume (3D stacked dataset values), the exported dataset values are averaged on faces using the method defined in the mesh layer properties (default is Multi level averaging "
753 "1D meshes are not supported."
757QString QgsMeshRasterizeAlgorithm::shortDescription()
const
759 return QObject::tr(
"Creates a raster layer from a mesh dataset." );
764 return new QgsMeshRasterizeAlgorithm();
767void QgsMeshRasterizeAlgorithm::initAlgorithm(
const QVariantMap &configuration )
769 Q_UNUSED( configuration );
779 addParameter(
new QgsProcessingParameterCrs( u
"CRS_OUTPUT"_s, QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
783 auto createOptsParam = std::make_unique<QgsProcessingParameterString>( u
"CREATE_OPTIONS"_s, QObject::tr(
"Creation options" ), QVariant(),
false,
true );
784 createOptsParam->setMetadata( QVariantMap( { { u
"widget_wrapper"_s, QVariantMap( { { u
"widget_type"_s, u
"rasteroptions"_s } } ) } } ) );
786 addParameter( createOptsParam.release() );
788 auto creationOptsParam = std::make_unique<QgsProcessingParameterString>( u
"CREATION_OPTIONS"_s, QObject::tr(
"Creation options" ), QVariant(),
false,
true );
789 creationOptsParam->setMetadata( QVariantMap( { { u
"widget_wrapper"_s, QVariantMap( { { u
"widget_type"_s, u
"rasteroptions"_s } } ) } } ) );
791 addParameter( creationOptsParam.release() );
798 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
800 if ( !meshLayer || !meshLayer->
isValid() )
805 outputCrs = meshLayer->
crs();
810 mTriangularMesh.update( meshLayer->
nativeMesh(), mTransform );
820 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
821 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
823 extractDatasetValues( datasetGroups, meshLayer, *meshLayer->
nativeMesh(), relativeTime, supportedDataType(), mDataPerGroup, feedback );
832 QGS_MARK_ALGORITHM_SOURCE
837 return QVariantMap();
844 for ( DataGroup &dataGroup : mDataPerGroup )
846 if ( dataGroup.dataset3dStakedValue.isValid() )
847 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue, feedback );
854 const double pixelSize = parameterAsDouble( parameters, u
"PIXEL_SIZE"_s, context );
860 QgsRectangle extent = parameterAsExtent( parameters, u
"EXTENT"_s, context );
862 extent = mTriangularMesh.extent();
864 int width = extent.
width() / pixelSize;
865 int height = extent.
height() / pixelSize;
867 QString creationOptions = parameterAsString( parameters, u
"CREATION_OPTIONS"_s, context ).trimmed();
869 const QString optionsString = parameterAsString( parameters, u
"CREATE_OPTIONS"_s, context );
870 if ( !optionsString.isEmpty() )
871 creationOptions = optionsString;
873 const QString fileName = parameterAsOutputLayer( parameters, u
"OUTPUT"_s, context );
874 const QString outputFormat = parameterAsOutputRasterFormat( parameters, u
"OUTPUT"_s, context );
876 rasterFileWriter.setOutputProviderKey( u
"gdal"_s );
877 if ( !creationOptions.isEmpty() )
879 rasterFileWriter.setCreationOptions( creationOptions.split(
'|' ) );
881 rasterFileWriter.setOutputFormat( outputFormat );
883 std::unique_ptr<QgsRasterDataProvider> rasterDataProvider( rasterFileWriter.createMultiBandRaster(
Qgis::DataType::Float64, width, height, extent, mTransform.destinationCrs(), mDataPerGroup.count() ) );
884 if ( !rasterDataProvider )
886 if ( !rasterDataProvider->isEditable() && !rasterDataProvider->setEditable(
true ) )
887 throw QgsProcessingException( QObject::tr(
"Could not create raster output: %1" ).arg( rasterDataProvider->error().summary() ) );
889 const bool hasReportsDuringClose = rasterDataProvider->hasReportsDuringClose();
890 const double maxProgressDuringBlockWriting = hasReportsDuringClose ? 50.0 : 100.0;
892 for (
int i = 0; i < mDataPerGroup.count(); ++i )
894 const DataGroup &dataGroup = mDataPerGroup.at( i );
899 if ( dataGroup.datasetValues.isValid() )
901 std::unique_ptr<QgsRasterBlock> block(
902 QgsMeshUtils::exportRasterBlock( mTriangularMesh, dataGroup.datasetValues, dataGroup.activeFaces, dataGroup.metadata.dataType(), mTransform, pixelSize, extent, &rasterBlockFeedBack )
908 if ( !rasterDataProvider->writeBlock( block.get(), i + 1 ) )
910 throw QgsProcessingException( QObject::tr(
"Could not write raster block: %1" ).arg( rasterDataProvider->error().summary() ) );
912 rasterDataProvider->setNoDataValue( i + 1, block->noDataValue() );
915 rasterDataProvider->setNoDataValue( i + 1, std::numeric_limits<double>::quiet_NaN() );
920 return QVariantMap();
921 feedback->
setProgress( maxProgressDuringBlockWriting * i / mDataPerGroup.count() );
925 rasterDataProvider->setEditable(
false );
928 feedback->
setProgress( maxProgressDuringBlockWriting );
930 if ( feedback && hasReportsDuringClose )
933 if ( !rasterDataProvider->closeWithProgress( scaledFeedback.get() ) )
942 ret[u
"OUTPUT"_s] = fileName;
947QSet<int> QgsMeshRasterizeAlgorithm::supportedDataType()
952QString QgsMeshContoursAlgorithm::name()
const
954 return u
"meshcontours"_s;
957QString QgsMeshContoursAlgorithm::displayName()
const
959 return QObject::tr(
"Export contours" );
962QString QgsMeshContoursAlgorithm::group()
const
964 return QObject::tr(
"Mesh" );
967QString QgsMeshContoursAlgorithm::groupId()
const
972QString QgsMeshContoursAlgorithm::shortHelpString()
const
974 return QObject::tr(
"This algorithm creates contours as a vector layer from a mesh scalar dataset." );
977QString QgsMeshContoursAlgorithm::shortDescription()
const
979 return QObject::tr(
"Creates contours as vector layer from mesh scalar dataset." );
984 return new QgsMeshContoursAlgorithm();
987void QgsMeshContoursAlgorithm::initAlgorithm(
const QVariantMap &configuration )
989 Q_UNUSED( configuration );
1002 auto contourLevelList = std::make_unique<QgsProcessingParameterString>( u
"CONTOUR_LEVEL_LIST"_s, QObject::tr(
"List of contours level" ), QVariant(),
false,
true );
1003 contourLevelList->setHelp( QObject::tr(
"Comma separated list of values to export. If filled, the increment, minimum and maximum settings are ignored." ) );
1004 addParameter( contourLevelList.release() );
1006 addParameter(
new QgsProcessingParameterCrs( u
"CRS_OUTPUT"_s, QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
1015 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
1017 if ( !meshLayer || !meshLayer->
isValid() )
1022 outputCrs = meshLayer->
crs();
1027 mTriangularMesh.update( meshLayer->
nativeMesh(), mTransform );
1033 QString levelsString = parameterAsString( parameters, u
"CONTOUR_LEVEL_LIST"_s, context );
1034 if ( !levelsString.isEmpty() )
1036 QStringList levelStringList = levelsString.split(
',' );
1037 if ( !levelStringList.isEmpty() )
1039 for (
const QString &stringVal : levelStringList )
1042 double val = stringVal.toDouble( &ok );
1044 mLevels.append( val );
1046 throw QgsProcessingException( QObject::tr(
"Invalid format for level values, must be numbers separated with comma" ) );
1048 if ( mLevels.count() >= 2 )
1049 if ( mLevels.last() <= mLevels.at( mLevels.count() - 2 ) )
1050 throw QgsProcessingException( QObject::tr(
"Invalid format for level values, must be different numbers and in increasing order" ) );
1055 if ( mLevels.isEmpty() )
1057 double minimum = parameterAsDouble( parameters, u
"MINIMUM"_s, context );
1058 double maximum = parameterAsDouble( parameters, u
"MAXIMUM"_s, context );
1059 double interval = parameterAsDouble( parameters, u
"INCREMENT"_s, context );
1061 if ( interval <= 0 )
1064 if ( minimum >= maximum )
1065 throw QgsProcessingException( QObject::tr(
"Invalid minimum and maximum values, minimum must be lesser than maximum" ) );
1067 if ( interval > ( maximum - minimum ) )
1068 throw QgsProcessingException( QObject::tr(
"Invalid minimum, maximum and interval values, difference between minimum and maximum must be greater or equal than interval" ) );
1070 int intervalCount = ( maximum - minimum ) / interval;
1072 mLevels.reserve( intervalCount );
1073 for (
int i = 0; i < intervalCount; ++i )
1075 mLevels.append( minimum + i * interval );
1088 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
1089 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
1093 extractDatasetValues( datasetGroups, meshLayer, mNativeMesh, relativeTime, supportedDataType(), mDataPerGroup, feedback );
1102 QGS_MARK_ALGORITHM_SOURCE
1106 for ( DataGroup &dataGroup : mDataPerGroup )
1108 if ( dataGroup.dataset3dStakedValue.isValid() )
1109 dataGroup.datasetValues = avgMethod->calculate( dataGroup.dataset3dStakedValue );
1115 polygonFields.
append(
QgsField( QObject::tr(
"group" ), QMetaType::Type::QString ) );
1116 polygonFields.
append(
QgsField( QObject::tr(
"time" ), QMetaType::Type::QString ) );
1117 polygonFields.
append(
QgsField( QObject::tr(
"min_value" ), QMetaType::Type::Double ) );
1118 polygonFields.
append(
QgsField( QObject::tr(
"max_value" ), QMetaType::Type::Double ) );
1119 lineFields.
append(
QgsField( QObject::tr(
"group" ), QMetaType::Type::QString ) );
1120 lineFields.
append(
QgsField( QObject::tr(
"time" ), QMetaType::Type::QString ) );
1121 lineFields.
append(
QgsField( QObject::tr(
"value" ), QMetaType::Type::Double ) );
1125 QString lineIdentifier;
1126 QString polygonIdentifier;
1127 std::unique_ptr<QgsFeatureSink> sinkPolygons( parameterAsSink( parameters, u
"OUTPUT_POLYGONS"_s, context, polygonIdentifier, polygonFields,
Qgis::WkbType::PolygonZ, outputCrs ) );
1128 std::unique_ptr<QgsFeatureSink> sinkLines( parameterAsSink( parameters, u
"OUTPUT_LINES"_s, context, lineIdentifier, lineFields,
Qgis::WkbType::LineStringZ, outputCrs ) );
1130 if ( !sinkLines || !sinkPolygons )
1131 return QVariantMap();
1134 for (
int i = 0; i < mDataPerGroup.count(); ++i )
1136 DataGroup dataGroup = mDataPerGroup.at( i );
1138 int count = scalarDataOnVertices ? mNativeMesh.vertices.count() : mNativeMesh.faces.count();
1140 QVector<double> values;
1141 if ( dataGroup.datasetValues.isValid() )
1144 values = QgsMeshLayerUtils::calculateMagnitudes( dataGroup.datasetValues );
1148 values = QVector<double>( count, std::numeric_limits<double>::quiet_NaN() );
1151 if ( ( !scalarDataOnVertices ) )
1156 QgsMeshContours contoursExported( mTriangularMesh, mNativeMesh, values, dataGroup.activeFaces );
1159 firstAttributes.append( dataGroup.metadata.name() );
1160 firstAttributes.append( mDateTimeString );
1162 for (
double level : std::as_const( mLevels ) )
1164 QgsGeometry line = contoursExported.exportLines( level, feedback );
1166 return QVariantMap();
1170 lineAttributes.append( level );
1182 for (
int l = 0; l < mLevels.count() - 1; ++l )
1184 QgsGeometry polygon = contoursExported.exportPolygons( mLevels.at( l ), mLevels.at( l + 1 ), feedback );
1186 return QVariantMap();
1191 polygonAttributes.append( mLevels.at( l ) );
1192 polygonAttributes.append( mLevels.at( l + 1 ) );
1197 if ( !sinkPolygons->addFeature( polygonFeature ) )
1209 feedback->
setProgress( 100 * i / mDataPerGroup.count() );
1215 sinkPolygons->finalize();
1220 sinkLines->finalize();
1225 ret[u
"OUTPUT_LINES"_s] = lineIdentifier;
1226 ret[u
"OUTPUT_POLYGONS"_s] = polygonIdentifier;
1231QString QgsMeshExportCrossSection::name()
const
1233 return u
"meshexportcrosssection"_s;
1236QString QgsMeshExportCrossSection::displayName()
const
1238 return QObject::tr(
"Export cross section dataset values on lines from mesh" );
1241QString QgsMeshExportCrossSection::group()
const
1243 return QObject::tr(
"Mesh" );
1246QString QgsMeshExportCrossSection::groupId()
const
1251QString QgsMeshExportCrossSection::shortHelpString()
const
1254 "This algorithm extracts mesh's dataset values from line contained in a vector layer.\n"
1255 "Each line is discretized with a resolution distance parameter for extraction of values on its vertices."
1259QString QgsMeshExportCrossSection::shortDescription()
const
1261 return QObject::tr(
"Extracts a mesh dataset's values from lines contained in a vector layer." );
1266 return new QgsMeshExportCrossSection();
1269void QgsMeshExportCrossSection::initAlgorithm(
const QVariantMap &configuration )
1271 Q_UNUSED( configuration );
1279 QList<int> datatype;
1283 addParameter(
new QgsProcessingParameterDistance( u
"RESOLUTION"_s, QObject::tr(
"Line segmentation resolution" ), 10.0, u
"INPUT_LINES"_s,
false, 0 ) );
1294 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
1296 if ( !meshLayer || !meshLayer->
isValid() )
1299 mMeshLayerCrs = meshLayer->
crs();
1300 mTriangularMesh.update( meshLayer->
nativeMesh() );
1309 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
1310 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
1312 extractDatasetValues( datasetGroups, meshLayer, *meshLayer->
nativeMesh(), relativeTime, supportedDataType(), mDataPerGroup, feedback );
1321 QGS_MARK_ALGORITHM_SOURCE
1327 for ( DataGroup &dataGroup : mDataPerGroup )
1329 if ( dataGroup.dataset3dStakedValue.isValid() )
1330 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
1332 double resolution = parameterAsDouble( parameters, u
"RESOLUTION"_s, context );
1333 int datasetDigits = parameterAsInt( parameters, u
"DATASET_DIGITS"_s, context );
1334 int coordDigits = parameterAsInt( parameters, u
"COORDINATES_DIGITS"_s, context );
1336 std::unique_ptr<QgsProcessingFeatureSource> featureSource( parameterAsSource( parameters, u
"INPUT_LINES"_s, context ) );
1337 if ( !featureSource )
1342 QString outputFileName = parameterAsFileOutput( parameters, u
"OUTPUT"_s, context );
1343 QFile file( outputFileName );
1344 if ( !file.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
1347 QTextStream textStream( &file );
1349 header << u
"fid"_s << u
"x"_s << u
"y"_s << QObject::tr(
"offset" );
1350 for (
const DataGroup &datagroup : std::as_const( mDataPerGroup ) )
1351 header << datagroup.metadata.name();
1352 textStream << header.join(
',' ) << u
"\n"_s;
1354 long long featCount = featureSource->featureCount();
1355 long long featCounter = 0;
1369 feedback->
reportError( QObject::tr(
"Could not transform line to mesh CRS" ) );
1375 while ( offset <= line.
length() )
1378 return QVariantMap();
1380 QStringList textLine;
1382 int triangularFaceIndex = mTriangularMesh.faceIndexForPoint_v2( point );
1383 textLine << QString::number( fid ) << QString::number( point.
x(),
'f', coordDigits ) << QString::number( point.
y(),
'f', coordDigits ) << QString::number( offset,
'f', coordDigits );
1384 if ( triangularFaceIndex >= 0 )
1388 int nativeFaceIndex = mTriangularMesh.trianglesToNativeFaces().at( triangularFaceIndex );
1389 for (
int i = 0; i < mDataPerGroup.count(); ++i )
1391 const DataGroup &dataGroup = mDataPerGroup.at( i );
1392 bool faceActive = dataGroup.activeFaces.active( nativeFaceIndex );
1395 QgsMeshDatasetValue value = extractDatasetValue( point, nativeFaceIndex, triangularFaceIndex, mTriangularMesh, dataGroup.activeFaces, dataGroup.datasetValues, dataGroup.metadata );
1397 if ( abs( value.
x() ) == std::numeric_limits<double>::quiet_NaN() )
1398 textLine << QString(
' ' );
1400 textLine << QString::number( value.
scalar(),
'f', datasetDigits );
1404 for (
int i = 0; i < mDataPerGroup.count(); ++i )
1405 textLine << QString(
' ' );
1407 textStream << textLine.join(
',' ) << u
"\n"_s;
1409 offset += resolution;
1414 feedback->
setProgress( 100.0 * featCounter / featCount );
1416 return QVariantMap();
1423 ret[u
"OUTPUT"_s] = outputFileName;
1427QString QgsMeshExportTimeSeries::name()
const
1429 return u
"meshexporttimeseries"_s;
1432QString QgsMeshExportTimeSeries::displayName()
const
1434 return QObject::tr(
"Export time series values from points of a mesh dataset" );
1437QString QgsMeshExportTimeSeries::group()
const
1439 return QObject::tr(
"Mesh" );
1442QString QgsMeshExportTimeSeries::groupId()
const
1447QString QgsMeshExportTimeSeries::shortHelpString()
const
1450 "This algorithm extracts mesh's dataset time series values from points contained in a vector layer.\n"
1451 "If the time step is kept to its default value (0 hours), the time step used is the one of the two first datasets of the first selected dataset group."
1455QString QgsMeshExportTimeSeries::shortDescription()
const
1457 return QObject::tr(
"Extracts a mesh dataset's time series values from points contained in a vector layer." );
1462 return new QgsMeshExportTimeSeries();
1465void QgsMeshExportTimeSeries::initAlgorithm(
const QVariantMap &configuration )
1467 Q_UNUSED( configuration );
1479 QList<int> datatype;
1492 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
1494 if ( !meshLayer || !meshLayer->
isValid() )
1497 mMeshLayerCrs = meshLayer->
crs();
1498 mTriangularMesh.update( meshLayer->
nativeMesh() );
1508 QVariant parameterStartTimeVariant = parameters.value( u
"STARTING_TIME"_s );
1509 QgsInterval relativeStartTime = datasetRelativetime( parameterStartTimeVariant, meshLayer, context );
1511 QVariant parameterEndTimeVariant = parameters.value( u
"FINISHING_TIME"_s );
1512 QgsInterval relativeEndTime = datasetRelativetime( parameterEndTimeVariant, meshLayer, context );
1515 qint64 timeStepInterval = parameterAsDouble( parameters, u
"TIME_STEP"_s, context ) * 1000 * 3600;
1516 if ( timeStepInterval == 0 )
1519 for (
int groupIndex : datasetGroups )
1532 mRelativeTimeSteps.clear();
1533 mTimeStepString.clear();
1534 if ( timeStepInterval != 0 )
1536 mRelativeTimeSteps.append( relativeStartTime.
seconds() * 1000 );
1537 while ( mRelativeTimeSteps.last() < relativeEndTime.
seconds() * 1000 )
1538 mRelativeTimeSteps.append( mRelativeTimeSteps.last() + timeStepInterval );
1540 for ( qint64 relativeTimeStep : std::as_const( mRelativeTimeSteps ) )
1542 mTimeStepString.append( meshLayer->
formatTime( relativeTimeStep / 3600.0 / 1000.0 ) );
1547 for (
int i = 0; i < datasetGroups.count(); ++i )
1549 int groupIndex = datasetGroups.at( i );
1551 if ( supportedDataType().contains( meta.
dataType() ) )
1553 mGroupIndexes.append( groupIndex );
1554 mGroupsMetadata[groupIndex] = meta;
1557 if ( !mRelativeTimeSteps.isEmpty() )
1561 for ( qint64 relativeTimeStep : std::as_const( mRelativeTimeSteps ) )
1563 QMap<int, int> &groupIndexToData = mRelativeTimeToData[relativeTimeStep];
1564 QgsInterval timeStepInterval( relativeTimeStep / 1000.0 );
1566 if ( !datasetIndex.
isValid() )
1568 if ( datasetIndex != lastDatasetIndex )
1570 DataGroup dataGroup;
1571 dataGroup.metadata = meta;
1572 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, valueCount );
1576 dataGroup.dataset3dStakedValue = meshLayer->
dataset3dValues( datasetIndex, 0, valueCount );
1578 mDatasets.append( dataGroup );
1579 lastDatasetIndex = datasetIndex;
1581 groupIndexToData[groupIndex] = mDatasets.count() - 1;
1587 QMap<int, int> &groupIndexToData = mRelativeTimeToData[0];
1589 DataGroup dataGroup;
1590 dataGroup.metadata = meta;
1591 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, valueCount );
1595 dataGroup.dataset3dStakedValue = meshLayer->
dataset3dValues( datasetIndex, 0, valueCount );
1597 mDatasets.append( dataGroup );
1598 groupIndexToData[groupIndex] = mDatasets.
count() - 1;
1603 feedback->
setProgress( 100 * i / datasetGroups.count() );
1613 QGS_MARK_ALGORITHM_SOURCE
1620 for ( DataGroup &dataGroup : mDatasets )
1622 if ( dataGroup.dataset3dStakedValue.isValid() )
1623 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
1626 int datasetDigits = parameterAsInt( parameters, u
"DATASET_DIGITS"_s, context );
1627 int coordDigits = parameterAsInt( parameters, u
"COORDINATES_DIGITS"_s, context );
1629 std::unique_ptr<QgsProcessingFeatureSource> featureSource( parameterAsSource( parameters, u
"INPUT_POINTS"_s, context ) );
1630 if ( !featureSource )
1635 QString outputFileName = parameterAsFileOutput( parameters, u
"OUTPUT"_s, context );
1636 QFile file( outputFileName );
1637 if ( !file.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
1640 QTextStream textStream( &file );
1642 header << u
"fid"_s << u
"x"_s << u
"y"_s << QObject::tr(
"time" );
1644 for (
int gi : std::as_const( mGroupIndexes ) )
1645 header << mGroupsMetadata.value( gi ).name();
1647 textStream << header.join(
',' ) << u
"\n"_s;
1649 long long featCount = featureSource->featureCount();
1650 long long featCounter = 0;
1664 feedback->
reportError( QObject::tr(
"Could not transform line to mesh CRS" ) );
1671 int triangularFaceIndex = mTriangularMesh.faceIndexForPoint_v2( point );
1673 if ( triangularFaceIndex >= 0 )
1675 int nativeFaceIndex = mTriangularMesh.trianglesToNativeFaces().at( triangularFaceIndex );
1676 if ( !mRelativeTimeSteps.isEmpty() )
1678 for (
int timeIndex = 0; timeIndex < mRelativeTimeSteps.count(); ++timeIndex )
1680 qint64 timeStep = mRelativeTimeSteps.at( timeIndex );
1681 QStringList textLine;
1682 textLine << QString::number( fid ) << QString::number( point.
x(),
'f', coordDigits ) << QString::number( point.
y(),
'f', coordDigits ) << mTimeStepString.at( timeIndex );
1684 if ( mRelativeTimeToData.contains( timeStep ) )
1686 const QMap<int, int> &groupToData = mRelativeTimeToData.value( timeStep );
1687 for (
int groupIndex : std::as_const( mGroupIndexes ) )
1689 if ( !groupToData.contains( groupIndex ) )
1691 int dataIndex = groupToData.value( groupIndex );
1692 if ( dataIndex < 0 || dataIndex > mDatasets.count() - 1 )
1695 const DataGroup &dataGroup = mDatasets.at( dataIndex );
1696 QgsMeshDatasetValue value = extractDatasetValue( point, nativeFaceIndex, triangularFaceIndex, mTriangularMesh, dataGroup.activeFaces, dataGroup.datasetValues, dataGroup.metadata );
1697 if ( abs( value.
x() ) == std::numeric_limits<double>::quiet_NaN() )
1698 textLine << QString(
' ' );
1700 textLine << QString::number( value.
scalar(),
'f', datasetDigits );
1703 textStream << textLine.join(
',' ) << u
"\n"_s;
1708 QStringList textLine;
1709 textLine << QString::number( fid ) << QString::number( point.
x(),
'f', coordDigits ) << QString::number( point.
y(),
'f', coordDigits ) << QObject::tr(
"static dataset" );
1710 const QMap<int, int> &groupToData = mRelativeTimeToData.value( 0 );
1711 for (
int groupIndex : std::as_const( mGroupIndexes ) )
1713 if ( !groupToData.contains( groupIndex ) )
1715 int dataIndex = groupToData.value( groupIndex );
1716 if ( dataIndex < 0 || dataIndex > mDatasets.count() - 1 )
1718 const DataGroup &dataGroup = mDatasets.at( dataIndex );
1719 QgsMeshDatasetValue value = extractDatasetValue( point, nativeFaceIndex, triangularFaceIndex, mTriangularMesh, dataGroup.activeFaces, dataGroup.datasetValues, dataGroup.metadata );
1720 if ( abs( value.
x() ) == std::numeric_limits<double>::quiet_NaN() )
1721 textLine << QString(
' ' );
1723 textLine << QString::number( value.
scalar(),
'f', datasetDigits );
1725 textStream << textLine.join(
',' ) << u
"\n"_s;
1731 feedback->
setProgress( 100.0 * featCounter / featCount );
1733 return QVariantMap();
1740 ret[u
"OUTPUT"_s] = outputFileName;
@ VectorPoint
Vector point layers.
@ VectorPolygon
Vector polygon layers.
@ VectorLine
Vector line layers.
@ Float64
Sixty four bit floating point (double).
@ LineStringZ
LineStringZ.
@ Hidden
Parameter is hidden and should not be shown to users.
@ Advanced
Parameter is an advanced parameter which should be hidden from users by default.
@ Double
Double/float values.
Represents a coordinate reference system (CRS).
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
Custom exception class for Coordinate Reference System related exceptions.
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.
@ FastInsert
Use faster inserts, at the cost of updating the passed features to reflect changes made at the provid...
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
void setAttributes(const QgsAttributes &attrs)
Sets the feature's attributes.
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
bool isCanceled() const
Tells whether the operation has been canceled already.
void canceled()
Internal routines can connect to this signal if they use event loop.
void cancel()
Tells the internal routines that the current operation should be canceled. This should be run by the ...
void setProgress(double progress)
Sets the current progress for the feedback object.
static std::unique_ptr< QgsFeedback > createScaledFeedback(QgsFeedback *parentFeedback, double startPercentage, double endPercentage)
Returns a feedback object whose [0, 100] progression range will be mapped to parentFeedback [startPer...
Encapsulate a field in an attribute table or data source.
Container of fields for a vector layer.
bool append(const QgsField &field, Qgis::FieldOrigin origin=Qgis::FieldOrigin::Provider, int originIndex=-1)
Appends a field.
A geometry is the spatial representation of a feature.
double length() const
Returns the planar, 2-dimensional length of geometry.
Qgis::GeometryOperationResult transform(const QgsCoordinateTransform &ct, Qgis::TransformDirection direction=Qgis::TransformDirection::Forward, bool transformZ=false)
Transforms this geometry as described by the coordinate transform ct.
QgsGeometry interpolate(double distance) const
Returns an interpolated point on the geometry at the specified distance.
QgsPointXY asPoint() const
Returns the contents of the geometry as a 2-dimensional point.
bool isEmpty() const
Returns true if the geometry is empty (eg a linestring with no vertices, or a collection with no geom...
A representation of the interval between two datetime values.
double seconds() const
Returns the interval duration in seconds.
double hours() const
Returns the interval duration in hours.
Line string geometry type, with support for z-dimension and m-values.
QgsCoordinateReferenceSystem crs
Abstract class for interpolating 3d stacked mesh data to 2d data.
QgsMeshDataBlock calculate(const QgsMesh3DDataBlock &block3d, QgsFeedback *feedback=nullptr) const
Calculated 2d block values from 3d stacked mesh values.
Exporter of contours lines or polygons from a mesh layer.
A block of integers/doubles from a mesh dataset.
QgsMeshDatasetValue value(int index) const
Returns a value represented by the index For active flag the behavior is undefined.
bool active(int index) const
Returns a value for active flag by the index For scalar and vector 2d the behavior is undefined.
int count() const
Number of items stored in the block.
An index that identifies the dataset group (e.g.
bool isValid() const
Returns whether index is valid, ie at least groups is set.
Represents a single mesh dataset value.
double y() const
Returns y value.
double scalar() const
Returns magnitude of vector for vector data or scalar value for scalar data.
double x() const
Returns x value.
Implementation of map layer temporal properties for mesh layers.
QDateTime referenceTime() const
Returns the reference time.
Represents a mesh layer supporting display of data on structured or unstructured meshes.
int datasetCount(const QgsMeshDatasetIndex &index) const
Returns the dataset count in the dataset groups.
QgsMeshRendererSettings rendererSettings() const
Returns renderer settings.
void updateTriangularMesh(const QgsCoordinateTransform &transform=QgsCoordinateTransform())
Gets native mesh and updates (creates if it doesn't exist) the base triangular mesh.
QgsMesh * nativeMesh()
Returns native mesh (nullptr before rendering or calling to updateMesh).
QgsMeshDatasetIndex datasetIndexAtRelativeTime(const QgsInterval &relativeTime, int datasetGroupIndex) const
Returns dataset index from datasets group depending on the relative time from the layer reference tim...
QgsMeshDataBlock datasetValues(const QgsMeshDatasetIndex &index, int valueIndex, int count) const
Returns N vector/scalar values from the index from the dataset.
bool isEditable() const override
Returns true if the layer can be edited.
QgsMeshDataBlock areFacesActive(const QgsMeshDatasetIndex &index, int faceIndex, int count) const
Returns whether the faces are active for particular dataset.
QgsInterval datasetRelativeTime(const QgsMeshDatasetIndex &index)
Returns the relative time of the dataset from the reference time of its group.
QgsMapLayerTemporalProperties * temporalProperties() override
Returns the layer's temporal properties.
qint64 datasetRelativeTimeInMilliseconds(const QgsMeshDatasetIndex &index)
Returns the relative time (in milliseconds) of the dataset from the reference time of its group.
QgsMesh3DDataBlock dataset3dValues(const QgsMeshDatasetIndex &index, int faceIndex, int count) const
Returns N vector/scalar values from the face index from the dataset for 3d stacked meshes.
QString formatTime(double hours)
Returns (date) time in hours formatted to human readable form.
QgsMeshDatasetGroupMetadata datasetGroupMetadata(const QgsMeshDatasetIndex &index) const
Returns the dataset groups metadata.
@ NeighbourAverage
Does a simple average of values defined for all surrounding faces/vertices.
static QgsRasterBlock * exportRasterBlock(const QgsMeshLayer &layer, const QgsMeshDatasetIndex &datasetIndex, const QgsCoordinateReferenceSystem &destinationCrs, const QgsCoordinateTransformContext &transformContext, double mapUnitsPerPixel, const QgsRectangle &extent, QgsRasterBlockFeedback *feedback=nullptr)
Exports mesh layer's dataset values as raster block.
Point geometry type, with support for z-dimension and m-values.
Abstract base class for processing algorithms.
Contains information about the context in which a processing algorithm is executed.
QgsDateTimeRange currentTimeRange() const
Returns the current time range to use for temporal operations.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context.
Custom exception class for processing related exceptions.
Base class for providing feedback from a processing algorithm.
void featureAddedToSink(const QString &output)
Reports that a feature was added to the the sink associated with the specified algorithm output.
void featureSinkFinalized(const QString &output)
Reports that a feature sink has been finalized.
virtual void reportError(const QString &error, bool fatalError=false)
Reports that the algorithm encountered an error while executing.
virtual void setProgressText(const QString &text)
Sets a progress report text string.
A coordinate reference system parameter for processing algorithms.
A double numeric parameter for distance values.
An enum based parameter for processing algorithms, allowing for selection from predefined values.
A rectangular map extent parameter for processing algorithms.
A feature sink output for processing algorithms.
An input feature source (such as vector layers) parameter for processing algorithms.
A generic file based destination parameter, for specifying the destination path for a file (non-map l...
A parameter for processing algorithms that need a list of mesh dataset groups.
static QList< int > valueAsDatasetGroup(const QVariant &value)
Returns the value as a list if dataset group indexes.
A parameter for processing algorithms that need a list of mesh dataset index from time parameter.
static QString valueAsTimeType(const QVariant &value)
Returns the dataset value time type as a string : current-context-time : the time is store in the pro...
static QgsMeshDatasetIndex timeValueAsDatasetIndex(const QVariant &value)
Returns the value as a QgsMeshDatasetIndex if the value has "dataset-time-step" type.
static QDateTime timeValueAsDefinedDateTime(const QVariant &value)
Returns the value as a QDateTime if the value has "defined-date-time" type.
A mesh layer parameter for processing algorithms.
A numeric parameter for processing algorithms.
A raster layer destination parameter, for specifying the destination path for a raster layer created ...
Feedback object tailored for raster block reading.
The raster file writer which allows you to save a raster to a new file.
A rectangle specified with double values.
T begin() const
Returns the beginning of the range.
A triangular/derived mesh with vertices in map coordinates.
const QVector< QgsMeshFace > & triangles() const
Returns triangles.
const QVector< QgsMeshVertex > & vertices() const
Returns vertices in map coordinate system.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference).
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
QVector< int > QgsMeshFace
List of vertex indexes.
QPair< int, int > QgsMeshEdge
Edge is a straight line seqment between 2 points.
Mesh - vertices, edges and faces.
QVector< QgsMeshVertex > vertices
void clear()
Remove all vertices, edges and faces.
int faceCount() const
Returns number of faces.