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 );
216 QObject::tr(
"Dataset groups" ),
218 supportedDataType(),
true
223 QObject::tr(
"Dataset time" ),
228 addParameter(
new QgsProcessingParameterCrs( u
"CRS_OUTPUT"_s, QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
230 QStringList exportVectorOptions;
231 exportVectorOptions << QObject::tr(
"Cartesian (x,y)" )
232 << QObject::tr(
"Polar (magnitude,degree)" )
233 << QObject::tr(
"Cartesian and Polar" );
234 addParameter(
new QgsProcessingParameterEnum( u
"VECTOR_OPTION"_s, QObject::tr(
"Export vector option" ), exportVectorOptions,
false, 0 ) );
244 if ( timeType ==
"dataset-time-step"_L1 )
249 else if ( timeType ==
"defined-date-time"_L1 )
252 if ( dateTime.isValid() )
253 relativeTime =
QgsInterval( layerReferenceTime.secsTo( dateTime ) );
255 else if ( timeType ==
"current-context-time"_L1 )
258 if ( dateTime.isValid() )
259 relativeTime =
QgsInterval( layerReferenceTime.secsTo( dateTime ) );
268 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
270 if ( !meshLayer || !meshLayer->
isValid() )
278 outputCrs = meshLayer->
crs();
293 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
294 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
296 switch ( meshElementType() )
299 mElementCount = mNativeMesh.faceCount();
302 mElementCount = mNativeMesh.vertexCount();
305 mElementCount = mNativeMesh.edgeCount();
309 for (
int i = 0; i < datasetGroups.count(); ++i )
311 int groupIndex = datasetGroups.at( i );
316 if ( supportedDataType().contains( dataGroup.metadata.dataType() ) )
318 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, mElementCount );
319 mDataPerGroup.append( dataGroup );
322 feedback->
setProgress( 100 * i / datasetGroups.count() );
325 mExportVectorOption = parameterAsInt( parameters, u
"VECTOR_OPTION"_s, context );
335 return QVariantMap();
337 feedback->
setProgressText( QObject::tr(
"Creating output vector layer" ) );
340 QList<QgsMeshDatasetGroupMetadata> metaList;
341 metaList.reserve( mDataPerGroup.size() );
342 for (
const DataGroup &dataGroup : std::as_const( mDataPerGroup ) )
343 metaList.append( dataGroup.metadata );
344 QgsFields fields = createFields( metaList, mExportVectorOption );
348 std::unique_ptr<QgsFeatureSink> sink( parameterAsSink( parameters, u
"OUTPUT"_s, context, identifier, fields, sinkGeometryType(), outputCrs ) );
350 return QVariantMap();
355 return QVariantMap();
357 feedback->
setProgressText( QObject::tr(
"Creating points for each vertices" ) );
360 for (
int i = 0; i < mElementCount; ++i )
363 for (
const DataGroup &dataGroup : std::as_const( mDataPerGroup ) )
366 addAttributes( value, attributes, dataGroup.metadata.isVector(), mExportVectorOption );
377 geom = meshElement( i );
379 feedback->
reportError( QObject::tr(
"Could not transform point to destination CRS" ) );
390 return QVariantMap();
398 ret[u
"OUTPUT"_s] = identifier;
403QString QgsExportMeshFacesAlgorithm::shortHelpString()
const
405 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." );
408QString QgsExportMeshFacesAlgorithm::shortDescription()
const
410 return QObject::tr(
"Exports mesh faces to a polygon vector layer." );
413QString QgsExportMeshFacesAlgorithm::name()
const
415 return u
"exportmeshfaces"_s;
418QString QgsExportMeshFacesAlgorithm::displayName()
const
420 return QObject::tr(
"Export mesh faces" );
425 return new QgsExportMeshFacesAlgorithm();
428QgsGeometry QgsExportMeshFacesAlgorithm::meshElement(
int index )
const
430 const QgsMeshFace &face = mNativeMesh.face( index );
431 QVector<QgsPoint> vertices( face.size() );
432 for (
int i = 0; i < face.size(); ++i )
433 vertices[i] = mNativeMesh.vertex( face.at( i ) );
434 auto polygon = std::make_unique<QgsPolygon>();
439QString QgsExportMeshEdgesAlgorithm::shortHelpString()
const
441 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." );
444QString QgsExportMeshEdgesAlgorithm::shortDescription()
const
446 return QObject::tr(
"Exports mesh edges to a line vector layer." );
449QString QgsExportMeshEdgesAlgorithm::name()
const
451 return u
"exportmeshedges"_s;
454QString QgsExportMeshEdgesAlgorithm::displayName()
const
456 return QObject::tr(
"Export mesh edges" );
461 return new QgsExportMeshEdgesAlgorithm();
464QgsGeometry QgsExportMeshEdgesAlgorithm::meshElement(
int index )
const
466 const QgsMeshEdge &edge = mNativeMesh.edge( index );
467 QVector<QgsPoint> vertices( 2 );
468 vertices[0] = mNativeMesh.vertex( edge.first );
469 vertices[1] = mNativeMesh.vertex( edge.second );
474QString QgsExportMeshOnGridAlgorithm::name()
const {
return u
"exportmeshongrid"_s; }
476QString QgsExportMeshOnGridAlgorithm::displayName()
const {
return QObject::tr(
"Export mesh on grid" ); }
478QString QgsExportMeshOnGridAlgorithm::group()
const {
return QObject::tr(
"Mesh" ); }
480QString QgsExportMeshOnGridAlgorithm::groupId()
const {
return u
"mesh"_s; }
482QString QgsExportMeshOnGridAlgorithm::shortHelpString()
const
484 return QObject::tr(
"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"
485 "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 method).\n"
486 "1D meshes are not supported." );
489QString QgsExportMeshOnGridAlgorithm::shortDescription()
const
491 return QObject::tr(
"Exports mesh dataset values to a gridded point vector layer." );
496 return new QgsExportMeshOnGridAlgorithm();
499void QgsExportMeshOnGridAlgorithm::initAlgorithm(
const QVariantMap &configuration )
501 Q_UNUSED( configuration );
507 QObject::tr(
"Dataset groups" ),
514 QObject::tr(
"Dataset time" ),
523 addParameter(
new QgsProcessingParameterCrs( u
"CRS_OUTPUT"_s, QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
525 QStringList exportVectorOptions;
526 exportVectorOptions << QObject::tr(
"Cartesian (x,y)" )
527 << QObject::tr(
"Polar (magnitude,degree)" )
528 << QObject::tr(
"Cartesian and Polar" );
529 addParameter(
new QgsProcessingParameterEnum( u
"VECTOR_OPTION"_s, QObject::tr(
"Export vector option" ), exportVectorOptions,
false, 0 ) );
533static void extractDatasetValues(
const QList<int> &datasetGroups,
QgsMeshLayer *meshLayer,
const QgsMesh &nativeMesh,
const QgsInterval &relativeTime,
const QSet<int> supportedDataType, QList<DataGroup> &datasetPerGroup,
QgsProcessingFeedback *feedback )
535 for (
int i = 0; i < datasetGroups.count(); ++i )
537 int groupIndex = datasetGroups.at( i );
542 if ( supportedDataType.contains( dataGroup.metadata.dataType() ) )
545 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, valueCount );
549 dataGroup.dataset3dStakedValue = meshLayer->
dataset3dValues( datasetIndex, 0, valueCount );
551 datasetPerGroup.append( dataGroup );
554 feedback->
setProgress( 100 * i / datasetGroups.count() );
560 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
562 if ( !meshLayer || !meshLayer->
isValid() )
567 outputCrs = meshLayer->
crs();
582 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
583 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
585 extractDatasetValues( datasetGroups, meshLayer, nativeMesh, relativeTime, supportedDataType(), mDataPerGroup, feedback );
586 mTriangularMesh.update( meshLayer->
nativeMesh(), mTransform );
588 mExportVectorOption = parameterAsInt( parameters, u
"VECTOR_OPTION"_s, context );
598 return QVariantMap();
600 feedback->
setProgressText( QObject::tr(
"Creating output vector layer" ) );
605 for ( DataGroup &dataGroup : mDataPerGroup )
607 if ( dataGroup.dataset3dStakedValue.isValid() )
608 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
611 QList<QgsMeshDatasetGroupMetadata> metaList;
612 metaList.reserve( mDataPerGroup.size() );
613 for (
const DataGroup &dataGroup : std::as_const( mDataPerGroup ) )
614 metaList.append( dataGroup.metadata );
615 QgsFields fields = createFields( metaList, mExportVectorOption );
620 std::unique_ptr<QgsFeatureSink> sink( parameterAsSink( parameters, u
"OUTPUT"_s, context, identifier, fields,
Qgis::WkbType::Point, outputCrs ) );
622 return QVariantMap();
627 return QVariantMap();
633 const double gridSpacing = parameterAsDouble( parameters, u
"GRID_SPACING"_s, context );
639 QgsRectangle extent = parameterAsExtent( parameters, u
"EXTENT"_s, context );
641 extent = mTriangularMesh.extent();
642 int pointXCount = int( extent.
width() / gridSpacing ) + 1;
643 int pointYCount = int( extent.
height() / gridSpacing ) + 1;
645 for (
int ix = 0; ix < pointXCount; ++ix )
647 for (
int iy = 0; iy < pointYCount; ++iy )
650 int triangularFaceIndex = mTriangularMesh.faceIndexForPoint_v2( point );
651 if ( triangularFaceIndex >= 0 )
655 int nativeFaceIndex = mTriangularMesh.trianglesToNativeFaces().at( triangularFaceIndex );
656 for (
int i = 0; i < mDataPerGroup.count(); ++i )
658 const DataGroup &dataGroup = mDataPerGroup.at( i );
659 bool faceActive = dataGroup.activeFaces.active( nativeFaceIndex );
667 dataGroup.activeFaces,
668 dataGroup.datasetValues,
672 if ( dataGroup.metadata.isVector() )
674 QVector<double> vector = vectorValue( dataGroup.datasetValues.value( i ), mExportVectorOption );
675 for (
double v : vector )
677 attributes.append( v );
681 attributes.append( value.
scalar() );
692 feedback->
reportError( QObject::tr(
"Could not transform point to destination CRS" ) );
708 ret[u
"OUTPUT"_s] = identifier;
713QSet<int> QgsExportMeshOnGridAlgorithm::supportedDataType()
722QString QgsMeshRasterizeAlgorithm::name()
const
724 return u
"meshrasterize"_s;
727QString QgsMeshRasterizeAlgorithm::displayName()
const
729 return QObject::tr(
"Rasterize mesh dataset" );
732QString QgsMeshRasterizeAlgorithm::group()
const
734 return QObject::tr(
"Mesh" );
737QString QgsMeshRasterizeAlgorithm::groupId()
const
742QString QgsMeshRasterizeAlgorithm::shortHelpString()
const
744 return QObject::tr(
"This algorithm creates a raster layer from a mesh dataset.\n"
745 "For data on volume (3D stacked dataset values), the exported dataset values are averaged on faces using the method defined in the mesh layer properties (default is Multi level averaging method).\n"
746 "1D meshes are not supported." );
749QString QgsMeshRasterizeAlgorithm::shortDescription()
const
751 return QObject::tr(
"Creates a raster layer from a mesh dataset." );
756 return new QgsMeshRasterizeAlgorithm();
759void QgsMeshRasterizeAlgorithm::initAlgorithm(
const QVariantMap &configuration )
761 Q_UNUSED( configuration );
767 QObject::tr(
"Dataset groups" ),
775 QObject::tr(
"Dataset time" ),
782 addParameter(
new QgsProcessingParameterCrs( u
"CRS_OUTPUT"_s, QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
786 auto createOptsParam = std::make_unique<QgsProcessingParameterString>( u
"CREATE_OPTIONS"_s, QObject::tr(
"Creation options" ), QVariant(),
false,
true );
787 createOptsParam->setMetadata( QVariantMap( { { u
"widget_wrapper"_s, QVariantMap( { { u
"widget_type"_s, u
"rasteroptions"_s } } ) } } ) );
789 addParameter( createOptsParam.release() );
791 auto creationOptsParam = std::make_unique<QgsProcessingParameterString>( u
"CREATION_OPTIONS"_s, QObject::tr(
"Creation options" ), QVariant(),
false,
true );
792 creationOptsParam->setMetadata( QVariantMap( { { u
"widget_wrapper"_s, QVariantMap( { { u
"widget_type"_s, u
"rasteroptions"_s } } ) } } ) );
794 addParameter( creationOptsParam.release() );
801 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
803 if ( !meshLayer || !meshLayer->
isValid() )
808 outputCrs = meshLayer->
crs();
813 mTriangularMesh.update( meshLayer->
nativeMesh(), mTransform );
823 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
824 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
826 extractDatasetValues( datasetGroups, meshLayer, *meshLayer->
nativeMesh(), relativeTime, supportedDataType(), mDataPerGroup, feedback );
838 return QVariantMap();
845 for ( DataGroup &dataGroup : mDataPerGroup )
847 if ( dataGroup.dataset3dStakedValue.isValid() )
848 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
852 const double pixelSize = parameterAsDouble( parameters, u
"PIXEL_SIZE"_s, context );
858 QgsRectangle extent = parameterAsExtent( parameters, u
"EXTENT"_s, context );
860 extent = mTriangularMesh.extent();
862 int width = extent.
width() / pixelSize;
863 int height = extent.
height() / pixelSize;
865 QString creationOptions = parameterAsString( parameters, u
"CREATION_OPTIONS"_s, context ).trimmed();
867 const QString optionsString = parameterAsString( parameters, u
"CREATE_OPTIONS"_s, context );
868 if ( !optionsString.isEmpty() )
869 creationOptions = optionsString;
871 const QString fileName = parameterAsOutputLayer( parameters, u
"OUTPUT"_s, context );
872 const QString outputFormat = parameterAsOutputRasterFormat( parameters, u
"OUTPUT"_s, context );
874 rasterFileWriter.setOutputProviderKey( u
"gdal"_s );
875 if ( !creationOptions.isEmpty() )
877 rasterFileWriter.setCreationOptions( creationOptions.split(
'|' ) );
879 rasterFileWriter.setOutputFormat( outputFormat );
881 std::unique_ptr<QgsRasterDataProvider> rasterDataProvider(
882 rasterFileWriter.createMultiBandRaster(
Qgis::DataType::Float64, width, height, extent, mTransform.destinationCrs(), mDataPerGroup.count() )
884 rasterDataProvider->setEditable(
true );
886 const bool hasReportsDuringClose = rasterDataProvider->hasReportsDuringClose();
887 const double maxProgressDuringBlockWriting = hasReportsDuringClose ? 50.0 : 100.0;
889 for (
int i = 0; i < mDataPerGroup.count(); ++i )
891 const DataGroup &dataGroup = mDataPerGroup.at( i );
896 if ( dataGroup.datasetValues.isValid() )
900 dataGroup.datasetValues,
901 dataGroup.activeFaces,
902 dataGroup.metadata.dataType(),
909 if ( !rasterDataProvider->writeBlock( block.get(), i + 1 ) )
911 throw QgsProcessingException( QObject::tr(
"Could not write raster block: %1" ).arg( rasterDataProvider->error().summary() ) );
913 rasterDataProvider->setNoDataValue( i + 1, block->noDataValue() );
916 rasterDataProvider->setNoDataValue( i + 1, std::numeric_limits<double>::quiet_NaN() );
921 return QVariantMap();
922 feedback->
setProgress( maxProgressDuringBlockWriting * i / mDataPerGroup.count() );
926 rasterDataProvider->setEditable(
false );
929 feedback->
setProgress( maxProgressDuringBlockWriting );
931 if ( feedback && hasReportsDuringClose )
934 if ( !rasterDataProvider->closeWithProgress( scaledFeedback.get() ) )
943 ret[u
"OUTPUT"_s] = fileName;
948QSet<int> QgsMeshRasterizeAlgorithm::supportedDataType()
957QString QgsMeshContoursAlgorithm::name()
const
959 return u
"meshcontours"_s;
962QString QgsMeshContoursAlgorithm::displayName()
const
964 return QObject::tr(
"Export contours" );
967QString QgsMeshContoursAlgorithm::group()
const
969 return QObject::tr(
"Mesh" );
972QString QgsMeshContoursAlgorithm::groupId()
const
977QString QgsMeshContoursAlgorithm::shortHelpString()
const
979 return QObject::tr(
"This algorithm creates contours as a vector layer from a mesh scalar dataset." );
982QString QgsMeshContoursAlgorithm::shortDescription()
const
984 return QObject::tr(
"Creates contours as vector layer from mesh scalar dataset." );
989 return new QgsMeshContoursAlgorithm();
992void QgsMeshContoursAlgorithm::initAlgorithm(
const QVariantMap &configuration )
994 Q_UNUSED( configuration );
1000 QObject::tr(
"Dataset groups" ),
1007 QObject::tr(
"Dataset time" ),
1023 auto contourLevelList = std::make_unique<QgsProcessingParameterString>(
1024 u
"CONTOUR_LEVEL_LIST"_s, QObject::tr(
"List of contours level" ), QVariant(),
false,
true
1026 contourLevelList->setHelp( QObject::tr(
"Comma separated list of values to export. If filled, the increment, minimum and maximum settings are ignored." ) );
1027 addParameter( contourLevelList.release() );
1029 addParameter(
new QgsProcessingParameterCrs( u
"CRS_OUTPUT"_s, QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
1038 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
1040 if ( !meshLayer || !meshLayer->
isValid() )
1045 outputCrs = meshLayer->
crs();
1050 mTriangularMesh.update( meshLayer->
nativeMesh(), mTransform );
1056 QString levelsString = parameterAsString( parameters, u
"CONTOUR_LEVEL_LIST"_s, context );
1057 if ( !levelsString.isEmpty() )
1059 QStringList levelStringList = levelsString.split(
',' );
1060 if ( !levelStringList.isEmpty() )
1062 for (
const QString &stringVal : levelStringList )
1065 double val = stringVal.toDouble( &ok );
1067 mLevels.append( val );
1069 throw QgsProcessingException( QObject::tr(
"Invalid format for level values, must be numbers separated with comma" ) );
1071 if ( mLevels.count() >= 2 )
1072 if ( mLevels.last() <= mLevels.at( mLevels.count() - 2 ) )
1073 throw QgsProcessingException( QObject::tr(
"Invalid format for level values, must be different numbers and in increasing order" ) );
1078 if ( mLevels.isEmpty() )
1080 double minimum = parameterAsDouble( parameters, u
"MINIMUM"_s, context );
1081 double maximum = parameterAsDouble( parameters, u
"MAXIMUM"_s, context );
1082 double interval = parameterAsDouble( parameters, u
"INCREMENT"_s, context );
1084 if ( interval <= 0 )
1087 if ( minimum >= maximum )
1088 throw QgsProcessingException( QObject::tr(
"Invalid minimum and maximum values, minimum must be lesser than maximum" ) );
1090 if ( interval > ( maximum - minimum ) )
1091 throw QgsProcessingException( QObject::tr(
"Invalid minimum, maximum and interval values, difference between minimum and maximum must be greater or equal than interval" ) );
1093 int intervalCount = ( maximum - minimum ) / interval;
1095 mLevels.reserve( intervalCount );
1096 for (
int i = 0; i < intervalCount; ++i )
1098 mLevels.append( minimum + i * interval );
1111 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
1112 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
1116 extractDatasetValues( datasetGroups, meshLayer, mNativeMesh, relativeTime, supportedDataType(), mDataPerGroup, feedback );
1127 for ( DataGroup &dataGroup : mDataPerGroup )
1129 if ( dataGroup.dataset3dStakedValue.isValid() )
1130 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
1136 polygonFields.
append(
QgsField( QObject::tr(
"group" ), QMetaType::Type::QString ) );
1137 polygonFields.
append(
QgsField( QObject::tr(
"time" ), QMetaType::Type::QString ) );
1138 polygonFields.
append(
QgsField( QObject::tr(
"min_value" ), QMetaType::Type::Double ) );
1139 polygonFields.
append(
QgsField( QObject::tr(
"max_value" ), QMetaType::Type::Double ) );
1140 lineFields.
append(
QgsField( QObject::tr(
"group" ), QMetaType::Type::QString ) );
1141 lineFields.
append(
QgsField( QObject::tr(
"time" ), QMetaType::Type::QString ) );
1142 lineFields.
append(
QgsField( QObject::tr(
"value" ), QMetaType::Type::Double ) );
1146 QString lineIdentifier;
1147 QString polygonIdentifier;
1148 std::unique_ptr<QgsFeatureSink> sinkPolygons( parameterAsSink(
1150 u
"OUTPUT_POLYGONS"_s,
1157 std::unique_ptr<QgsFeatureSink> sinkLines( parameterAsSink(
1167 if ( !sinkLines || !sinkPolygons )
1168 return QVariantMap();
1171 for (
int i = 0; i < mDataPerGroup.count(); ++i )
1173 DataGroup dataGroup = mDataPerGroup.at( i );
1175 int count = scalarDataOnVertices ? mNativeMesh.vertices.count() : mNativeMesh.faces.count();
1177 QVector<double> values;
1178 if ( dataGroup.datasetValues.isValid() )
1181 values = QgsMeshLayerUtils::calculateMagnitudes( dataGroup.datasetValues );
1185 values = QVector<double>( count, std::numeric_limits<double>::quiet_NaN() );
1188 if ( ( !scalarDataOnVertices ) )
1190 values = QgsMeshLayerUtils::interpolateFromFacesData(
1193 &dataGroup.activeFaces,
1198 QgsMeshContours contoursExported( mTriangularMesh, mNativeMesh, values, dataGroup.activeFaces );
1201 firstAttributes.append( dataGroup.metadata.name() );
1202 firstAttributes.append( mDateTimeString );
1204 for (
double level : std::as_const( mLevels ) )
1206 QgsGeometry line = contoursExported.exportLines( level, feedback );
1208 return QVariantMap();
1212 lineAttributes.append( level );
1222 for (
int l = 0; l < mLevels.count() - 1; ++l )
1224 QgsGeometry polygon = contoursExported.exportPolygons( mLevels.at( l ), mLevels.at( l + 1 ), feedback );
1226 return QVariantMap();
1231 polygonAttributes.append( mLevels.at( l ) );
1232 polygonAttributes.append( mLevels.at( l + 1 ) );
1237 sinkPolygons->addFeature( polygonFeature );
1242 feedback->
setProgress( 100 * i / mDataPerGroup.count() );
1247 sinkPolygons->finalize();
1249 sinkLines->finalize();
1252 ret[u
"OUTPUT_LINES"_s] = lineIdentifier;
1253 ret[u
"OUTPUT_POLYGONS"_s] = polygonIdentifier;
1258QString QgsMeshExportCrossSection::name()
const
1260 return u
"meshexportcrosssection"_s;
1263QString QgsMeshExportCrossSection::displayName()
const
1265 return QObject::tr(
"Export cross section dataset values on lines from mesh" );
1268QString QgsMeshExportCrossSection::group()
const
1270 return QObject::tr(
"Mesh" );
1273QString QgsMeshExportCrossSection::groupId()
const
1278QString QgsMeshExportCrossSection::shortHelpString()
const
1280 return QObject::tr(
"This algorithm extracts mesh's dataset values from line contained in a vector layer.\n"
1281 "Each line is discretized with a resolution distance parameter for extraction of values on its vertices." );
1284QString QgsMeshExportCrossSection::shortDescription()
const
1286 return QObject::tr(
"Extracts a mesh dataset's values from lines contained in a vector layer." );
1291 return new QgsMeshExportCrossSection();
1294void QgsMeshExportCrossSection::initAlgorithm(
const QVariantMap &configuration )
1296 Q_UNUSED( configuration );
1301 u
"DATASET_GROUPS"_s,
1302 QObject::tr(
"Dataset groups" ),
1309 QObject::tr(
"Dataset time" ),
1314 QList<int> datatype;
1317 u
"INPUT_LINES"_s, QObject::tr(
"Lines for data export" ), datatype, QVariant(),
false
1321 u
"RESOLUTION"_s, QObject::tr(
"Line segmentation resolution" ), 10.0, u
"INPUT_LINES"_s,
false, 0
1333 u
"OUTPUT"_s, QObject::tr(
"Exported data CSV file" ), QObject::tr(
"CSV file (*.csv)" )
1339 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
1341 if ( !meshLayer || !meshLayer->
isValid() )
1344 mMeshLayerCrs = meshLayer->
crs();
1345 mTriangularMesh.update( meshLayer->
nativeMesh() );
1354 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
1355 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
1357 extractDatasetValues( datasetGroups, meshLayer, *meshLayer->
nativeMesh(), relativeTime, supportedDataType(), mDataPerGroup, feedback );
1370 for ( DataGroup &dataGroup : mDataPerGroup )
1372 if ( dataGroup.dataset3dStakedValue.isValid() )
1373 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
1375 double resolution = parameterAsDouble( parameters, u
"RESOLUTION"_s, context );
1376 int datasetDigits = parameterAsInt( parameters, u
"DATASET_DIGITS"_s, context );
1377 int coordDigits = parameterAsInt( parameters, u
"COORDINATES_DIGITS"_s, context );
1379 std::unique_ptr<QgsProcessingFeatureSource> featureSource( parameterAsSource( parameters, u
"INPUT_LINES"_s, context ) );
1380 if ( !featureSource )
1385 QString outputFileName = parameterAsFileOutput( parameters, u
"OUTPUT"_s, context );
1386 QFile file( outputFileName );
1387 if ( !file.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
1390 QTextStream textStream( &file );
1392 header << u
"fid"_s << u
"x"_s << u
"y"_s << QObject::tr(
"offset" );
1393 for (
const DataGroup &datagroup : std::as_const( mDataPerGroup ) )
1394 header << datagroup.metadata.name();
1395 textStream << header.join(
',' ) << u
"\n"_s;
1397 long long featCount = featureSource->featureCount();
1398 long long featCounter = 0;
1412 feedback->
reportError( QObject::tr(
"Could not transform line to mesh CRS" ) );
1418 while ( offset <= line.
length() )
1421 return QVariantMap();
1423 QStringList textLine;
1425 int triangularFaceIndex = mTriangularMesh.faceIndexForPoint_v2( point );
1426 textLine << QString::number( fid ) << QString::number( point.
x(),
'f', coordDigits ) << QString::number( point.
y(),
'f', coordDigits ) << QString::number( offset,
'f', coordDigits );
1427 if ( triangularFaceIndex >= 0 )
1431 int nativeFaceIndex = mTriangularMesh.trianglesToNativeFaces().at( triangularFaceIndex );
1432 for (
int i = 0; i < mDataPerGroup.count(); ++i )
1434 const DataGroup &dataGroup = mDataPerGroup.at( i );
1435 bool faceActive = dataGroup.activeFaces.active( nativeFaceIndex );
1441 triangularFaceIndex,
1443 dataGroup.activeFaces,
1444 dataGroup.datasetValues,
1448 if ( abs( value.
x() ) == std::numeric_limits<double>::quiet_NaN() )
1449 textLine << QString(
' ' );
1451 textLine << QString::number( value.
scalar(),
'f', datasetDigits );
1455 for (
int i = 0; i < mDataPerGroup.count(); ++i )
1456 textLine << QString(
' ' );
1458 textStream << textLine.join(
',' ) << u
"\n"_s;
1460 offset += resolution;
1465 feedback->
setProgress( 100.0 * featCounter / featCount );
1467 return QVariantMap();
1474 ret[u
"OUTPUT"_s] = outputFileName;
1478QString QgsMeshExportTimeSeries::name()
const
1480 return u
"meshexporttimeseries"_s;
1483QString QgsMeshExportTimeSeries::displayName()
const
1485 return QObject::tr(
"Export time series values from points of a mesh dataset" );
1488QString QgsMeshExportTimeSeries::group()
const
1490 return QObject::tr(
"Mesh" );
1493QString QgsMeshExportTimeSeries::groupId()
const
1498QString QgsMeshExportTimeSeries::shortHelpString()
const
1500 return QObject::tr(
"This algorithm extracts mesh's dataset time series values from points contained in a vector layer.\n"
1501 "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." );
1504QString QgsMeshExportTimeSeries::shortDescription()
const
1506 return QObject::tr(
"Extracts a mesh dataset's time series values from points contained in a vector layer." );
1511 return new QgsMeshExportTimeSeries();
1514void QgsMeshExportTimeSeries::initAlgorithm(
const QVariantMap &configuration )
1516 Q_UNUSED( configuration );
1521 u
"DATASET_GROUPS"_s,
1522 QObject::tr(
"Dataset groups" ),
1529 QObject::tr(
"Starting time" ),
1535 u
"FINISHING_TIME"_s,
1536 QObject::tr(
"Finishing time" ),
1545 QList<int> datatype;
1548 u
"INPUT_POINTS"_s, QObject::tr(
"Points for data export" ), datatype, QVariant(),
false
1560 u
"OUTPUT"_s, QObject::tr(
"Exported data CSV file" ), QObject::tr(
"CSV file (*.csv)" )
1566 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
1568 if ( !meshLayer || !meshLayer->
isValid() )
1571 mMeshLayerCrs = meshLayer->
crs();
1572 mTriangularMesh.update( meshLayer->
nativeMesh() );
1582 QVariant parameterStartTimeVariant = parameters.value( u
"STARTING_TIME"_s );
1583 QgsInterval relativeStartTime = datasetRelativetime( parameterStartTimeVariant, meshLayer, context );
1585 QVariant parameterEndTimeVariant = parameters.value( u
"FINISHING_TIME"_s );
1586 QgsInterval relativeEndTime = datasetRelativetime( parameterEndTimeVariant, meshLayer, context );
1589 qint64 timeStepInterval = parameterAsDouble( parameters, u
"TIME_STEP"_s, context ) * 1000 * 3600;
1590 if ( timeStepInterval == 0 )
1593 for (
int groupIndex : datasetGroups )
1607 mRelativeTimeSteps.clear();
1608 mTimeStepString.clear();
1609 if ( timeStepInterval != 0 )
1611 mRelativeTimeSteps.append( relativeStartTime.
seconds() * 1000 );
1612 while ( mRelativeTimeSteps.last() < relativeEndTime.
seconds() * 1000 )
1613 mRelativeTimeSteps.append( mRelativeTimeSteps.last() + timeStepInterval );
1615 for ( qint64 relativeTimeStep : std::as_const( mRelativeTimeSteps ) )
1617 mTimeStepString.append( meshLayer->
formatTime( relativeTimeStep / 3600.0 / 1000.0 ) );
1622 for (
int i = 0; i < datasetGroups.count(); ++i )
1624 int groupIndex = datasetGroups.at( i );
1626 if ( supportedDataType().contains( meta.
dataType() ) )
1628 mGroupIndexes.append( groupIndex );
1629 mGroupsMetadata[groupIndex] = meta;
1632 if ( !mRelativeTimeSteps.isEmpty() )
1636 for ( qint64 relativeTimeStep : std::as_const( mRelativeTimeSteps ) )
1638 QMap<int, int> &groupIndexToData = mRelativeTimeToData[relativeTimeStep];
1639 QgsInterval timeStepInterval( relativeTimeStep / 1000.0 );
1641 if ( !datasetIndex.
isValid() )
1643 if ( datasetIndex != lastDatasetIndex )
1645 DataGroup dataGroup;
1646 dataGroup.metadata = meta;
1647 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, valueCount );
1651 dataGroup.dataset3dStakedValue = meshLayer->
dataset3dValues( datasetIndex, 0, valueCount );
1653 mDatasets.append( dataGroup );
1654 lastDatasetIndex = datasetIndex;
1656 groupIndexToData[groupIndex] = mDatasets.count() - 1;
1662 QMap<int, int> &groupIndexToData = mRelativeTimeToData[0];
1664 DataGroup dataGroup;
1665 dataGroup.metadata = meta;
1666 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, valueCount );
1670 dataGroup.dataset3dStakedValue = meshLayer->
dataset3dValues( datasetIndex, 0, valueCount );
1672 mDatasets.append( dataGroup );
1673 groupIndexToData[groupIndex] = mDatasets.
count() - 1;
1678 feedback->
setProgress( 100 * i / datasetGroups.count() );
1694 for ( DataGroup &dataGroup : mDatasets )
1696 if ( dataGroup.dataset3dStakedValue.isValid() )
1697 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
1700 int datasetDigits = parameterAsInt( parameters, u
"DATASET_DIGITS"_s, context );
1701 int coordDigits = parameterAsInt( parameters, u
"COORDINATES_DIGITS"_s, context );
1703 std::unique_ptr<QgsProcessingFeatureSource> featureSource( parameterAsSource( parameters, u
"INPUT_POINTS"_s, context ) );
1704 if ( !featureSource )
1709 QString outputFileName = parameterAsFileOutput( parameters, u
"OUTPUT"_s, context );
1710 QFile file( outputFileName );
1711 if ( !file.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
1714 QTextStream textStream( &file );
1716 header << u
"fid"_s << u
"x"_s << u
"y"_s << QObject::tr(
"time" );
1718 for (
int gi : std::as_const( mGroupIndexes ) )
1719 header << mGroupsMetadata.value( gi ).name();
1721 textStream << header.join(
',' ) << u
"\n"_s;
1723 long long featCount = featureSource->featureCount();
1724 long long featCounter = 0;
1738 feedback->
reportError( QObject::tr(
"Could not transform line to mesh CRS" ) );
1745 int triangularFaceIndex = mTriangularMesh.faceIndexForPoint_v2( point );
1747 if ( triangularFaceIndex >= 0 )
1749 int nativeFaceIndex = mTriangularMesh.trianglesToNativeFaces().at( triangularFaceIndex );
1750 if ( !mRelativeTimeSteps.isEmpty() )
1752 for (
int timeIndex = 0; timeIndex < mRelativeTimeSteps.count(); ++timeIndex )
1754 qint64 timeStep = mRelativeTimeSteps.at( timeIndex );
1755 QStringList textLine;
1756 textLine << QString::number( fid )
1757 << QString::number( point.
x(),
'f', coordDigits )
1758 << QString::number( point.
y(),
'f', coordDigits )
1759 << mTimeStepString.at( timeIndex );
1761 if ( mRelativeTimeToData.contains( timeStep ) )
1763 const QMap<int, int> &groupToData = mRelativeTimeToData.value( timeStep );
1764 for (
int groupIndex : std::as_const( mGroupIndexes ) )
1766 if ( !groupToData.contains( groupIndex ) )
1768 int dataIndex = groupToData.value( groupIndex );
1769 if ( dataIndex < 0 || dataIndex > mDatasets.count() - 1 )
1772 const DataGroup &dataGroup = mDatasets.at( dataIndex );
1773 QgsMeshDatasetValue value = extractDatasetValue( point, nativeFaceIndex, triangularFaceIndex, mTriangularMesh, dataGroup.activeFaces, dataGroup.datasetValues, dataGroup.metadata );
1774 if ( abs( value.
x() ) == std::numeric_limits<double>::quiet_NaN() )
1775 textLine << QString(
' ' );
1777 textLine << QString::number( value.
scalar(),
'f', datasetDigits );
1780 textStream << textLine.join(
',' ) << u
"\n"_s;
1785 QStringList textLine;
1786 textLine << QString::number( fid )
1787 << QString::number( point.
x(),
'f', coordDigits )
1788 << QString::number( point.
y(),
'f', coordDigits )
1789 << QObject::tr(
"static dataset" );
1790 const QMap<int, int> &groupToData = mRelativeTimeToData.value( 0 );
1791 for (
int groupIndex : std::as_const( mGroupIndexes ) )
1793 if ( !groupToData.contains( groupIndex ) )
1795 int dataIndex = groupToData.value( groupIndex );
1796 if ( dataIndex < 0 || dataIndex > mDatasets.count() - 1 )
1798 const DataGroup &dataGroup = mDatasets.at( dataIndex );
1799 QgsMeshDatasetValue value = extractDatasetValue( point, nativeFaceIndex, triangularFaceIndex, mTriangularMesh, dataGroup.activeFaces, dataGroup.datasetValues, dataGroup.metadata );
1800 if ( abs( value.
x() ) == std::numeric_limits<double>::quiet_NaN() )
1801 textLine << QString(
' ' );
1803 textLine << QString::number( value.
scalar(),
'f', datasetDigits );
1805 textStream << textLine.join(
',' ) << u
"\n"_s;
1811 feedback->
setProgress( 100.0 * featCounter / featCount );
1813 return QVariantMap();
1820 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.
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.