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 );
171QString QgsExportMeshOnElement::group()
const
173 return QObject::tr(
"Mesh" );
176QString QgsExportMeshOnElement::groupId()
const
181void QgsExportMeshOnElement::initAlgorithm(
const QVariantMap &configuration )
183 Q_UNUSED( configuration );
192 addParameter(
new QgsProcessingParameterCrs( u
"CRS_OUTPUT"_s, QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
194 QStringList exportVectorOptions;
195 exportVectorOptions << QObject::tr(
"Cartesian (x,y)" ) << QObject::tr(
"Polar (magnitude,degree)" ) << QObject::tr(
"Cartesian and Polar" );
196 addParameter(
new QgsProcessingParameterEnum( u
"VECTOR_OPTION"_s, QObject::tr(
"Export vector option" ), exportVectorOptions,
false, 0 ) );
206 if ( timeType ==
"dataset-time-step"_L1 )
211 else if ( timeType ==
"defined-date-time"_L1 )
214 if ( dateTime.isValid() )
215 relativeTime =
QgsInterval( layerReferenceTime.secsTo( dateTime ) );
217 else if ( timeType ==
"current-context-time"_L1 )
220 if ( dateTime.isValid() )
221 relativeTime =
QgsInterval( layerReferenceTime.secsTo( dateTime ) );
230 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
232 if ( !meshLayer || !meshLayer->
isValid() )
240 outputCrs = meshLayer->
crs();
255 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
256 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
258 switch ( meshElementType() )
261 mElementCount = mNativeMesh.faceCount();
264 mElementCount = mNativeMesh.vertexCount();
267 mElementCount = mNativeMesh.edgeCount();
271 for (
int i = 0; i < datasetGroups.count(); ++i )
273 int groupIndex = datasetGroups.at( i );
278 if ( supportedDataType().contains( dataGroup.metadata.dataType() ) )
280 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, mElementCount );
281 mDataPerGroup.append( dataGroup );
284 feedback->
setProgress( 100 * i / datasetGroups.count() );
287 mExportVectorOption = parameterAsInt( parameters, u
"VECTOR_OPTION"_s, context );
294 QGS_MARK_ALGORITHM_SOURCE
299 return QVariantMap();
301 feedback->
setProgressText( QObject::tr(
"Creating output vector layer" ) );
304 QList<QgsMeshDatasetGroupMetadata> metaList;
305 metaList.reserve( mDataPerGroup.size() );
306 for (
const DataGroup &dataGroup : std::as_const( mDataPerGroup ) )
307 metaList.append( dataGroup.metadata );
308 QgsFields fields = createFields( metaList, mExportVectorOption );
312 std::unique_ptr<QgsFeatureSink> sink( parameterAsSink( parameters, u
"OUTPUT"_s, context, identifier, fields, sinkGeometryType(), outputCrs ) );
314 return QVariantMap();
319 return QVariantMap();
321 feedback->
setProgressText( QObject::tr(
"Creating points for each vertices" ) );
324 for (
int i = 0; i < mElementCount; ++i )
327 for (
const DataGroup &dataGroup : std::as_const( mDataPerGroup ) )
330 addAttributes( value, attributes, dataGroup.metadata.isVector(), mExportVectorOption );
341 geom = meshElement( i );
343 feedback->
reportError( QObject::tr(
"Could not transform point to destination CRS" ) );
356 return QVariantMap();
365 ret[u
"OUTPUT"_s] = identifier;
374QString QgsExportMeshVerticesAlgorithm::shortHelpString()
const
376 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." );
379QString QgsExportMeshVerticesAlgorithm::shortDescription()
const
381 return QObject::tr(
"Exports mesh vertices to a point vector layer." );
384QString QgsExportMeshVerticesAlgorithm::name()
const
386 return u
"exportmeshvertices"_s;
389QString QgsExportMeshVerticesAlgorithm::displayName()
const
391 return QObject::tr(
"Export mesh vertices" );
394QStringList QgsExportMeshVerticesAlgorithm::tags()
const
396 return QObject::tr(
"mesh,export,vertices,points,attributes,vector,dataset" ).split(
',' );
401 return new QgsExportMeshVerticesAlgorithm();
404QgsGeometry QgsExportMeshVerticesAlgorithm::meshElement(
int index )
const
406 QGS_MARK_ALGORITHM_SOURCE
415QString QgsExportMeshFacesAlgorithm::shortHelpString()
const
417 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." );
420QString QgsExportMeshFacesAlgorithm::shortDescription()
const
422 return QObject::tr(
"Exports mesh faces to a polygon vector layer." );
425QString QgsExportMeshFacesAlgorithm::name()
const
427 return u
"exportmeshfaces"_s;
430QString QgsExportMeshFacesAlgorithm::displayName()
const
432 return QObject::tr(
"Export mesh faces" );
435QStringList QgsExportMeshFacesAlgorithm::tags()
const
437 return QObject::tr(
"mesh,export,faces,polygons,attributes,vector,dataset" ).split(
',' );
442 return new QgsExportMeshFacesAlgorithm();
445QgsGeometry QgsExportMeshFacesAlgorithm::meshElement(
int index )
const
447 QGS_MARK_ALGORITHM_SOURCE
449 const QgsMeshFace &face = mNativeMesh.face( index );
450 QVector<QgsPoint> vertices( face.size() );
451 for (
int i = 0; i < face.size(); ++i )
452 vertices[i] = mNativeMesh.vertex( face.at( i ) );
453 auto polygon = std::make_unique<QgsPolygon>();
462QString QgsExportMeshEdgesAlgorithm::shortHelpString()
const
464 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." );
467QString QgsExportMeshEdgesAlgorithm::shortDescription()
const
469 return QObject::tr(
"Exports mesh edges to a line vector layer." );
472QString QgsExportMeshEdgesAlgorithm::name()
const
474 return u
"exportmeshedges"_s;
477QString QgsExportMeshEdgesAlgorithm::displayName()
const
479 return QObject::tr(
"Export mesh edges" );
482QStringList QgsExportMeshEdgesAlgorithm::tags()
const
484 return QObject::tr(
"mesh,export,edges,lines,attributes,vector,dataset" ).split(
',' );
489 return new QgsExportMeshEdgesAlgorithm();
492QgsGeometry QgsExportMeshEdgesAlgorithm::meshElement(
int index )
const
494 QGS_MARK_ALGORITHM_SOURCE
496 const QgsMeshEdge &edge = mNativeMesh.edge( index );
497 QVector<QgsPoint> vertices( 2 );
498 vertices[0] = mNativeMesh.vertex( edge.first );
499 vertices[1] = mNativeMesh.vertex( edge.second );
507QString QgsExportMeshOnGridAlgorithm::name()
const
509 return u
"exportmeshongrid"_s;
512QString QgsExportMeshOnGridAlgorithm::displayName()
const
514 return QObject::tr(
"Export mesh on grid" );
517QStringList QgsExportMeshOnGridAlgorithm::tags()
const
519 return QObject::tr(
"mesh,export,grid,regular,points,attributes,vector,dataset,interpolation" ).split(
',' );
522QString QgsExportMeshOnGridAlgorithm::group()
const
524 return QObject::tr(
"Mesh" );
527QString QgsExportMeshOnGridAlgorithm::groupId()
const
532QString QgsExportMeshOnGridAlgorithm::shortHelpString()
const
535 "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"
536 "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 "
538 "1D meshes are not supported."
542QString QgsExportMeshOnGridAlgorithm::shortDescription()
const
544 return QObject::tr(
"Exports mesh dataset values to a gridded point vector layer." );
549 return new QgsExportMeshOnGridAlgorithm();
552void QgsExportMeshOnGridAlgorithm::initAlgorithm(
const QVariantMap &configuration )
554 Q_UNUSED( configuration );
566 addParameter(
new QgsProcessingParameterCrs( u
"CRS_OUTPUT"_s, QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
568 QStringList exportVectorOptions;
569 exportVectorOptions << QObject::tr(
"Cartesian (x,y)" ) << QObject::tr(
"Polar (magnitude,degree)" ) << QObject::tr(
"Cartesian and Polar" );
570 addParameter(
new QgsProcessingParameterEnum( u
"VECTOR_OPTION"_s, QObject::tr(
"Export vector option" ), exportVectorOptions,
false, 0 ) );
574static void extractDatasetValues(
575 const QList<int> &datasetGroups,
579 const QSet<int> supportedDataType,
580 QList<DataGroup> &datasetPerGroup,
584 for (
int i = 0; i < datasetGroups.count(); ++i )
586 int groupIndex = datasetGroups.at( i );
591 if ( supportedDataType.contains( dataGroup.metadata.dataType() ) )
594 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, valueCount );
598 dataGroup.dataset3dStakedValue = meshLayer->
dataset3dValues( datasetIndex, 0, valueCount );
600 datasetPerGroup.append( dataGroup );
603 feedback->
setProgress( 100 * i / datasetGroups.count() );
609 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
611 if ( !meshLayer || !meshLayer->
isValid() )
616 outputCrs = meshLayer->
crs();
631 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
632 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
634 extractDatasetValues( datasetGroups, meshLayer, nativeMesh, relativeTime, supportedDataType(), mDataPerGroup, feedback );
635 mTriangularMesh.update( meshLayer->
nativeMesh(), mTransform );
637 mExportVectorOption = parameterAsInt( parameters, u
"VECTOR_OPTION"_s, context );
644 QGS_MARK_ALGORITHM_SOURCE
649 return QVariantMap();
651 feedback->
setProgressText( QObject::tr(
"Creating output vector layer" ) );
656 for ( DataGroup &dataGroup : mDataPerGroup )
658 if ( dataGroup.dataset3dStakedValue.isValid() )
659 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
662 QList<QgsMeshDatasetGroupMetadata> metaList;
663 metaList.reserve( mDataPerGroup.size() );
664 for (
const DataGroup &dataGroup : std::as_const( mDataPerGroup ) )
665 metaList.append( dataGroup.metadata );
666 QgsFields fields = createFields( metaList, mExportVectorOption );
671 std::unique_ptr<QgsFeatureSink> sink( parameterAsSink( parameters, u
"OUTPUT"_s, context, identifier, fields,
Qgis::WkbType::Point, outputCrs ) );
673 return QVariantMap();
678 return QVariantMap();
684 const double gridSpacing = parameterAsDouble( parameters, u
"GRID_SPACING"_s, context );
690 QgsRectangle extent = parameterAsExtent( parameters, u
"EXTENT"_s, context );
692 extent = mTriangularMesh.extent();
693 int pointXCount = int( extent.
width() / gridSpacing ) + 1;
694 int pointYCount = int( extent.
height() / gridSpacing ) + 1;
696 for (
int ix = 0; ix < pointXCount; ++ix )
698 for (
int iy = 0; iy < pointYCount; ++iy )
701 int triangularFaceIndex = mTriangularMesh.faceIndexForPoint_v2( point );
702 if ( triangularFaceIndex >= 0 )
706 int nativeFaceIndex = mTriangularMesh.trianglesToNativeFaces().at( triangularFaceIndex );
707 for (
int i = 0; i < mDataPerGroup.count(); ++i )
709 const DataGroup &dataGroup = mDataPerGroup.at( i );
710 bool faceActive = dataGroup.activeFaces.active( nativeFaceIndex );
713 QgsMeshDatasetValue value = extractDatasetValue( point, nativeFaceIndex, triangularFaceIndex, mTriangularMesh, dataGroup.activeFaces, dataGroup.datasetValues, dataGroup.metadata );
715 if ( dataGroup.metadata.isVector() )
717 QVector<double> vector = vectorValue( dataGroup.datasetValues.value( i ), mExportVectorOption );
718 for (
double v : vector )
720 attributes.append( v );
724 attributes.append( value.
scalar() );
735 feedback->
reportError( QObject::tr(
"Could not transform point to destination CRS" ) );
756 ret[u
"OUTPUT"_s] = identifier;
761QSet<int> QgsExportMeshOnGridAlgorithm::supportedDataType()
770QString QgsMeshRasterizeAlgorithm::name()
const
772 return u
"meshrasterize"_s;
775QString QgsMeshRasterizeAlgorithm::displayName()
const
777 return QObject::tr(
"Rasterize mesh dataset" );
780QStringList QgsMeshRasterizeAlgorithm::tags()
const
782 return QObject::tr(
"mesh,rasterize,raster,convert,grid,export,dataset" ).split(
',' );
785QString QgsMeshRasterizeAlgorithm::group()
const
787 return QObject::tr(
"Mesh" );
790QString QgsMeshRasterizeAlgorithm::groupId()
const
795QString QgsMeshRasterizeAlgorithm::shortHelpString()
const
798 "This algorithm creates a raster layer from a mesh dataset.\n"
799 "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 "
801 "1D meshes are not supported."
805QString QgsMeshRasterizeAlgorithm::shortDescription()
const
807 return QObject::tr(
"Creates a raster layer from a mesh dataset." );
812 return new QgsMeshRasterizeAlgorithm();
815void QgsMeshRasterizeAlgorithm::initAlgorithm(
const QVariantMap &configuration )
817 Q_UNUSED( configuration );
827 addParameter(
new QgsProcessingParameterCrs( u
"CRS_OUTPUT"_s, QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
831 auto createOptsParam = std::make_unique<QgsProcessingParameterString>( u
"CREATE_OPTIONS"_s, QObject::tr(
"Creation options" ), QVariant(),
false,
true );
832 createOptsParam->setMetadata( QVariantMap( { { u
"widget_wrapper"_s, QVariantMap( { { u
"widget_type"_s, u
"rasteroptions"_s } } ) } } ) );
834 addParameter( createOptsParam.release() );
836 auto creationOptsParam = std::make_unique<QgsProcessingParameterString>( u
"CREATION_OPTIONS"_s, QObject::tr(
"Creation options" ), QVariant(),
false,
true );
837 creationOptsParam->setMetadata( QVariantMap( { { u
"widget_wrapper"_s, QVariantMap( { { u
"widget_type"_s, u
"rasteroptions"_s } } ) } } ) );
839 addParameter( creationOptsParam.release() );
846 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
848 if ( !meshLayer || !meshLayer->
isValid() )
853 outputCrs = meshLayer->
crs();
858 mTriangularMesh.update( meshLayer->
nativeMesh(), mTransform );
868 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
869 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
871 extractDatasetValues( datasetGroups, meshLayer, *meshLayer->
nativeMesh(), relativeTime, supportedDataType(), mDataPerGroup, feedback );
880 QGS_MARK_ALGORITHM_SOURCE
885 return QVariantMap();
892 for ( DataGroup &dataGroup : mDataPerGroup )
894 if ( dataGroup.dataset3dStakedValue.isValid() )
895 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue, feedback );
902 const double pixelSize = parameterAsDouble( parameters, u
"PIXEL_SIZE"_s, context );
908 QgsRectangle extent = parameterAsExtent( parameters, u
"EXTENT"_s, context );
910 extent = mTriangularMesh.extent();
912 int width = extent.
width() / pixelSize;
913 int height = extent.
height() / pixelSize;
915 QString creationOptions = parameterAsString( parameters, u
"CREATION_OPTIONS"_s, context ).trimmed();
917 const QString optionsString = parameterAsString( parameters, u
"CREATE_OPTIONS"_s, context );
918 if ( !optionsString.isEmpty() )
919 creationOptions = optionsString;
921 const QString fileName = parameterAsOutputLayer( parameters, u
"OUTPUT"_s, context );
922 const QString outputFormat = parameterAsOutputRasterFormat( parameters, u
"OUTPUT"_s, context );
924 rasterFileWriter.setOutputProviderKey( u
"gdal"_s );
925 if ( !creationOptions.isEmpty() )
927 rasterFileWriter.setCreationOptions( creationOptions.split(
'|' ) );
929 rasterFileWriter.setOutputFormat( outputFormat );
931 std::unique_ptr<QgsRasterDataProvider> rasterDataProvider( rasterFileWriter.createMultiBandRaster(
Qgis::DataType::Float64, width, height, extent, mTransform.destinationCrs(), mDataPerGroup.count() ) );
932 if ( !rasterDataProvider )
934 if ( !rasterDataProvider->isEditable() && !rasterDataProvider->setEditable(
true ) )
935 throw QgsProcessingException( QObject::tr(
"Could not create raster output: %1" ).arg( rasterDataProvider->error().summary() ) );
937 const bool hasReportsDuringClose = rasterDataProvider->hasReportsDuringClose();
938 const double maxProgressDuringBlockWriting = hasReportsDuringClose ? 50.0 : 100.0;
940 for (
int i = 0; i < mDataPerGroup.count(); ++i )
942 const DataGroup &dataGroup = mDataPerGroup.at( i );
947 if ( dataGroup.datasetValues.isValid() )
949 std::unique_ptr<QgsRasterBlock> block(
950 QgsMeshUtils::exportRasterBlock( mTriangularMesh, dataGroup.datasetValues, dataGroup.activeFaces, dataGroup.metadata.dataType(), mTransform, pixelSize, extent, &rasterBlockFeedBack )
956 if ( !rasterDataProvider->writeBlock( block.get(), i + 1 ) )
958 throw QgsProcessingException( QObject::tr(
"Could not write raster block: %1" ).arg( rasterDataProvider->error().summary() ) );
960 rasterDataProvider->setNoDataValue( i + 1, block->noDataValue() );
963 rasterDataProvider->setNoDataValue( i + 1, std::numeric_limits<double>::quiet_NaN() );
968 return QVariantMap();
969 feedback->
setProgress( maxProgressDuringBlockWriting * i / mDataPerGroup.count() );
973 rasterDataProvider->setEditable(
false );
976 feedback->
setProgress( maxProgressDuringBlockWriting );
978 if ( feedback && hasReportsDuringClose )
981 if ( !rasterDataProvider->closeWithProgress( scaledFeedback.get() ) )
990 ret[u
"OUTPUT"_s] = fileName;
995QSet<int> QgsMeshRasterizeAlgorithm::supportedDataType()
1004QString QgsMeshContoursAlgorithm::name()
const
1006 return u
"meshcontours"_s;
1009QString QgsMeshContoursAlgorithm::displayName()
const
1011 return QObject::tr(
"Export contours" );
1014QStringList QgsMeshContoursAlgorithm::tags()
const
1016 return QObject::tr(
"mesh,contours,isolines,lines,polygons,scalar,elevation,vector" ).split(
',' );
1019QString QgsMeshContoursAlgorithm::group()
const
1021 return QObject::tr(
"Mesh" );
1024QString QgsMeshContoursAlgorithm::groupId()
const
1029QString QgsMeshContoursAlgorithm::shortHelpString()
const
1031 return QObject::tr(
"This algorithm creates contours as a vector layer from a mesh scalar dataset." );
1034QString QgsMeshContoursAlgorithm::shortDescription()
const
1036 return QObject::tr(
"Creates contours as vector layer from mesh scalar dataset." );
1041 return new QgsMeshContoursAlgorithm();
1044void QgsMeshContoursAlgorithm::initAlgorithm(
const QVariantMap &configuration )
1046 Q_UNUSED( configuration );
1059 auto contourLevelList = std::make_unique<QgsProcessingParameterString>( u
"CONTOUR_LEVEL_LIST"_s, QObject::tr(
"List of contours level" ), QVariant(),
false,
true );
1060 contourLevelList->setHelp( QObject::tr(
"Comma separated list of values to export. If filled, the increment, minimum and maximum settings are ignored." ) );
1061 addParameter( contourLevelList.release() );
1063 addParameter(
new QgsProcessingParameterCrs( u
"CRS_OUTPUT"_s, QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
1072 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
1074 if ( !meshLayer || !meshLayer->
isValid() )
1079 outputCrs = meshLayer->
crs();
1084 mTriangularMesh.update( meshLayer->
nativeMesh(), mTransform );
1090 QString levelsString = parameterAsString( parameters, u
"CONTOUR_LEVEL_LIST"_s, context );
1091 if ( !levelsString.isEmpty() )
1093 QStringList levelStringList = levelsString.split(
',' );
1094 if ( !levelStringList.isEmpty() )
1096 for (
const QString &stringVal : levelStringList )
1099 double val = stringVal.toDouble( &ok );
1101 mLevels.append( val );
1103 throw QgsProcessingException( QObject::tr(
"Invalid format for level values, must be numbers separated with comma" ) );
1105 if ( mLevels.count() >= 2 )
1106 if ( mLevels.last() <= mLevels.at( mLevels.count() - 2 ) )
1107 throw QgsProcessingException( QObject::tr(
"Invalid format for level values, must be different numbers and in increasing order" ) );
1112 if ( mLevels.isEmpty() )
1114 double minimum = parameterAsDouble( parameters, u
"MINIMUM"_s, context );
1115 double maximum = parameterAsDouble( parameters, u
"MAXIMUM"_s, context );
1116 double interval = parameterAsDouble( parameters, u
"INCREMENT"_s, context );
1118 if ( interval <= 0 )
1121 if ( minimum >= maximum )
1122 throw QgsProcessingException( QObject::tr(
"Invalid minimum and maximum values, minimum must be lesser than maximum" ) );
1124 if ( interval > ( maximum - minimum ) )
1125 throw QgsProcessingException( QObject::tr(
"Invalid minimum, maximum and interval values, difference between minimum and maximum must be greater or equal than interval" ) );
1127 int intervalCount = ( maximum - minimum ) / interval;
1129 mLevels.reserve( intervalCount );
1130 for (
int i = 0; i < intervalCount; ++i )
1132 mLevels.append( minimum + i * interval );
1145 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
1146 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
1150 extractDatasetValues( datasetGroups, meshLayer, mNativeMesh, relativeTime, supportedDataType(), mDataPerGroup, feedback );
1159 QGS_MARK_ALGORITHM_SOURCE
1163 for ( DataGroup &dataGroup : mDataPerGroup )
1165 if ( dataGroup.dataset3dStakedValue.isValid() )
1166 dataGroup.datasetValues = avgMethod->calculate( dataGroup.dataset3dStakedValue );
1172 polygonFields.
append(
QgsField( QObject::tr(
"group" ), QMetaType::Type::QString ) );
1173 polygonFields.
append(
QgsField( QObject::tr(
"time" ), QMetaType::Type::QString ) );
1174 polygonFields.
append(
QgsField( QObject::tr(
"min_value" ), QMetaType::Type::Double ) );
1175 polygonFields.
append(
QgsField( QObject::tr(
"max_value" ), QMetaType::Type::Double ) );
1176 lineFields.
append(
QgsField( QObject::tr(
"group" ), QMetaType::Type::QString ) );
1177 lineFields.
append(
QgsField( QObject::tr(
"time" ), QMetaType::Type::QString ) );
1178 lineFields.
append(
QgsField( QObject::tr(
"value" ), QMetaType::Type::Double ) );
1182 QString lineIdentifier;
1183 QString polygonIdentifier;
1184 std::unique_ptr<QgsFeatureSink> sinkPolygons( parameterAsSink( parameters, u
"OUTPUT_POLYGONS"_s, context, polygonIdentifier, polygonFields,
Qgis::WkbType::PolygonZ, outputCrs ) );
1185 std::unique_ptr<QgsFeatureSink> sinkLines( parameterAsSink( parameters, u
"OUTPUT_LINES"_s, context, lineIdentifier, lineFields,
Qgis::WkbType::LineStringZ, outputCrs ) );
1187 if ( !sinkLines || !sinkPolygons )
1188 return QVariantMap();
1191 for (
int i = 0; i < mDataPerGroup.count(); ++i )
1193 DataGroup dataGroup = mDataPerGroup.at( i );
1195 int count = scalarDataOnVertices ? mNativeMesh.vertices.count() : mNativeMesh.faces.count();
1197 QVector<double> values;
1198 if ( dataGroup.datasetValues.isValid() )
1201 values = QgsMeshLayerUtils::calculateMagnitudes( dataGroup.datasetValues );
1205 values = QVector<double>( count, std::numeric_limits<double>::quiet_NaN() );
1208 if ( ( !scalarDataOnVertices ) )
1213 QgsMeshContours contoursExported( mTriangularMesh, mNativeMesh, values, dataGroup.activeFaces );
1216 firstAttributes.append( dataGroup.metadata.name() );
1217 firstAttributes.append( mDateTimeString );
1219 for (
double level : std::as_const( mLevels ) )
1221 QgsGeometry line = contoursExported.exportLines( level, feedback );
1223 return QVariantMap();
1227 lineAttributes.append( level );
1239 for (
int l = 0; l < mLevels.count() - 1; ++l )
1241 QgsGeometry polygon = contoursExported.exportPolygons( mLevels.at( l ), mLevels.at( l + 1 ), feedback );
1243 return QVariantMap();
1248 polygonAttributes.append( mLevels.at( l ) );
1249 polygonAttributes.append( mLevels.at( l + 1 ) );
1254 if ( !sinkPolygons->addFeature( polygonFeature ) )
1266 feedback->
setProgress( 100 * i / mDataPerGroup.count() );
1272 sinkPolygons->finalize();
1277 sinkLines->finalize();
1282 ret[u
"OUTPUT_LINES"_s] = lineIdentifier;
1283 ret[u
"OUTPUT_POLYGONS"_s] = polygonIdentifier;
1292QString QgsMeshExportCrossSection::name()
const
1294 return u
"meshexportcrosssection"_s;
1297QString QgsMeshExportCrossSection::displayName()
const
1299 return QObject::tr(
"Export cross section dataset values on lines from mesh" );
1302QStringList QgsMeshExportCrossSection::tags()
const
1304 return QObject::tr(
"mesh,cross section,line,profile,extract,csv,table,sample" ).split(
',' );
1307QString QgsMeshExportCrossSection::group()
const
1309 return QObject::tr(
"Mesh" );
1312QString QgsMeshExportCrossSection::groupId()
const
1317QString QgsMeshExportCrossSection::shortHelpString()
const
1320 "This algorithm extracts mesh's dataset values from line contained in a vector layer.\n"
1321 "Each line is discretized with a resolution distance parameter for extraction of values on its vertices."
1325QString QgsMeshExportCrossSection::shortDescription()
const
1327 return QObject::tr(
"Extracts a mesh dataset's values from lines contained in a vector layer." );
1332 return new QgsMeshExportCrossSection();
1335void QgsMeshExportCrossSection::initAlgorithm(
const QVariantMap &configuration )
1337 Q_UNUSED( configuration );
1345 QList<int> datatype;
1349 addParameter(
new QgsProcessingParameterDistance( u
"RESOLUTION"_s, QObject::tr(
"Line segmentation resolution" ), 10.0, u
"INPUT_LINES"_s,
false, 0 ) );
1360 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
1362 if ( !meshLayer || !meshLayer->
isValid() )
1365 mMeshLayerCrs = meshLayer->
crs();
1366 mTriangularMesh.update( meshLayer->
nativeMesh() );
1375 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
1376 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
1378 extractDatasetValues( datasetGroups, meshLayer, *meshLayer->
nativeMesh(), relativeTime, supportedDataType(), mDataPerGroup, feedback );
1387 QGS_MARK_ALGORITHM_SOURCE
1393 for ( DataGroup &dataGroup : mDataPerGroup )
1395 if ( dataGroup.dataset3dStakedValue.isValid() )
1396 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
1398 double resolution = parameterAsDouble( parameters, u
"RESOLUTION"_s, context );
1399 int datasetDigits = parameterAsInt( parameters, u
"DATASET_DIGITS"_s, context );
1400 int coordDigits = parameterAsInt( parameters, u
"COORDINATES_DIGITS"_s, context );
1402 std::unique_ptr<QgsProcessingFeatureSource> featureSource( parameterAsSource( parameters, u
"INPUT_LINES"_s, context ) );
1403 if ( !featureSource )
1408 QString outputFileName = parameterAsFileOutput( parameters, u
"OUTPUT"_s, context );
1409 QFile file( outputFileName );
1410 if ( !file.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
1413 QTextStream textStream( &file );
1415 header << u
"fid"_s << u
"x"_s << u
"y"_s << QObject::tr(
"offset" );
1416 for (
const DataGroup &datagroup : std::as_const( mDataPerGroup ) )
1417 header << datagroup.metadata.name();
1418 textStream << header.join(
',' ) << u
"\n"_s;
1420 long long featCount = featureSource->featureCount();
1421 long long featCounter = 0;
1435 feedback->
reportError( QObject::tr(
"Could not transform line to mesh CRS" ) );
1441 while ( offset <= line.
length() )
1444 return QVariantMap();
1446 QStringList textLine;
1448 int triangularFaceIndex = mTriangularMesh.faceIndexForPoint_v2( point );
1449 textLine << QString::number( fid ) << QString::number( point.
x(),
'f', coordDigits ) << QString::number( point.
y(),
'f', coordDigits ) << QString::number( offset,
'f', coordDigits );
1450 if ( triangularFaceIndex >= 0 )
1454 int nativeFaceIndex = mTriangularMesh.trianglesToNativeFaces().at( triangularFaceIndex );
1455 for (
int i = 0; i < mDataPerGroup.count(); ++i )
1457 const DataGroup &dataGroup = mDataPerGroup.at( i );
1458 bool faceActive = dataGroup.activeFaces.active( nativeFaceIndex );
1461 QgsMeshDatasetValue value = extractDatasetValue( point, nativeFaceIndex, triangularFaceIndex, mTriangularMesh, dataGroup.activeFaces, dataGroup.datasetValues, dataGroup.metadata );
1463 if ( abs( value.
x() ) == std::numeric_limits<double>::quiet_NaN() )
1464 textLine << QString(
' ' );
1466 textLine << QString::number( value.
scalar(),
'f', datasetDigits );
1470 for (
int i = 0; i < mDataPerGroup.count(); ++i )
1471 textLine << QString(
' ' );
1473 textStream << textLine.join(
',' ) << u
"\n"_s;
1475 offset += resolution;
1480 feedback->
setProgress( 100.0 * featCounter / featCount );
1482 return QVariantMap();
1489 ret[u
"OUTPUT"_s] = outputFileName;
1495QString QgsMeshExportTimeSeries::name()
const
1497 return u
"meshexporttimeseries"_s;
1500QString QgsMeshExportTimeSeries::displayName()
const
1502 return QObject::tr(
"Export time series values from points of a mesh dataset" );
1505QStringList QgsMeshExportTimeSeries::tags()
const
1507 return QObject::tr(
"mesh,time series,temporal,points,extract,csv,table,sample" ).split(
',' );
1510QString QgsMeshExportTimeSeries::group()
const
1512 return QObject::tr(
"Mesh" );
1515QString QgsMeshExportTimeSeries::groupId()
const
1520QString QgsMeshExportTimeSeries::shortHelpString()
const
1523 "This algorithm extracts mesh's dataset time series values from points contained in a vector layer.\n"
1524 "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."
1528QString QgsMeshExportTimeSeries::shortDescription()
const
1530 return QObject::tr(
"Extracts a mesh dataset's time series values from points contained in a vector layer." );
1535 return new QgsMeshExportTimeSeries();
1538void QgsMeshExportTimeSeries::initAlgorithm(
const QVariantMap &configuration )
1540 Q_UNUSED( configuration );
1552 QList<int> datatype;
1565 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
1567 if ( !meshLayer || !meshLayer->
isValid() )
1570 mMeshLayerCrs = meshLayer->
crs();
1571 mTriangularMesh.update( meshLayer->
nativeMesh() );
1581 QVariant parameterStartTimeVariant = parameters.value( u
"STARTING_TIME"_s );
1582 QgsInterval relativeStartTime = datasetRelativetime( parameterStartTimeVariant, meshLayer, context );
1584 QVariant parameterEndTimeVariant = parameters.value( u
"FINISHING_TIME"_s );
1585 QgsInterval relativeEndTime = datasetRelativetime( parameterEndTimeVariant, meshLayer, context );
1588 qint64 timeStepInterval = parameterAsDouble( parameters, u
"TIME_STEP"_s, context ) * 1000 * 3600;
1589 if ( timeStepInterval == 0 )
1592 for (
int groupIndex : datasetGroups )
1605 mRelativeTimeSteps.clear();
1606 mTimeStepString.clear();
1607 if ( timeStepInterval != 0 )
1609 mRelativeTimeSteps.append( relativeStartTime.
seconds() * 1000 );
1610 while ( mRelativeTimeSteps.last() < relativeEndTime.
seconds() * 1000 )
1611 mRelativeTimeSteps.append( mRelativeTimeSteps.last() + timeStepInterval );
1613 for ( qint64 relativeTimeStep : std::as_const( mRelativeTimeSteps ) )
1615 mTimeStepString.append( meshLayer->
formatTime( relativeTimeStep / 3600.0 / 1000.0 ) );
1620 for (
int i = 0; i < datasetGroups.count(); ++i )
1622 int groupIndex = datasetGroups.at( i );
1624 if ( supportedDataType().contains( meta.
dataType() ) )
1626 mGroupIndexes.append( groupIndex );
1627 mGroupsMetadata[groupIndex] = meta;
1630 if ( !mRelativeTimeSteps.isEmpty() )
1634 for ( qint64 relativeTimeStep : std::as_const( mRelativeTimeSteps ) )
1636 QMap<int, int> &groupIndexToData = mRelativeTimeToData[relativeTimeStep];
1637 QgsInterval timeStepInterval( relativeTimeStep / 1000.0 );
1639 if ( !datasetIndex.
isValid() )
1641 if ( datasetIndex != lastDatasetIndex )
1643 DataGroup dataGroup;
1644 dataGroup.metadata = meta;
1645 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, valueCount );
1649 dataGroup.dataset3dStakedValue = meshLayer->
dataset3dValues( datasetIndex, 0, valueCount );
1651 mDatasets.append( dataGroup );
1652 lastDatasetIndex = datasetIndex;
1654 groupIndexToData[groupIndex] = mDatasets.count() - 1;
1660 QMap<int, int> &groupIndexToData = mRelativeTimeToData[0];
1662 DataGroup dataGroup;
1663 dataGroup.metadata = meta;
1664 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, valueCount );
1668 dataGroup.dataset3dStakedValue = meshLayer->
dataset3dValues( datasetIndex, 0, valueCount );
1670 mDatasets.append( dataGroup );
1671 groupIndexToData[groupIndex] = mDatasets.
count() - 1;
1676 feedback->
setProgress( 100 * i / datasetGroups.count() );
1686 QGS_MARK_ALGORITHM_SOURCE
1693 for ( DataGroup &dataGroup : mDatasets )
1695 if ( dataGroup.dataset3dStakedValue.isValid() )
1696 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
1699 int datasetDigits = parameterAsInt( parameters, u
"DATASET_DIGITS"_s, context );
1700 int coordDigits = parameterAsInt( parameters, u
"COORDINATES_DIGITS"_s, context );
1702 std::unique_ptr<QgsProcessingFeatureSource> featureSource( parameterAsSource( parameters, u
"INPUT_POINTS"_s, context ) );
1703 if ( !featureSource )
1708 QString outputFileName = parameterAsFileOutput( parameters, u
"OUTPUT"_s, context );
1709 QFile file( outputFileName );
1710 if ( !file.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
1713 QTextStream textStream( &file );
1715 header << u
"fid"_s << u
"x"_s << u
"y"_s << QObject::tr(
"time" );
1717 for (
int gi : std::as_const( mGroupIndexes ) )
1718 header << mGroupsMetadata.value( gi ).name();
1720 textStream << header.join(
',' ) << u
"\n"_s;
1722 long long featCount = featureSource->featureCount();
1723 long long featCounter = 0;
1737 feedback->
reportError( QObject::tr(
"Could not transform line to mesh CRS" ) );
1744 int triangularFaceIndex = mTriangularMesh.faceIndexForPoint_v2( point );
1746 if ( triangularFaceIndex >= 0 )
1748 int nativeFaceIndex = mTriangularMesh.trianglesToNativeFaces().at( triangularFaceIndex );
1749 if ( !mRelativeTimeSteps.isEmpty() )
1751 for (
int timeIndex = 0; timeIndex < mRelativeTimeSteps.count(); ++timeIndex )
1753 qint64 timeStep = mRelativeTimeSteps.at( timeIndex );
1754 QStringList textLine;
1755 textLine << QString::number( fid ) << QString::number( point.
x(),
'f', coordDigits ) << QString::number( point.
y(),
'f', coordDigits ) << mTimeStepString.at( timeIndex );
1757 if ( mRelativeTimeToData.contains( timeStep ) )
1759 const QMap<int, int> &groupToData = mRelativeTimeToData.value( timeStep );
1760 for (
int groupIndex : std::as_const( mGroupIndexes ) )
1762 if ( !groupToData.contains( groupIndex ) )
1764 int dataIndex = groupToData.value( groupIndex );
1765 if ( dataIndex < 0 || dataIndex > mDatasets.count() - 1 )
1768 const DataGroup &dataGroup = mDatasets.at( dataIndex );
1769 QgsMeshDatasetValue value = extractDatasetValue( point, nativeFaceIndex, triangularFaceIndex, mTriangularMesh, dataGroup.activeFaces, dataGroup.datasetValues, dataGroup.metadata );
1770 if ( abs( value.
x() ) == std::numeric_limits<double>::quiet_NaN() )
1771 textLine << QString(
' ' );
1773 textLine << QString::number( value.
scalar(),
'f', datasetDigits );
1776 textStream << textLine.join(
',' ) << u
"\n"_s;
1781 QStringList textLine;
1782 textLine << QString::number( fid ) << QString::number( point.
x(),
'f', coordDigits ) << QString::number( point.
y(),
'f', coordDigits ) << QObject::tr(
"static dataset" );
1783 const QMap<int, int> &groupToData = mRelativeTimeToData.value( 0 );
1784 for (
int groupIndex : std::as_const( mGroupIndexes ) )
1786 if ( !groupToData.contains( groupIndex ) )
1788 int dataIndex = groupToData.value( groupIndex );
1789 if ( dataIndex < 0 || dataIndex > mDatasets.count() - 1 )
1791 const DataGroup &dataGroup = mDatasets.at( dataIndex );
1792 QgsMeshDatasetValue value = extractDatasetValue( point, nativeFaceIndex, triangularFaceIndex, mTriangularMesh, dataGroup.activeFaces, dataGroup.datasetValues, dataGroup.metadata );
1793 if ( abs( value.
x() ) == std::numeric_limits<double>::quiet_NaN() )
1794 textLine << QString(
' ' );
1796 textLine << QString::number( value.
scalar(),
'f', datasetDigits );
1798 textStream << textLine.join(
',' ) << u
"\n"_s;
1804 feedback->
setProgress( 100.0 * featCounter / featCount );
1806 return QVariantMap();
1813 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.