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 );
323 return QVariantMap();
325 feedback->
setProgressText( QObject::tr(
"Creating output vector layer" ) );
328 QList<QgsMeshDatasetGroupMetadata> metaList;
329 metaList.reserve( mDataPerGroup.size() );
330 for (
const DataGroup &dataGroup : std::as_const( mDataPerGroup ) )
331 metaList.append( dataGroup.metadata );
332 QgsFields fields = createFields( metaList, mExportVectorOption );
336 std::unique_ptr<QgsFeatureSink> sink( parameterAsSink( parameters, u
"OUTPUT"_s, context, identifier, fields, sinkGeometryType(), outputCrs ) );
338 return QVariantMap();
343 return QVariantMap();
345 feedback->
setProgressText( QObject::tr(
"Creating points for each vertices" ) );
348 for (
int i = 0; i < mElementCount; ++i )
351 for (
const DataGroup &dataGroup : std::as_const( mDataPerGroup ) )
354 addAttributes( value, attributes, dataGroup.metadata.isVector(), mExportVectorOption );
365 geom = meshElement( i );
367 feedback->
reportError( QObject::tr(
"Could not transform point to destination CRS" ) );
380 return QVariantMap();
389 ret[u
"OUTPUT"_s] = identifier;
394QString QgsExportMeshFacesAlgorithm::shortHelpString()
const
396 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." );
399QString QgsExportMeshFacesAlgorithm::shortDescription()
const
401 return QObject::tr(
"Exports mesh faces to a polygon vector layer." );
404QString QgsExportMeshFacesAlgorithm::name()
const
406 return u
"exportmeshfaces"_s;
409QString QgsExportMeshFacesAlgorithm::displayName()
const
411 return QObject::tr(
"Export mesh faces" );
416 return new QgsExportMeshFacesAlgorithm();
419QgsGeometry QgsExportMeshFacesAlgorithm::meshElement(
int index )
const
421 const QgsMeshFace &face = mNativeMesh.face( index );
422 QVector<QgsPoint> vertices( face.size() );
423 for (
int i = 0; i < face.size(); ++i )
424 vertices[i] = mNativeMesh.vertex( face.at( i ) );
425 auto polygon = std::make_unique<QgsPolygon>();
430QString QgsExportMeshEdgesAlgorithm::shortHelpString()
const
432 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." );
435QString QgsExportMeshEdgesAlgorithm::shortDescription()
const
437 return QObject::tr(
"Exports mesh edges to a line vector layer." );
440QString QgsExportMeshEdgesAlgorithm::name()
const
442 return u
"exportmeshedges"_s;
445QString QgsExportMeshEdgesAlgorithm::displayName()
const
447 return QObject::tr(
"Export mesh edges" );
452 return new QgsExportMeshEdgesAlgorithm();
455QgsGeometry QgsExportMeshEdgesAlgorithm::meshElement(
int index )
const
457 const QgsMeshEdge &edge = mNativeMesh.edge( index );
458 QVector<QgsPoint> vertices( 2 );
459 vertices[0] = mNativeMesh.vertex( edge.first );
460 vertices[1] = mNativeMesh.vertex( edge.second );
465QString QgsExportMeshOnGridAlgorithm::name()
const
467 return u
"exportmeshongrid"_s;
470QString QgsExportMeshOnGridAlgorithm::displayName()
const
472 return QObject::tr(
"Export mesh on grid" );
475QString QgsExportMeshOnGridAlgorithm::group()
const
477 return QObject::tr(
"Mesh" );
480QString QgsExportMeshOnGridAlgorithm::groupId()
const
485QString QgsExportMeshOnGridAlgorithm::shortHelpString()
const
488 "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"
489 "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 "
491 "1D meshes are not supported."
495QString QgsExportMeshOnGridAlgorithm::shortDescription()
const
497 return QObject::tr(
"Exports mesh dataset values to a gridded point vector layer." );
502 return new QgsExportMeshOnGridAlgorithm();
505void QgsExportMeshOnGridAlgorithm::initAlgorithm(
const QVariantMap &configuration )
507 Q_UNUSED( configuration );
519 addParameter(
new QgsProcessingParameterCrs( u
"CRS_OUTPUT"_s, QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
521 QStringList exportVectorOptions;
522 exportVectorOptions << QObject::tr(
"Cartesian (x,y)" ) << QObject::tr(
"Polar (magnitude,degree)" ) << QObject::tr(
"Cartesian and Polar" );
523 addParameter(
new QgsProcessingParameterEnum( u
"VECTOR_OPTION"_s, QObject::tr(
"Export vector option" ), exportVectorOptions,
false, 0 ) );
527static void extractDatasetValues(
528 const QList<int> &datasetGroups,
532 const QSet<int> supportedDataType,
533 QList<DataGroup> &datasetPerGroup,
537 for (
int i = 0; i < datasetGroups.count(); ++i )
539 int groupIndex = datasetGroups.at( i );
544 if ( supportedDataType.contains( dataGroup.metadata.dataType() ) )
547 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, valueCount );
551 dataGroup.dataset3dStakedValue = meshLayer->
dataset3dValues( datasetIndex, 0, valueCount );
553 datasetPerGroup.append( dataGroup );
556 feedback->
setProgress( 100 * i / datasetGroups.count() );
562 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
564 if ( !meshLayer || !meshLayer->
isValid() )
569 outputCrs = meshLayer->
crs();
584 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
585 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
587 extractDatasetValues( datasetGroups, meshLayer, nativeMesh, relativeTime, supportedDataType(), mDataPerGroup, feedback );
588 mTriangularMesh.update( meshLayer->
nativeMesh(), mTransform );
590 mExportVectorOption = parameterAsInt( parameters, u
"VECTOR_OPTION"_s, context );
600 return QVariantMap();
602 feedback->
setProgressText( QObject::tr(
"Creating output vector layer" ) );
607 for ( DataGroup &dataGroup : mDataPerGroup )
609 if ( dataGroup.dataset3dStakedValue.isValid() )
610 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
613 QList<QgsMeshDatasetGroupMetadata> metaList;
614 metaList.reserve( mDataPerGroup.size() );
615 for (
const DataGroup &dataGroup : std::as_const( mDataPerGroup ) )
616 metaList.append( dataGroup.metadata );
617 QgsFields fields = createFields( metaList, mExportVectorOption );
622 std::unique_ptr<QgsFeatureSink> sink( parameterAsSink( parameters, u
"OUTPUT"_s, context, identifier, fields,
Qgis::WkbType::Point, outputCrs ) );
624 return QVariantMap();
629 return QVariantMap();
635 const double gridSpacing = parameterAsDouble( parameters, u
"GRID_SPACING"_s, context );
641 QgsRectangle extent = parameterAsExtent( parameters, u
"EXTENT"_s, context );
643 extent = mTriangularMesh.extent();
644 int pointXCount = int( extent.
width() / gridSpacing ) + 1;
645 int pointYCount = int( extent.
height() / gridSpacing ) + 1;
647 for (
int ix = 0; ix < pointXCount; ++ix )
649 for (
int iy = 0; iy < pointYCount; ++iy )
652 int triangularFaceIndex = mTriangularMesh.faceIndexForPoint_v2( point );
653 if ( triangularFaceIndex >= 0 )
657 int nativeFaceIndex = mTriangularMesh.trianglesToNativeFaces().at( triangularFaceIndex );
658 for (
int i = 0; i < mDataPerGroup.count(); ++i )
660 const DataGroup &dataGroup = mDataPerGroup.at( i );
661 bool faceActive = dataGroup.activeFaces.active( nativeFaceIndex );
664 QgsMeshDatasetValue value = extractDatasetValue( point, nativeFaceIndex, triangularFaceIndex, mTriangularMesh, dataGroup.activeFaces, dataGroup.datasetValues, dataGroup.metadata );
666 if ( dataGroup.metadata.isVector() )
668 QVector<double> vector = vectorValue( dataGroup.datasetValues.value( i ), mExportVectorOption );
669 for (
double v : vector )
671 attributes.append( v );
675 attributes.append( value.
scalar() );
686 feedback->
reportError( QObject::tr(
"Could not transform point to destination CRS" ) );
707 ret[u
"OUTPUT"_s] = identifier;
712QSet<int> QgsExportMeshOnGridAlgorithm::supportedDataType()
717QString QgsMeshRasterizeAlgorithm::name()
const
719 return u
"meshrasterize"_s;
722QString QgsMeshRasterizeAlgorithm::displayName()
const
724 return QObject::tr(
"Rasterize mesh dataset" );
727QString QgsMeshRasterizeAlgorithm::group()
const
729 return QObject::tr(
"Mesh" );
732QString QgsMeshRasterizeAlgorithm::groupId()
const
737QString QgsMeshRasterizeAlgorithm::shortHelpString()
const
740 "This algorithm creates a raster layer from a mesh dataset.\n"
741 "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 "
743 "1D meshes are not supported."
747QString QgsMeshRasterizeAlgorithm::shortDescription()
const
749 return QObject::tr(
"Creates a raster layer from a mesh dataset." );
754 return new QgsMeshRasterizeAlgorithm();
757void QgsMeshRasterizeAlgorithm::initAlgorithm(
const QVariantMap &configuration )
759 Q_UNUSED( configuration );
769 addParameter(
new QgsProcessingParameterCrs( u
"CRS_OUTPUT"_s, QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
773 auto createOptsParam = std::make_unique<QgsProcessingParameterString>( u
"CREATE_OPTIONS"_s, QObject::tr(
"Creation options" ), QVariant(),
false,
true );
774 createOptsParam->setMetadata( QVariantMap( { { u
"widget_wrapper"_s, QVariantMap( { { u
"widget_type"_s, u
"rasteroptions"_s } } ) } } ) );
776 addParameter( createOptsParam.release() );
778 auto creationOptsParam = std::make_unique<QgsProcessingParameterString>( u
"CREATION_OPTIONS"_s, QObject::tr(
"Creation options" ), QVariant(),
false,
true );
779 creationOptsParam->setMetadata( QVariantMap( { { u
"widget_wrapper"_s, QVariantMap( { { u
"widget_type"_s, u
"rasteroptions"_s } } ) } } ) );
781 addParameter( creationOptsParam.release() );
788 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
790 if ( !meshLayer || !meshLayer->
isValid() )
795 outputCrs = meshLayer->
crs();
800 mTriangularMesh.update( meshLayer->
nativeMesh(), mTransform );
810 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
811 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
813 extractDatasetValues( datasetGroups, meshLayer, *meshLayer->
nativeMesh(), relativeTime, supportedDataType(), mDataPerGroup, feedback );
825 return QVariantMap();
832 for ( DataGroup &dataGroup : mDataPerGroup )
834 if ( dataGroup.dataset3dStakedValue.isValid() )
835 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue, feedback );
842 const double pixelSize = parameterAsDouble( parameters, u
"PIXEL_SIZE"_s, context );
848 QgsRectangle extent = parameterAsExtent( parameters, u
"EXTENT"_s, context );
850 extent = mTriangularMesh.extent();
852 int width = extent.
width() / pixelSize;
853 int height = extent.
height() / pixelSize;
855 QString creationOptions = parameterAsString( parameters, u
"CREATION_OPTIONS"_s, context ).trimmed();
857 const QString optionsString = parameterAsString( parameters, u
"CREATE_OPTIONS"_s, context );
858 if ( !optionsString.isEmpty() )
859 creationOptions = optionsString;
861 const QString fileName = parameterAsOutputLayer( parameters, u
"OUTPUT"_s, context );
862 const QString outputFormat = parameterAsOutputRasterFormat( parameters, u
"OUTPUT"_s, context );
864 rasterFileWriter.setOutputProviderKey( u
"gdal"_s );
865 if ( !creationOptions.isEmpty() )
867 rasterFileWriter.setCreationOptions( creationOptions.split(
'|' ) );
869 rasterFileWriter.setOutputFormat( outputFormat );
871 std::unique_ptr<QgsRasterDataProvider> rasterDataProvider( rasterFileWriter.createMultiBandRaster(
Qgis::DataType::Float64, width, height, extent, mTransform.destinationCrs(), mDataPerGroup.count() ) );
872 if ( !rasterDataProvider )
874 if ( !rasterDataProvider->isEditable() && !rasterDataProvider->setEditable(
true ) )
875 throw QgsProcessingException( QObject::tr(
"Could not create raster output: %1" ).arg( rasterDataProvider->error().summary() ) );
877 const bool hasReportsDuringClose = rasterDataProvider->hasReportsDuringClose();
878 const double maxProgressDuringBlockWriting = hasReportsDuringClose ? 50.0 : 100.0;
880 for (
int i = 0; i < mDataPerGroup.count(); ++i )
882 const DataGroup &dataGroup = mDataPerGroup.at( i );
887 if ( dataGroup.datasetValues.isValid() )
889 std::unique_ptr<QgsRasterBlock> block(
890 QgsMeshUtils::exportRasterBlock( mTriangularMesh, dataGroup.datasetValues, dataGroup.activeFaces, dataGroup.metadata.dataType(), mTransform, pixelSize, extent, &rasterBlockFeedBack )
896 if ( !rasterDataProvider->writeBlock( block.get(), i + 1 ) )
898 throw QgsProcessingException( QObject::tr(
"Could not write raster block: %1" ).arg( rasterDataProvider->error().summary() ) );
900 rasterDataProvider->setNoDataValue( i + 1, block->noDataValue() );
903 rasterDataProvider->setNoDataValue( i + 1, std::numeric_limits<double>::quiet_NaN() );
908 return QVariantMap();
909 feedback->
setProgress( maxProgressDuringBlockWriting * i / mDataPerGroup.count() );
913 rasterDataProvider->setEditable(
false );
916 feedback->
setProgress( maxProgressDuringBlockWriting );
918 if ( feedback && hasReportsDuringClose )
921 if ( !rasterDataProvider->closeWithProgress( scaledFeedback.get() ) )
930 ret[u
"OUTPUT"_s] = fileName;
935QSet<int> QgsMeshRasterizeAlgorithm::supportedDataType()
940QString QgsMeshContoursAlgorithm::name()
const
942 return u
"meshcontours"_s;
945QString QgsMeshContoursAlgorithm::displayName()
const
947 return QObject::tr(
"Export contours" );
950QString QgsMeshContoursAlgorithm::group()
const
952 return QObject::tr(
"Mesh" );
955QString QgsMeshContoursAlgorithm::groupId()
const
960QString QgsMeshContoursAlgorithm::shortHelpString()
const
962 return QObject::tr(
"This algorithm creates contours as a vector layer from a mesh scalar dataset." );
965QString QgsMeshContoursAlgorithm::shortDescription()
const
967 return QObject::tr(
"Creates contours as vector layer from mesh scalar dataset." );
972 return new QgsMeshContoursAlgorithm();
975void QgsMeshContoursAlgorithm::initAlgorithm(
const QVariantMap &configuration )
977 Q_UNUSED( configuration );
990 auto contourLevelList = std::make_unique<QgsProcessingParameterString>( u
"CONTOUR_LEVEL_LIST"_s, QObject::tr(
"List of contours level" ), QVariant(),
false,
true );
991 contourLevelList->setHelp( QObject::tr(
"Comma separated list of values to export. If filled, the increment, minimum and maximum settings are ignored." ) );
992 addParameter( contourLevelList.release() );
994 addParameter(
new QgsProcessingParameterCrs( u
"CRS_OUTPUT"_s, QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
1003 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
1005 if ( !meshLayer || !meshLayer->
isValid() )
1010 outputCrs = meshLayer->
crs();
1015 mTriangularMesh.update( meshLayer->
nativeMesh(), mTransform );
1021 QString levelsString = parameterAsString( parameters, u
"CONTOUR_LEVEL_LIST"_s, context );
1022 if ( !levelsString.isEmpty() )
1024 QStringList levelStringList = levelsString.split(
',' );
1025 if ( !levelStringList.isEmpty() )
1027 for (
const QString &stringVal : levelStringList )
1030 double val = stringVal.toDouble( &ok );
1032 mLevels.append( val );
1034 throw QgsProcessingException( QObject::tr(
"Invalid format for level values, must be numbers separated with comma" ) );
1036 if ( mLevels.count() >= 2 )
1037 if ( mLevels.last() <= mLevels.at( mLevels.count() - 2 ) )
1038 throw QgsProcessingException( QObject::tr(
"Invalid format for level values, must be different numbers and in increasing order" ) );
1043 if ( mLevels.isEmpty() )
1045 double minimum = parameterAsDouble( parameters, u
"MINIMUM"_s, context );
1046 double maximum = parameterAsDouble( parameters, u
"MAXIMUM"_s, context );
1047 double interval = parameterAsDouble( parameters, u
"INCREMENT"_s, context );
1049 if ( interval <= 0 )
1052 if ( minimum >= maximum )
1053 throw QgsProcessingException( QObject::tr(
"Invalid minimum and maximum values, minimum must be lesser than maximum" ) );
1055 if ( interval > ( maximum - minimum ) )
1056 throw QgsProcessingException( QObject::tr(
"Invalid minimum, maximum and interval values, difference between minimum and maximum must be greater or equal than interval" ) );
1058 int intervalCount = ( maximum - minimum ) / interval;
1060 mLevels.reserve( intervalCount );
1061 for (
int i = 0; i < intervalCount; ++i )
1063 mLevels.append( minimum + i * interval );
1076 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
1077 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
1081 extractDatasetValues( datasetGroups, meshLayer, mNativeMesh, relativeTime, supportedDataType(), mDataPerGroup, feedback );
1092 for ( DataGroup &dataGroup : mDataPerGroup )
1094 if ( dataGroup.dataset3dStakedValue.isValid() )
1095 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
1101 polygonFields.
append(
QgsField( QObject::tr(
"group" ), QMetaType::Type::QString ) );
1102 polygonFields.
append(
QgsField( QObject::tr(
"time" ), QMetaType::Type::QString ) );
1103 polygonFields.
append(
QgsField( QObject::tr(
"min_value" ), QMetaType::Type::Double ) );
1104 polygonFields.
append(
QgsField( QObject::tr(
"max_value" ), QMetaType::Type::Double ) );
1105 lineFields.
append(
QgsField( QObject::tr(
"group" ), QMetaType::Type::QString ) );
1106 lineFields.
append(
QgsField( QObject::tr(
"time" ), QMetaType::Type::QString ) );
1107 lineFields.
append(
QgsField( QObject::tr(
"value" ), QMetaType::Type::Double ) );
1111 QString lineIdentifier;
1112 QString polygonIdentifier;
1113 std::unique_ptr<QgsFeatureSink> sinkPolygons( parameterAsSink( parameters, u
"OUTPUT_POLYGONS"_s, context, polygonIdentifier, polygonFields,
Qgis::WkbType::PolygonZ, outputCrs ) );
1114 std::unique_ptr<QgsFeatureSink> sinkLines( parameterAsSink( parameters, u
"OUTPUT_LINES"_s, context, lineIdentifier, lineFields,
Qgis::WkbType::LineStringZ, outputCrs ) );
1116 if ( !sinkLines || !sinkPolygons )
1117 return QVariantMap();
1120 for (
int i = 0; i < mDataPerGroup.count(); ++i )
1122 DataGroup dataGroup = mDataPerGroup.at( i );
1124 int count = scalarDataOnVertices ? mNativeMesh.vertices.count() : mNativeMesh.faces.count();
1126 QVector<double> values;
1127 if ( dataGroup.datasetValues.isValid() )
1130 values = QgsMeshLayerUtils::calculateMagnitudes( dataGroup.datasetValues );
1134 values = QVector<double>( count, std::numeric_limits<double>::quiet_NaN() );
1137 if ( ( !scalarDataOnVertices ) )
1142 QgsMeshContours contoursExported( mTriangularMesh, mNativeMesh, values, dataGroup.activeFaces );
1145 firstAttributes.append( dataGroup.metadata.name() );
1146 firstAttributes.append( mDateTimeString );
1148 for (
double level : std::as_const( mLevels ) )
1150 QgsGeometry line = contoursExported.exportLines( level, feedback );
1152 return QVariantMap();
1156 lineAttributes.append( level );
1168 for (
int l = 0; l < mLevels.count() - 1; ++l )
1170 QgsGeometry polygon = contoursExported.exportPolygons( mLevels.at( l ), mLevels.at( l + 1 ), feedback );
1172 return QVariantMap();
1177 polygonAttributes.append( mLevels.at( l ) );
1178 polygonAttributes.append( mLevels.at( l + 1 ) );
1183 if ( !sinkPolygons->addFeature( polygonFeature ) )
1195 feedback->
setProgress( 100 * i / mDataPerGroup.count() );
1201 sinkPolygons->finalize();
1206 sinkLines->finalize();
1211 ret[u
"OUTPUT_LINES"_s] = lineIdentifier;
1212 ret[u
"OUTPUT_POLYGONS"_s] = polygonIdentifier;
1217QString QgsMeshExportCrossSection::name()
const
1219 return u
"meshexportcrosssection"_s;
1222QString QgsMeshExportCrossSection::displayName()
const
1224 return QObject::tr(
"Export cross section dataset values on lines from mesh" );
1227QString QgsMeshExportCrossSection::group()
const
1229 return QObject::tr(
"Mesh" );
1232QString QgsMeshExportCrossSection::groupId()
const
1237QString QgsMeshExportCrossSection::shortHelpString()
const
1240 "This algorithm extracts mesh's dataset values from line contained in a vector layer.\n"
1241 "Each line is discretized with a resolution distance parameter for extraction of values on its vertices."
1245QString QgsMeshExportCrossSection::shortDescription()
const
1247 return QObject::tr(
"Extracts a mesh dataset's values from lines contained in a vector layer." );
1252 return new QgsMeshExportCrossSection();
1255void QgsMeshExportCrossSection::initAlgorithm(
const QVariantMap &configuration )
1257 Q_UNUSED( configuration );
1265 QList<int> datatype;
1269 addParameter(
new QgsProcessingParameterDistance( u
"RESOLUTION"_s, QObject::tr(
"Line segmentation resolution" ), 10.0, u
"INPUT_LINES"_s,
false, 0 ) );
1280 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
1282 if ( !meshLayer || !meshLayer->
isValid() )
1285 mMeshLayerCrs = meshLayer->
crs();
1286 mTriangularMesh.update( meshLayer->
nativeMesh() );
1295 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
1296 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
1298 extractDatasetValues( datasetGroups, meshLayer, *meshLayer->
nativeMesh(), relativeTime, supportedDataType(), mDataPerGroup, feedback );
1311 for ( DataGroup &dataGroup : mDataPerGroup )
1313 if ( dataGroup.dataset3dStakedValue.isValid() )
1314 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
1316 double resolution = parameterAsDouble( parameters, u
"RESOLUTION"_s, context );
1317 int datasetDigits = parameterAsInt( parameters, u
"DATASET_DIGITS"_s, context );
1318 int coordDigits = parameterAsInt( parameters, u
"COORDINATES_DIGITS"_s, context );
1320 std::unique_ptr<QgsProcessingFeatureSource> featureSource( parameterAsSource( parameters, u
"INPUT_LINES"_s, context ) );
1321 if ( !featureSource )
1326 QString outputFileName = parameterAsFileOutput( parameters, u
"OUTPUT"_s, context );
1327 QFile file( outputFileName );
1328 if ( !file.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
1331 QTextStream textStream( &file );
1333 header << u
"fid"_s << u
"x"_s << u
"y"_s << QObject::tr(
"offset" );
1334 for (
const DataGroup &datagroup : std::as_const( mDataPerGroup ) )
1335 header << datagroup.metadata.name();
1336 textStream << header.join(
',' ) << u
"\n"_s;
1338 long long featCount = featureSource->featureCount();
1339 long long featCounter = 0;
1353 feedback->
reportError( QObject::tr(
"Could not transform line to mesh CRS" ) );
1359 while ( offset <= line.
length() )
1362 return QVariantMap();
1364 QStringList textLine;
1366 int triangularFaceIndex = mTriangularMesh.faceIndexForPoint_v2( point );
1367 textLine << QString::number( fid ) << QString::number( point.
x(),
'f', coordDigits ) << QString::number( point.
y(),
'f', coordDigits ) << QString::number( offset,
'f', coordDigits );
1368 if ( triangularFaceIndex >= 0 )
1372 int nativeFaceIndex = mTriangularMesh.trianglesToNativeFaces().at( triangularFaceIndex );
1373 for (
int i = 0; i < mDataPerGroup.count(); ++i )
1375 const DataGroup &dataGroup = mDataPerGroup.at( i );
1376 bool faceActive = dataGroup.activeFaces.active( nativeFaceIndex );
1379 QgsMeshDatasetValue value = extractDatasetValue( point, nativeFaceIndex, triangularFaceIndex, mTriangularMesh, dataGroup.activeFaces, dataGroup.datasetValues, dataGroup.metadata );
1381 if ( abs( value.
x() ) == std::numeric_limits<double>::quiet_NaN() )
1382 textLine << QString(
' ' );
1384 textLine << QString::number( value.
scalar(),
'f', datasetDigits );
1388 for (
int i = 0; i < mDataPerGroup.count(); ++i )
1389 textLine << QString(
' ' );
1391 textStream << textLine.join(
',' ) << u
"\n"_s;
1393 offset += resolution;
1398 feedback->
setProgress( 100.0 * featCounter / featCount );
1400 return QVariantMap();
1407 ret[u
"OUTPUT"_s] = outputFileName;
1411QString QgsMeshExportTimeSeries::name()
const
1413 return u
"meshexporttimeseries"_s;
1416QString QgsMeshExportTimeSeries::displayName()
const
1418 return QObject::tr(
"Export time series values from points of a mesh dataset" );
1421QString QgsMeshExportTimeSeries::group()
const
1423 return QObject::tr(
"Mesh" );
1426QString QgsMeshExportTimeSeries::groupId()
const
1431QString QgsMeshExportTimeSeries::shortHelpString()
const
1434 "This algorithm extracts mesh's dataset time series values from points contained in a vector layer.\n"
1435 "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."
1439QString QgsMeshExportTimeSeries::shortDescription()
const
1441 return QObject::tr(
"Extracts a mesh dataset's time series values from points contained in a vector layer." );
1446 return new QgsMeshExportTimeSeries();
1449void QgsMeshExportTimeSeries::initAlgorithm(
const QVariantMap &configuration )
1451 Q_UNUSED( configuration );
1463 QList<int> datatype;
1476 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
1478 if ( !meshLayer || !meshLayer->
isValid() )
1481 mMeshLayerCrs = meshLayer->
crs();
1482 mTriangularMesh.update( meshLayer->
nativeMesh() );
1492 QVariant parameterStartTimeVariant = parameters.value( u
"STARTING_TIME"_s );
1493 QgsInterval relativeStartTime = datasetRelativetime( parameterStartTimeVariant, meshLayer, context );
1495 QVariant parameterEndTimeVariant = parameters.value( u
"FINISHING_TIME"_s );
1496 QgsInterval relativeEndTime = datasetRelativetime( parameterEndTimeVariant, meshLayer, context );
1499 qint64 timeStepInterval = parameterAsDouble( parameters, u
"TIME_STEP"_s, context ) * 1000 * 3600;
1500 if ( timeStepInterval == 0 )
1503 for (
int groupIndex : datasetGroups )
1516 mRelativeTimeSteps.clear();
1517 mTimeStepString.clear();
1518 if ( timeStepInterval != 0 )
1520 mRelativeTimeSteps.append( relativeStartTime.
seconds() * 1000 );
1521 while ( mRelativeTimeSteps.last() < relativeEndTime.
seconds() * 1000 )
1522 mRelativeTimeSteps.append( mRelativeTimeSteps.last() + timeStepInterval );
1524 for ( qint64 relativeTimeStep : std::as_const( mRelativeTimeSteps ) )
1526 mTimeStepString.append( meshLayer->
formatTime( relativeTimeStep / 3600.0 / 1000.0 ) );
1531 for (
int i = 0; i < datasetGroups.count(); ++i )
1533 int groupIndex = datasetGroups.at( i );
1535 if ( supportedDataType().contains( meta.
dataType() ) )
1537 mGroupIndexes.append( groupIndex );
1538 mGroupsMetadata[groupIndex] = meta;
1541 if ( !mRelativeTimeSteps.isEmpty() )
1545 for ( qint64 relativeTimeStep : std::as_const( mRelativeTimeSteps ) )
1547 QMap<int, int> &groupIndexToData = mRelativeTimeToData[relativeTimeStep];
1548 QgsInterval timeStepInterval( relativeTimeStep / 1000.0 );
1550 if ( !datasetIndex.
isValid() )
1552 if ( datasetIndex != lastDatasetIndex )
1554 DataGroup dataGroup;
1555 dataGroup.metadata = meta;
1556 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, valueCount );
1560 dataGroup.dataset3dStakedValue = meshLayer->
dataset3dValues( datasetIndex, 0, valueCount );
1562 mDatasets.append( dataGroup );
1563 lastDatasetIndex = datasetIndex;
1565 groupIndexToData[groupIndex] = mDatasets.count() - 1;
1571 QMap<int, int> &groupIndexToData = mRelativeTimeToData[0];
1573 DataGroup dataGroup;
1574 dataGroup.metadata = meta;
1575 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, valueCount );
1579 dataGroup.dataset3dStakedValue = meshLayer->
dataset3dValues( datasetIndex, 0, valueCount );
1581 mDatasets.append( dataGroup );
1582 groupIndexToData[groupIndex] = mDatasets.
count() - 1;
1587 feedback->
setProgress( 100 * i / datasetGroups.count() );
1603 for ( DataGroup &dataGroup : mDatasets )
1605 if ( dataGroup.dataset3dStakedValue.isValid() )
1606 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
1609 int datasetDigits = parameterAsInt( parameters, u
"DATASET_DIGITS"_s, context );
1610 int coordDigits = parameterAsInt( parameters, u
"COORDINATES_DIGITS"_s, context );
1612 std::unique_ptr<QgsProcessingFeatureSource> featureSource( parameterAsSource( parameters, u
"INPUT_POINTS"_s, context ) );
1613 if ( !featureSource )
1618 QString outputFileName = parameterAsFileOutput( parameters, u
"OUTPUT"_s, context );
1619 QFile file( outputFileName );
1620 if ( !file.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
1623 QTextStream textStream( &file );
1625 header << u
"fid"_s << u
"x"_s << u
"y"_s << QObject::tr(
"time" );
1627 for (
int gi : std::as_const( mGroupIndexes ) )
1628 header << mGroupsMetadata.value( gi ).name();
1630 textStream << header.join(
',' ) << u
"\n"_s;
1632 long long featCount = featureSource->featureCount();
1633 long long featCounter = 0;
1647 feedback->
reportError( QObject::tr(
"Could not transform line to mesh CRS" ) );
1654 int triangularFaceIndex = mTriangularMesh.faceIndexForPoint_v2( point );
1656 if ( triangularFaceIndex >= 0 )
1658 int nativeFaceIndex = mTriangularMesh.trianglesToNativeFaces().at( triangularFaceIndex );
1659 if ( !mRelativeTimeSteps.isEmpty() )
1661 for (
int timeIndex = 0; timeIndex < mRelativeTimeSteps.count(); ++timeIndex )
1663 qint64 timeStep = mRelativeTimeSteps.at( timeIndex );
1664 QStringList textLine;
1665 textLine << QString::number( fid ) << QString::number( point.
x(),
'f', coordDigits ) << QString::number( point.
y(),
'f', coordDigits ) << mTimeStepString.at( timeIndex );
1667 if ( mRelativeTimeToData.contains( timeStep ) )
1669 const QMap<int, int> &groupToData = mRelativeTimeToData.value( timeStep );
1670 for (
int groupIndex : std::as_const( mGroupIndexes ) )
1672 if ( !groupToData.contains( groupIndex ) )
1674 int dataIndex = groupToData.value( groupIndex );
1675 if ( dataIndex < 0 || dataIndex > mDatasets.count() - 1 )
1678 const DataGroup &dataGroup = mDatasets.at( dataIndex );
1679 QgsMeshDatasetValue value = extractDatasetValue( point, nativeFaceIndex, triangularFaceIndex, mTriangularMesh, dataGroup.activeFaces, dataGroup.datasetValues, dataGroup.metadata );
1680 if ( abs( value.
x() ) == std::numeric_limits<double>::quiet_NaN() )
1681 textLine << QString(
' ' );
1683 textLine << QString::number( value.
scalar(),
'f', datasetDigits );
1686 textStream << textLine.join(
',' ) << u
"\n"_s;
1691 QStringList textLine;
1692 textLine << QString::number( fid ) << QString::number( point.
x(),
'f', coordDigits ) << QString::number( point.
y(),
'f', coordDigits ) << QObject::tr(
"static dataset" );
1693 const QMap<int, int> &groupToData = mRelativeTimeToData.value( 0 );
1694 for (
int groupIndex : std::as_const( mGroupIndexes ) )
1696 if ( !groupToData.contains( groupIndex ) )
1698 int dataIndex = groupToData.value( groupIndex );
1699 if ( dataIndex < 0 || dataIndex > mDatasets.count() - 1 )
1701 const DataGroup &dataGroup = mDatasets.at( dataIndex );
1702 QgsMeshDatasetValue value = extractDatasetValue( point, nativeFaceIndex, triangularFaceIndex, mTriangularMesh, dataGroup.activeFaces, dataGroup.datasetValues, dataGroup.metadata );
1703 if ( abs( value.
x() ) == std::numeric_limits<double>::quiet_NaN() )
1704 textLine << QString(
' ' );
1706 textLine << QString::number( value.
scalar(),
'f', datasetDigits );
1708 textStream << textLine.join(
',' ) << u
"\n"_s;
1714 feedback->
setProgress( 100.0 * featCounter / featCount );
1716 return QVariantMap();
1723 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.