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
207void QgsExportMeshOnElement::initAlgorithm(
const QVariantMap &configuration )
209 Q_UNUSED( configuration );
218 addParameter(
new QgsProcessingParameterCrs( u
"CRS_OUTPUT"_s, QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
220 QStringList exportVectorOptions;
221 exportVectorOptions << QObject::tr(
"Cartesian (x,y)" ) << QObject::tr(
"Polar (magnitude,degree)" ) << QObject::tr(
"Cartesian and Polar" );
222 addParameter(
new QgsProcessingParameterEnum( u
"VECTOR_OPTION"_s, QObject::tr(
"Export vector option" ), exportVectorOptions,
false, 0 ) );
232 if ( timeType ==
"dataset-time-step"_L1 )
237 else if ( timeType ==
"defined-date-time"_L1 )
240 if ( dateTime.isValid() )
241 relativeTime =
QgsInterval( layerReferenceTime.secsTo( dateTime ) );
243 else if ( timeType ==
"current-context-time"_L1 )
246 if ( dateTime.isValid() )
247 relativeTime =
QgsInterval( layerReferenceTime.secsTo( dateTime ) );
256 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
258 if ( !meshLayer || !meshLayer->
isValid() )
266 outputCrs = meshLayer->
crs();
281 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
282 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
284 switch ( meshElementType() )
287 mElementCount = mNativeMesh.faceCount();
290 mElementCount = mNativeMesh.vertexCount();
293 mElementCount = mNativeMesh.edgeCount();
297 for (
int i = 0; i < datasetGroups.count(); ++i )
299 int groupIndex = datasetGroups.at( i );
304 if ( supportedDataType().contains( dataGroup.metadata.dataType() ) )
306 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, mElementCount );
307 mDataPerGroup.append( dataGroup );
310 feedback->
setProgress( 100 * i / datasetGroups.count() );
313 mExportVectorOption = parameterAsInt( parameters, u
"VECTOR_OPTION"_s, context );
320 QGS_MARK_ALGORITHM_SOURCE
325 return QVariantMap();
327 feedback->
setProgressText( QObject::tr(
"Creating output vector layer" ) );
330 QList<QgsMeshDatasetGroupMetadata> metaList;
331 metaList.reserve( mDataPerGroup.size() );
332 for (
const DataGroup &dataGroup : std::as_const( mDataPerGroup ) )
333 metaList.append( dataGroup.metadata );
334 QgsFields fields = createFields( metaList, mExportVectorOption );
338 std::unique_ptr<QgsFeatureSink> sink( parameterAsSink( parameters, u
"OUTPUT"_s, context, identifier, fields, sinkGeometryType(), outputCrs ) );
340 return QVariantMap();
345 return QVariantMap();
347 feedback->
setProgressText( QObject::tr(
"Creating points for each vertices" ) );
350 for (
int i = 0; i < mElementCount; ++i )
353 for (
const DataGroup &dataGroup : std::as_const( mDataPerGroup ) )
356 addAttributes( value, attributes, dataGroup.metadata.isVector(), mExportVectorOption );
367 geom = meshElement( i );
369 feedback->
reportError( QObject::tr(
"Could not transform point to destination CRS" ) );
382 return QVariantMap();
391 ret[u
"OUTPUT"_s] = identifier;
396QString QgsExportMeshFacesAlgorithm::shortHelpString()
const
398 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." );
401QString QgsExportMeshFacesAlgorithm::shortDescription()
const
403 return QObject::tr(
"Exports mesh faces to a polygon vector layer." );
406QString QgsExportMeshFacesAlgorithm::name()
const
408 return u
"exportmeshfaces"_s;
411QString QgsExportMeshFacesAlgorithm::displayName()
const
413 return QObject::tr(
"Export mesh faces" );
418 return new QgsExportMeshFacesAlgorithm();
421QgsGeometry QgsExportMeshFacesAlgorithm::meshElement(
int index )
const
423 const QgsMeshFace &face = mNativeMesh.face( index );
424 QVector<QgsPoint> vertices( face.size() );
425 for (
int i = 0; i < face.size(); ++i )
426 vertices[i] = mNativeMesh.vertex( face.at( i ) );
427 auto polygon = std::make_unique<QgsPolygon>();
432QString QgsExportMeshEdgesAlgorithm::shortHelpString()
const
434 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." );
437QString QgsExportMeshEdgesAlgorithm::shortDescription()
const
439 return QObject::tr(
"Exports mesh edges to a line vector layer." );
442QString QgsExportMeshEdgesAlgorithm::name()
const
444 return u
"exportmeshedges"_s;
447QString QgsExportMeshEdgesAlgorithm::displayName()
const
449 return QObject::tr(
"Export mesh edges" );
454 return new QgsExportMeshEdgesAlgorithm();
457QgsGeometry QgsExportMeshEdgesAlgorithm::meshElement(
int index )
const
459 const QgsMeshEdge &edge = mNativeMesh.edge( index );
460 QVector<QgsPoint> vertices( 2 );
461 vertices[0] = mNativeMesh.vertex( edge.first );
462 vertices[1] = mNativeMesh.vertex( edge.second );
467QString QgsExportMeshOnGridAlgorithm::name()
const
469 return u
"exportmeshongrid"_s;
472QString QgsExportMeshOnGridAlgorithm::displayName()
const
474 return QObject::tr(
"Export mesh on grid" );
477QString QgsExportMeshOnGridAlgorithm::group()
const
479 return QObject::tr(
"Mesh" );
482QString QgsExportMeshOnGridAlgorithm::groupId()
const
487QString QgsExportMeshOnGridAlgorithm::shortHelpString()
const
490 "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"
491 "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 "
493 "1D meshes are not supported."
497QString QgsExportMeshOnGridAlgorithm::shortDescription()
const
499 return QObject::tr(
"Exports mesh dataset values to a gridded point vector layer." );
504 return new QgsExportMeshOnGridAlgorithm();
507void QgsExportMeshOnGridAlgorithm::initAlgorithm(
const QVariantMap &configuration )
509 Q_UNUSED( configuration );
521 addParameter(
new QgsProcessingParameterCrs( u
"CRS_OUTPUT"_s, QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
523 QStringList exportVectorOptions;
524 exportVectorOptions << QObject::tr(
"Cartesian (x,y)" ) << QObject::tr(
"Polar (magnitude,degree)" ) << QObject::tr(
"Cartesian and Polar" );
525 addParameter(
new QgsProcessingParameterEnum( u
"VECTOR_OPTION"_s, QObject::tr(
"Export vector option" ), exportVectorOptions,
false, 0 ) );
529static void extractDatasetValues(
530 const QList<int> &datasetGroups,
534 const QSet<int> supportedDataType,
535 QList<DataGroup> &datasetPerGroup,
539 for (
int i = 0; i < datasetGroups.count(); ++i )
541 int groupIndex = datasetGroups.at( i );
546 if ( supportedDataType.contains( dataGroup.metadata.dataType() ) )
549 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, valueCount );
553 dataGroup.dataset3dStakedValue = meshLayer->
dataset3dValues( datasetIndex, 0, valueCount );
555 datasetPerGroup.append( dataGroup );
558 feedback->
setProgress( 100 * i / datasetGroups.count() );
564 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
566 if ( !meshLayer || !meshLayer->
isValid() )
571 outputCrs = meshLayer->
crs();
586 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
587 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
589 extractDatasetValues( datasetGroups, meshLayer, nativeMesh, relativeTime, supportedDataType(), mDataPerGroup, feedback );
590 mTriangularMesh.update( meshLayer->
nativeMesh(), mTransform );
592 mExportVectorOption = parameterAsInt( parameters, u
"VECTOR_OPTION"_s, context );
599 QGS_MARK_ALGORITHM_SOURCE
604 return QVariantMap();
606 feedback->
setProgressText( QObject::tr(
"Creating output vector layer" ) );
611 for ( DataGroup &dataGroup : mDataPerGroup )
613 if ( dataGroup.dataset3dStakedValue.isValid() )
614 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
617 QList<QgsMeshDatasetGroupMetadata> metaList;
618 metaList.reserve( mDataPerGroup.size() );
619 for (
const DataGroup &dataGroup : std::as_const( mDataPerGroup ) )
620 metaList.append( dataGroup.metadata );
621 QgsFields fields = createFields( metaList, mExportVectorOption );
626 std::unique_ptr<QgsFeatureSink> sink( parameterAsSink( parameters, u
"OUTPUT"_s, context, identifier, fields,
Qgis::WkbType::Point, outputCrs ) );
628 return QVariantMap();
633 return QVariantMap();
639 const double gridSpacing = parameterAsDouble( parameters, u
"GRID_SPACING"_s, context );
645 QgsRectangle extent = parameterAsExtent( parameters, u
"EXTENT"_s, context );
647 extent = mTriangularMesh.extent();
648 int pointXCount = int( extent.
width() / gridSpacing ) + 1;
649 int pointYCount = int( extent.
height() / gridSpacing ) + 1;
651 for (
int ix = 0; ix < pointXCount; ++ix )
653 for (
int iy = 0; iy < pointYCount; ++iy )
656 int triangularFaceIndex = mTriangularMesh.faceIndexForPoint_v2( point );
657 if ( triangularFaceIndex >= 0 )
661 int nativeFaceIndex = mTriangularMesh.trianglesToNativeFaces().at( triangularFaceIndex );
662 for (
int i = 0; i < mDataPerGroup.count(); ++i )
664 const DataGroup &dataGroup = mDataPerGroup.at( i );
665 bool faceActive = dataGroup.activeFaces.active( nativeFaceIndex );
668 QgsMeshDatasetValue value = extractDatasetValue( point, nativeFaceIndex, triangularFaceIndex, mTriangularMesh, dataGroup.activeFaces, dataGroup.datasetValues, dataGroup.metadata );
670 if ( dataGroup.metadata.isVector() )
672 QVector<double> vector = vectorValue( dataGroup.datasetValues.value( i ), mExportVectorOption );
673 for (
double v : vector )
675 attributes.append( v );
679 attributes.append( value.
scalar() );
690 feedback->
reportError( QObject::tr(
"Could not transform point to destination CRS" ) );
711 ret[u
"OUTPUT"_s] = identifier;
716QSet<int> QgsExportMeshOnGridAlgorithm::supportedDataType()
721QString QgsMeshRasterizeAlgorithm::name()
const
723 return u
"meshrasterize"_s;
726QString QgsMeshRasterizeAlgorithm::displayName()
const
728 return QObject::tr(
"Rasterize mesh dataset" );
731QString QgsMeshRasterizeAlgorithm::group()
const
733 return QObject::tr(
"Mesh" );
736QString QgsMeshRasterizeAlgorithm::groupId()
const
741QString QgsMeshRasterizeAlgorithm::shortHelpString()
const
744 "This algorithm creates a raster layer from a mesh dataset.\n"
745 "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 "
747 "1D meshes are not supported."
751QString QgsMeshRasterizeAlgorithm::shortDescription()
const
753 return QObject::tr(
"Creates a raster layer from a mesh dataset." );
758 return new QgsMeshRasterizeAlgorithm();
761void QgsMeshRasterizeAlgorithm::initAlgorithm(
const QVariantMap &configuration )
763 Q_UNUSED( configuration );
773 addParameter(
new QgsProcessingParameterCrs( u
"CRS_OUTPUT"_s, QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
777 auto createOptsParam = std::make_unique<QgsProcessingParameterString>( u
"CREATE_OPTIONS"_s, QObject::tr(
"Creation options" ), QVariant(),
false,
true );
778 createOptsParam->setMetadata( QVariantMap( { { u
"widget_wrapper"_s, QVariantMap( { { u
"widget_type"_s, u
"rasteroptions"_s } } ) } } ) );
780 addParameter( createOptsParam.release() );
782 auto creationOptsParam = std::make_unique<QgsProcessingParameterString>( u
"CREATION_OPTIONS"_s, QObject::tr(
"Creation options" ), QVariant(),
false,
true );
783 creationOptsParam->setMetadata( QVariantMap( { { u
"widget_wrapper"_s, QVariantMap( { { u
"widget_type"_s, u
"rasteroptions"_s } } ) } } ) );
785 addParameter( creationOptsParam.release() );
792 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
794 if ( !meshLayer || !meshLayer->
isValid() )
799 outputCrs = meshLayer->
crs();
804 mTriangularMesh.update( meshLayer->
nativeMesh(), mTransform );
814 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
815 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
817 extractDatasetValues( datasetGroups, meshLayer, *meshLayer->
nativeMesh(), relativeTime, supportedDataType(), mDataPerGroup, feedback );
826 QGS_MARK_ALGORITHM_SOURCE
831 return QVariantMap();
838 for ( DataGroup &dataGroup : mDataPerGroup )
840 if ( dataGroup.dataset3dStakedValue.isValid() )
841 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue, feedback );
848 const double pixelSize = parameterAsDouble( parameters, u
"PIXEL_SIZE"_s, context );
854 QgsRectangle extent = parameterAsExtent( parameters, u
"EXTENT"_s, context );
856 extent = mTriangularMesh.extent();
858 int width = extent.
width() / pixelSize;
859 int height = extent.
height() / pixelSize;
861 QString creationOptions = parameterAsString( parameters, u
"CREATION_OPTIONS"_s, context ).trimmed();
863 const QString optionsString = parameterAsString( parameters, u
"CREATE_OPTIONS"_s, context );
864 if ( !optionsString.isEmpty() )
865 creationOptions = optionsString;
867 const QString fileName = parameterAsOutputLayer( parameters, u
"OUTPUT"_s, context );
868 const QString outputFormat = parameterAsOutputRasterFormat( parameters, u
"OUTPUT"_s, context );
870 rasterFileWriter.setOutputProviderKey( u
"gdal"_s );
871 if ( !creationOptions.isEmpty() )
873 rasterFileWriter.setCreationOptions( creationOptions.split(
'|' ) );
875 rasterFileWriter.setOutputFormat( outputFormat );
877 std::unique_ptr<QgsRasterDataProvider> rasterDataProvider( rasterFileWriter.createMultiBandRaster(
Qgis::DataType::Float64, width, height, extent, mTransform.destinationCrs(), mDataPerGroup.count() ) );
878 if ( !rasterDataProvider )
880 if ( !rasterDataProvider->isEditable() && !rasterDataProvider->setEditable(
true ) )
881 throw QgsProcessingException( QObject::tr(
"Could not create raster output: %1" ).arg( rasterDataProvider->error().summary() ) );
883 const bool hasReportsDuringClose = rasterDataProvider->hasReportsDuringClose();
884 const double maxProgressDuringBlockWriting = hasReportsDuringClose ? 50.0 : 100.0;
886 for (
int i = 0; i < mDataPerGroup.count(); ++i )
888 const DataGroup &dataGroup = mDataPerGroup.at( i );
893 if ( dataGroup.datasetValues.isValid() )
895 std::unique_ptr<QgsRasterBlock> block(
896 QgsMeshUtils::exportRasterBlock( mTriangularMesh, dataGroup.datasetValues, dataGroup.activeFaces, dataGroup.metadata.dataType(), mTransform, pixelSize, extent, &rasterBlockFeedBack )
902 if ( !rasterDataProvider->writeBlock( block.get(), i + 1 ) )
904 throw QgsProcessingException( QObject::tr(
"Could not write raster block: %1" ).arg( rasterDataProvider->error().summary() ) );
906 rasterDataProvider->setNoDataValue( i + 1, block->noDataValue() );
909 rasterDataProvider->setNoDataValue( i + 1, std::numeric_limits<double>::quiet_NaN() );
914 return QVariantMap();
915 feedback->
setProgress( maxProgressDuringBlockWriting * i / mDataPerGroup.count() );
919 rasterDataProvider->setEditable(
false );
922 feedback->
setProgress( maxProgressDuringBlockWriting );
924 if ( feedback && hasReportsDuringClose )
927 if ( !rasterDataProvider->closeWithProgress( scaledFeedback.get() ) )
936 ret[u
"OUTPUT"_s] = fileName;
941QSet<int> QgsMeshRasterizeAlgorithm::supportedDataType()
946QString QgsMeshContoursAlgorithm::name()
const
948 return u
"meshcontours"_s;
951QString QgsMeshContoursAlgorithm::displayName()
const
953 return QObject::tr(
"Export contours" );
956QString QgsMeshContoursAlgorithm::group()
const
958 return QObject::tr(
"Mesh" );
961QString QgsMeshContoursAlgorithm::groupId()
const
966QString QgsMeshContoursAlgorithm::shortHelpString()
const
968 return QObject::tr(
"This algorithm creates contours as a vector layer from a mesh scalar dataset." );
971QString QgsMeshContoursAlgorithm::shortDescription()
const
973 return QObject::tr(
"Creates contours as vector layer from mesh scalar dataset." );
978 return new QgsMeshContoursAlgorithm();
981void QgsMeshContoursAlgorithm::initAlgorithm(
const QVariantMap &configuration )
983 Q_UNUSED( configuration );
996 auto contourLevelList = std::make_unique<QgsProcessingParameterString>( u
"CONTOUR_LEVEL_LIST"_s, QObject::tr(
"List of contours level" ), QVariant(),
false,
true );
997 contourLevelList->setHelp( QObject::tr(
"Comma separated list of values to export. If filled, the increment, minimum and maximum settings are ignored." ) );
998 addParameter( contourLevelList.release() );
1000 addParameter(
new QgsProcessingParameterCrs( u
"CRS_OUTPUT"_s, QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
1009 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
1011 if ( !meshLayer || !meshLayer->
isValid() )
1016 outputCrs = meshLayer->
crs();
1021 mTriangularMesh.update( meshLayer->
nativeMesh(), mTransform );
1027 QString levelsString = parameterAsString( parameters, u
"CONTOUR_LEVEL_LIST"_s, context );
1028 if ( !levelsString.isEmpty() )
1030 QStringList levelStringList = levelsString.split(
',' );
1031 if ( !levelStringList.isEmpty() )
1033 for (
const QString &stringVal : levelStringList )
1036 double val = stringVal.toDouble( &ok );
1038 mLevels.append( val );
1040 throw QgsProcessingException( QObject::tr(
"Invalid format for level values, must be numbers separated with comma" ) );
1042 if ( mLevels.count() >= 2 )
1043 if ( mLevels.last() <= mLevels.at( mLevels.count() - 2 ) )
1044 throw QgsProcessingException( QObject::tr(
"Invalid format for level values, must be different numbers and in increasing order" ) );
1049 if ( mLevels.isEmpty() )
1051 double minimum = parameterAsDouble( parameters, u
"MINIMUM"_s, context );
1052 double maximum = parameterAsDouble( parameters, u
"MAXIMUM"_s, context );
1053 double interval = parameterAsDouble( parameters, u
"INCREMENT"_s, context );
1055 if ( interval <= 0 )
1058 if ( minimum >= maximum )
1059 throw QgsProcessingException( QObject::tr(
"Invalid minimum and maximum values, minimum must be lesser than maximum" ) );
1061 if ( interval > ( maximum - minimum ) )
1062 throw QgsProcessingException( QObject::tr(
"Invalid minimum, maximum and interval values, difference between minimum and maximum must be greater or equal than interval" ) );
1064 int intervalCount = ( maximum - minimum ) / interval;
1066 mLevels.reserve( intervalCount );
1067 for (
int i = 0; i < intervalCount; ++i )
1069 mLevels.append( minimum + i * interval );
1082 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
1083 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
1087 extractDatasetValues( datasetGroups, meshLayer, mNativeMesh, relativeTime, supportedDataType(), mDataPerGroup, feedback );
1096 QGS_MARK_ALGORITHM_SOURCE
1100 for ( DataGroup &dataGroup : mDataPerGroup )
1102 if ( dataGroup.dataset3dStakedValue.isValid() )
1103 dataGroup.datasetValues = avgMethod->calculate( dataGroup.dataset3dStakedValue );
1109 polygonFields.
append(
QgsField( QObject::tr(
"group" ), QMetaType::Type::QString ) );
1110 polygonFields.
append(
QgsField( QObject::tr(
"time" ), QMetaType::Type::QString ) );
1111 polygonFields.
append(
QgsField( QObject::tr(
"min_value" ), QMetaType::Type::Double ) );
1112 polygonFields.
append(
QgsField( QObject::tr(
"max_value" ), QMetaType::Type::Double ) );
1113 lineFields.
append(
QgsField( QObject::tr(
"group" ), QMetaType::Type::QString ) );
1114 lineFields.
append(
QgsField( QObject::tr(
"time" ), QMetaType::Type::QString ) );
1115 lineFields.
append(
QgsField( QObject::tr(
"value" ), QMetaType::Type::Double ) );
1119 QString lineIdentifier;
1120 QString polygonIdentifier;
1121 std::unique_ptr<QgsFeatureSink> sinkPolygons( parameterAsSink( parameters, u
"OUTPUT_POLYGONS"_s, context, polygonIdentifier, polygonFields,
Qgis::WkbType::PolygonZ, outputCrs ) );
1122 std::unique_ptr<QgsFeatureSink> sinkLines( parameterAsSink( parameters, u
"OUTPUT_LINES"_s, context, lineIdentifier, lineFields,
Qgis::WkbType::LineStringZ, outputCrs ) );
1124 if ( !sinkLines || !sinkPolygons )
1125 return QVariantMap();
1128 for (
int i = 0; i < mDataPerGroup.count(); ++i )
1130 DataGroup dataGroup = mDataPerGroup.at( i );
1132 int count = scalarDataOnVertices ? mNativeMesh.vertices.count() : mNativeMesh.faces.count();
1134 QVector<double> values;
1135 if ( dataGroup.datasetValues.isValid() )
1138 values = QgsMeshLayerUtils::calculateMagnitudes( dataGroup.datasetValues );
1142 values = QVector<double>( count, std::numeric_limits<double>::quiet_NaN() );
1145 if ( ( !scalarDataOnVertices ) )
1150 QgsMeshContours contoursExported( mTriangularMesh, mNativeMesh, values, dataGroup.activeFaces );
1153 firstAttributes.append( dataGroup.metadata.name() );
1154 firstAttributes.append( mDateTimeString );
1156 for (
double level : std::as_const( mLevels ) )
1158 QgsGeometry line = contoursExported.exportLines( level, feedback );
1160 return QVariantMap();
1164 lineAttributes.append( level );
1176 for (
int l = 0; l < mLevels.count() - 1; ++l )
1178 QgsGeometry polygon = contoursExported.exportPolygons( mLevels.at( l ), mLevels.at( l + 1 ), feedback );
1180 return QVariantMap();
1185 polygonAttributes.append( mLevels.at( l ) );
1186 polygonAttributes.append( mLevels.at( l + 1 ) );
1191 if ( !sinkPolygons->addFeature( polygonFeature ) )
1203 feedback->
setProgress( 100 * i / mDataPerGroup.count() );
1209 sinkPolygons->finalize();
1214 sinkLines->finalize();
1219 ret[u
"OUTPUT_LINES"_s] = lineIdentifier;
1220 ret[u
"OUTPUT_POLYGONS"_s] = polygonIdentifier;
1225QString QgsMeshExportCrossSection::name()
const
1227 return u
"meshexportcrosssection"_s;
1230QString QgsMeshExportCrossSection::displayName()
const
1232 return QObject::tr(
"Export cross section dataset values on lines from mesh" );
1235QString QgsMeshExportCrossSection::group()
const
1237 return QObject::tr(
"Mesh" );
1240QString QgsMeshExportCrossSection::groupId()
const
1245QString QgsMeshExportCrossSection::shortHelpString()
const
1248 "This algorithm extracts mesh's dataset values from line contained in a vector layer.\n"
1249 "Each line is discretized with a resolution distance parameter for extraction of values on its vertices."
1253QString QgsMeshExportCrossSection::shortDescription()
const
1255 return QObject::tr(
"Extracts a mesh dataset's values from lines contained in a vector layer." );
1260 return new QgsMeshExportCrossSection();
1263void QgsMeshExportCrossSection::initAlgorithm(
const QVariantMap &configuration )
1265 Q_UNUSED( configuration );
1273 QList<int> datatype;
1277 addParameter(
new QgsProcessingParameterDistance( u
"RESOLUTION"_s, QObject::tr(
"Line segmentation resolution" ), 10.0, u
"INPUT_LINES"_s,
false, 0 ) );
1288 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
1290 if ( !meshLayer || !meshLayer->
isValid() )
1293 mMeshLayerCrs = meshLayer->
crs();
1294 mTriangularMesh.update( meshLayer->
nativeMesh() );
1303 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
1304 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
1306 extractDatasetValues( datasetGroups, meshLayer, *meshLayer->
nativeMesh(), relativeTime, supportedDataType(), mDataPerGroup, feedback );
1315 QGS_MARK_ALGORITHM_SOURCE
1321 for ( DataGroup &dataGroup : mDataPerGroup )
1323 if ( dataGroup.dataset3dStakedValue.isValid() )
1324 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
1326 double resolution = parameterAsDouble( parameters, u
"RESOLUTION"_s, context );
1327 int datasetDigits = parameterAsInt( parameters, u
"DATASET_DIGITS"_s, context );
1328 int coordDigits = parameterAsInt( parameters, u
"COORDINATES_DIGITS"_s, context );
1330 std::unique_ptr<QgsProcessingFeatureSource> featureSource( parameterAsSource( parameters, u
"INPUT_LINES"_s, context ) );
1331 if ( !featureSource )
1336 QString outputFileName = parameterAsFileOutput( parameters, u
"OUTPUT"_s, context );
1337 QFile file( outputFileName );
1338 if ( !file.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
1341 QTextStream textStream( &file );
1343 header << u
"fid"_s << u
"x"_s << u
"y"_s << QObject::tr(
"offset" );
1344 for (
const DataGroup &datagroup : std::as_const( mDataPerGroup ) )
1345 header << datagroup.metadata.name();
1346 textStream << header.join(
',' ) << u
"\n"_s;
1348 long long featCount = featureSource->featureCount();
1349 long long featCounter = 0;
1363 feedback->
reportError( QObject::tr(
"Could not transform line to mesh CRS" ) );
1369 while ( offset <= line.
length() )
1372 return QVariantMap();
1374 QStringList textLine;
1376 int triangularFaceIndex = mTriangularMesh.faceIndexForPoint_v2( point );
1377 textLine << QString::number( fid ) << QString::number( point.
x(),
'f', coordDigits ) << QString::number( point.
y(),
'f', coordDigits ) << QString::number( offset,
'f', coordDigits );
1378 if ( triangularFaceIndex >= 0 )
1382 int nativeFaceIndex = mTriangularMesh.trianglesToNativeFaces().at( triangularFaceIndex );
1383 for (
int i = 0; i < mDataPerGroup.count(); ++i )
1385 const DataGroup &dataGroup = mDataPerGroup.at( i );
1386 bool faceActive = dataGroup.activeFaces.active( nativeFaceIndex );
1389 QgsMeshDatasetValue value = extractDatasetValue( point, nativeFaceIndex, triangularFaceIndex, mTriangularMesh, dataGroup.activeFaces, dataGroup.datasetValues, dataGroup.metadata );
1391 if ( abs( value.
x() ) == std::numeric_limits<double>::quiet_NaN() )
1392 textLine << QString(
' ' );
1394 textLine << QString::number( value.
scalar(),
'f', datasetDigits );
1398 for (
int i = 0; i < mDataPerGroup.count(); ++i )
1399 textLine << QString(
' ' );
1401 textStream << textLine.join(
',' ) << u
"\n"_s;
1403 offset += resolution;
1408 feedback->
setProgress( 100.0 * featCounter / featCount );
1410 return QVariantMap();
1417 ret[u
"OUTPUT"_s] = outputFileName;
1421QString QgsMeshExportTimeSeries::name()
const
1423 return u
"meshexporttimeseries"_s;
1426QString QgsMeshExportTimeSeries::displayName()
const
1428 return QObject::tr(
"Export time series values from points of a mesh dataset" );
1431QString QgsMeshExportTimeSeries::group()
const
1433 return QObject::tr(
"Mesh" );
1436QString QgsMeshExportTimeSeries::groupId()
const
1441QString QgsMeshExportTimeSeries::shortHelpString()
const
1444 "This algorithm extracts mesh's dataset time series values from points contained in a vector layer.\n"
1445 "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."
1449QString QgsMeshExportTimeSeries::shortDescription()
const
1451 return QObject::tr(
"Extracts a mesh dataset's time series values from points contained in a vector layer." );
1456 return new QgsMeshExportTimeSeries();
1459void QgsMeshExportTimeSeries::initAlgorithm(
const QVariantMap &configuration )
1461 Q_UNUSED( configuration );
1473 QList<int> datatype;
1486 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
1488 if ( !meshLayer || !meshLayer->
isValid() )
1491 mMeshLayerCrs = meshLayer->
crs();
1492 mTriangularMesh.update( meshLayer->
nativeMesh() );
1502 QVariant parameterStartTimeVariant = parameters.value( u
"STARTING_TIME"_s );
1503 QgsInterval relativeStartTime = datasetRelativetime( parameterStartTimeVariant, meshLayer, context );
1505 QVariant parameterEndTimeVariant = parameters.value( u
"FINISHING_TIME"_s );
1506 QgsInterval relativeEndTime = datasetRelativetime( parameterEndTimeVariant, meshLayer, context );
1509 qint64 timeStepInterval = parameterAsDouble( parameters, u
"TIME_STEP"_s, context ) * 1000 * 3600;
1510 if ( timeStepInterval == 0 )
1513 for (
int groupIndex : datasetGroups )
1526 mRelativeTimeSteps.clear();
1527 mTimeStepString.clear();
1528 if ( timeStepInterval != 0 )
1530 mRelativeTimeSteps.append( relativeStartTime.
seconds() * 1000 );
1531 while ( mRelativeTimeSteps.last() < relativeEndTime.
seconds() * 1000 )
1532 mRelativeTimeSteps.append( mRelativeTimeSteps.last() + timeStepInterval );
1534 for ( qint64 relativeTimeStep : std::as_const( mRelativeTimeSteps ) )
1536 mTimeStepString.append( meshLayer->
formatTime( relativeTimeStep / 3600.0 / 1000.0 ) );
1541 for (
int i = 0; i < datasetGroups.count(); ++i )
1543 int groupIndex = datasetGroups.at( i );
1545 if ( supportedDataType().contains( meta.
dataType() ) )
1547 mGroupIndexes.append( groupIndex );
1548 mGroupsMetadata[groupIndex] = meta;
1551 if ( !mRelativeTimeSteps.isEmpty() )
1555 for ( qint64 relativeTimeStep : std::as_const( mRelativeTimeSteps ) )
1557 QMap<int, int> &groupIndexToData = mRelativeTimeToData[relativeTimeStep];
1558 QgsInterval timeStepInterval( relativeTimeStep / 1000.0 );
1560 if ( !datasetIndex.
isValid() )
1562 if ( datasetIndex != lastDatasetIndex )
1564 DataGroup dataGroup;
1565 dataGroup.metadata = meta;
1566 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, valueCount );
1570 dataGroup.dataset3dStakedValue = meshLayer->
dataset3dValues( datasetIndex, 0, valueCount );
1572 mDatasets.append( dataGroup );
1573 lastDatasetIndex = datasetIndex;
1575 groupIndexToData[groupIndex] = mDatasets.count() - 1;
1581 QMap<int, int> &groupIndexToData = mRelativeTimeToData[0];
1583 DataGroup dataGroup;
1584 dataGroup.metadata = meta;
1585 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, valueCount );
1589 dataGroup.dataset3dStakedValue = meshLayer->
dataset3dValues( datasetIndex, 0, valueCount );
1591 mDatasets.append( dataGroup );
1592 groupIndexToData[groupIndex] = mDatasets.
count() - 1;
1597 feedback->
setProgress( 100 * i / datasetGroups.count() );
1608 QGS_MARK_ALGORITHM_SOURCE
1615 for ( DataGroup &dataGroup : mDatasets )
1617 if ( dataGroup.dataset3dStakedValue.isValid() )
1618 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
1621 int datasetDigits = parameterAsInt( parameters, u
"DATASET_DIGITS"_s, context );
1622 int coordDigits = parameterAsInt( parameters, u
"COORDINATES_DIGITS"_s, context );
1624 std::unique_ptr<QgsProcessingFeatureSource> featureSource( parameterAsSource( parameters, u
"INPUT_POINTS"_s, context ) );
1625 if ( !featureSource )
1630 QString outputFileName = parameterAsFileOutput( parameters, u
"OUTPUT"_s, context );
1631 QFile file( outputFileName );
1632 if ( !file.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
1635 QTextStream textStream( &file );
1637 header << u
"fid"_s << u
"x"_s << u
"y"_s << QObject::tr(
"time" );
1639 for (
int gi : std::as_const( mGroupIndexes ) )
1640 header << mGroupsMetadata.value( gi ).name();
1642 textStream << header.join(
',' ) << u
"\n"_s;
1644 long long featCount = featureSource->featureCount();
1645 long long featCounter = 0;
1659 feedback->
reportError( QObject::tr(
"Could not transform line to mesh CRS" ) );
1666 int triangularFaceIndex = mTriangularMesh.faceIndexForPoint_v2( point );
1668 if ( triangularFaceIndex >= 0 )
1670 int nativeFaceIndex = mTriangularMesh.trianglesToNativeFaces().at( triangularFaceIndex );
1671 if ( !mRelativeTimeSteps.isEmpty() )
1673 for (
int timeIndex = 0; timeIndex < mRelativeTimeSteps.count(); ++timeIndex )
1675 qint64 timeStep = mRelativeTimeSteps.at( timeIndex );
1676 QStringList textLine;
1677 textLine << QString::number( fid ) << QString::number( point.
x(),
'f', coordDigits ) << QString::number( point.
y(),
'f', coordDigits ) << mTimeStepString.at( timeIndex );
1679 if ( mRelativeTimeToData.contains( timeStep ) )
1681 const QMap<int, int> &groupToData = mRelativeTimeToData.value( timeStep );
1682 for (
int groupIndex : std::as_const( mGroupIndexes ) )
1684 if ( !groupToData.contains( groupIndex ) )
1686 int dataIndex = groupToData.value( groupIndex );
1687 if ( dataIndex < 0 || dataIndex > mDatasets.count() - 1 )
1690 const DataGroup &dataGroup = mDatasets.at( dataIndex );
1691 QgsMeshDatasetValue value = extractDatasetValue( point, nativeFaceIndex, triangularFaceIndex, mTriangularMesh, dataGroup.activeFaces, dataGroup.datasetValues, dataGroup.metadata );
1692 if ( abs( value.
x() ) == std::numeric_limits<double>::quiet_NaN() )
1693 textLine << QString(
' ' );
1695 textLine << QString::number( value.
scalar(),
'f', datasetDigits );
1698 textStream << textLine.join(
',' ) << u
"\n"_s;
1703 QStringList textLine;
1704 textLine << QString::number( fid ) << QString::number( point.
x(),
'f', coordDigits ) << QString::number( point.
y(),
'f', coordDigits ) << QObject::tr(
"static dataset" );
1705 const QMap<int, int> &groupToData = mRelativeTimeToData.value( 0 );
1706 for (
int groupIndex : std::as_const( mGroupIndexes ) )
1708 if ( !groupToData.contains( groupIndex ) )
1710 int dataIndex = groupToData.value( groupIndex );
1711 if ( dataIndex < 0 || dataIndex > mDatasets.count() - 1 )
1713 const DataGroup &dataGroup = mDatasets.at( dataIndex );
1714 QgsMeshDatasetValue value = extractDatasetValue( point, nativeFaceIndex, triangularFaceIndex, mTriangularMesh, dataGroup.activeFaces, dataGroup.datasetValues, dataGroup.metadata );
1715 if ( abs( value.
x() ) == std::numeric_limits<double>::quiet_NaN() )
1716 textLine << QString(
' ' );
1718 textLine << QString::number( value.
scalar(),
'f', datasetDigits );
1720 textStream << textLine.join(
',' ) << u
"\n"_s;
1726 feedback->
setProgress( 100.0 * featCounter / featCount );
1728 return QVariantMap();
1735 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.