35static QgsFields createFields(
const QList<QgsMeshDatasetGroupMetadata> &groupMetadataList,
int vectorOption )
40 if ( meta.isVector() )
42 if ( vectorOption == 0 || vectorOption == 2 )
44 fields.
append(
QgsField( QStringLiteral(
"%1_x" ).arg( meta.name() ), QMetaType::Type::Double ) );
45 fields.
append(
QgsField( QStringLiteral(
"%1_y" ).arg( meta.name() ), QMetaType::Type::Double ) );
48 if ( vectorOption == 1 || vectorOption == 2 )
50 fields.
append(
QgsField( QStringLiteral(
"%1_mag" ).arg( meta.name() ), QMetaType::Type::Double ) );
51 fields.
append(
QgsField( QStringLiteral(
"%1_dir" ).arg( meta.name() ), QMetaType::Type::Double ) );
62 QVector<double> ret( exportOption == 2 ? 4 : 2 );
64 if ( exportOption == 0 || exportOption == 2 )
69 if ( exportOption == 1 || exportOption == 2 )
73 double magnitude = sqrt( x * x + y * y );
74 double direction = ( asin( x / magnitude ) ) / M_PI * 180;
76 direction = 180 - direction;
78 if ( exportOption == 1 )
83 if ( exportOption == 2 )
96 QVector<double> vectorValues = vectorValue( value, vectorOption );
97 for (
double v : vectorValues )
99 if ( v == std::numeric_limits<double>::quiet_NaN() )
100 attributes.append( QVariant() );
102 attributes.append( v );
107 if ( value.
scalar() == std::numeric_limits<double>::quiet_NaN() )
108 attributes.append( QVariant() );
110 attributes.append( value.
scalar() );
117 int triangularFaceIndex,
123 bool faceActive = activeFaces.
active( nativeFaceIndex );
135 value = datasetValues.
value( nativeFaceIndex );
142 const int v1 = face[0], v2 = face[1], v3 = face[2];
147 const double x = QgsMeshLayerUtils::interpolateFromVerticesData( p1, p2, p3, val1.
x(), val2.
x(), val3.
x(), point );
148 double y = std::numeric_limits<double>::quiet_NaN();
149 bool isVector = metadata.
isVector();
151 y = QgsMeshLayerUtils::interpolateFromVerticesData( p1, p2, p3, val1.
y(), val2.
y(), val3.
y(), point );
162QString QgsExportMeshOnElement::group()
const
164 return QObject::tr(
"Mesh" );
167QString QgsExportMeshOnElement::groupId()
const
169 return QStringLiteral(
"mesh" );
172QString QgsExportMeshVerticesAlgorithm::shortHelpString()
const
174 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." );
177QString QgsExportMeshVerticesAlgorithm::shortDescription()
const
179 return QObject::tr(
"Exports mesh vertices to a point vector layer" );
182QString QgsExportMeshVerticesAlgorithm::name()
const
184 return QStringLiteral(
"exportmeshvertices" );
187QString QgsExportMeshVerticesAlgorithm::displayName()
const
189 return QObject::tr(
"Export mesh vertices" );
194 return new QgsExportMeshVerticesAlgorithm();
197QgsGeometry QgsExportMeshVerticesAlgorithm::meshElement(
int index )
const
202void QgsExportMeshOnElement::initAlgorithm(
const QVariantMap &configuration )
204 Q_UNUSED( configuration );
210 QStringLiteral(
"DATASET_GROUPS" ),
211 QObject::tr(
"Dataset groups" ),
212 QStringLiteral(
"INPUT" ),
213 supportedDataType(),
true ) );
216 QStringLiteral(
"DATASET_TIME" ),
217 QObject::tr(
"Dataset time" ),
218 QStringLiteral(
"INPUT" ),
219 QStringLiteral(
"DATASET_GROUPS" ) ) );
221 addParameter(
new QgsProcessingParameterCrs( QStringLiteral(
"CRS_OUTPUT" ), QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
223 QStringList exportVectorOptions;
224 exportVectorOptions << QObject::tr(
"Cartesian (x,y)" )
225 << QObject::tr(
"Polar (magnitude,degree)" )
226 << QObject::tr(
"Cartesian and Polar" );
227 addParameter(
new QgsProcessingParameterEnum( QStringLiteral(
"VECTOR_OPTION" ), QObject::tr(
"Export vector option" ), exportVectorOptions,
false, 0 ) );
237 if ( timeType == QLatin1String(
"dataset-time-step" ) )
242 else if ( timeType == QLatin1String(
"defined-date-time" ) )
245 if ( dateTime.isValid() )
246 relativeTime =
QgsInterval( layerReferenceTime.secsTo( dateTime ) );
248 else if ( timeType == QLatin1String(
"current-context-time" ) )
251 if ( dateTime.isValid() )
252 relativeTime =
QgsInterval( layerReferenceTime.secsTo( dateTime ) );
261 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, QStringLiteral(
"INPUT" ), context );
263 if ( !meshLayer || !meshLayer->
isValid() )
278 QList<int> datasetGroups =
287 QVariant parameterTimeVariant = parameters.value( QStringLiteral(
"DATASET_TIME" ) );
288 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
290 switch ( meshElementType() )
293 mElementCount = mNativeMesh.faceCount();
296 mElementCount = mNativeMesh.vertexCount();
299 mElementCount = mNativeMesh.edgeCount();
303 for (
int i = 0; i < datasetGroups.count(); ++i )
305 int groupIndex = datasetGroups.at( i );
310 if ( supportedDataType().contains( dataGroup.metadata.dataType() ) )
312 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, mElementCount );
313 mDataPerGroup.append( dataGroup );
316 feedback->
setProgress( 100 * i / datasetGroups.count() );
319 mExportVectorOption = parameterAsInt( parameters, QStringLiteral(
"VECTOR_OPTION" ), context );
329 return QVariantMap();
331 feedback->
setProgressText( QObject::tr(
"Creating output vector layer" ) );
334 QList<QgsMeshDatasetGroupMetadata> metaList;
335 metaList.reserve( mDataPerGroup.size() );
336 for (
const DataGroup &dataGroup : std::as_const( mDataPerGroup ) )
337 metaList.append( dataGroup.metadata );
338 QgsFields fields = createFields( metaList, mExportVectorOption );
342 std::unique_ptr<QgsFeatureSink> sink( parameterAsSink( parameters,
343 QStringLiteral(
"OUTPUT" ),
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[QStringLiteral(
"OUTPUT" )] = 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 QStringLiteral(
"exportmeshfaces" );
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 std::unique_ptr<QgsPolygon> 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 QStringLiteral(
"exportmeshedges" );
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 QStringLiteral(
"exportmeshongrid" );}
476QString QgsExportMeshOnGridAlgorithm::displayName()
const {
return QObject::tr(
"Export mesh on grid" );}
478QString QgsExportMeshOnGridAlgorithm::group()
const {
return QObject::tr(
"Mesh" );}
480QString QgsExportMeshOnGridAlgorithm::groupId()
const {
return QStringLiteral(
"mesh" );}
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 );
506 QStringLiteral(
"DATASET_GROUPS" ),
507 QObject::tr(
"Dataset groups" ),
508 QStringLiteral(
"INPUT" ),
509 supportedDataType() ) );
512 QStringLiteral(
"DATASET_TIME" ),
513 QObject::tr(
"Dataset time" ),
514 QStringLiteral(
"INPUT" ),
515 QStringLiteral(
"DATASET_GROUPS" ) ) );
519 addParameter(
new QgsProcessingParameterDistance( QStringLiteral(
"GRID_SPACING" ), QObject::tr(
"Grid spacing" ), 10, QStringLiteral(
"INPUT" ),
false ) );
521 addParameter(
new QgsProcessingParameterCrs( QStringLiteral(
"CRS_OUTPUT" ), QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
523 QStringList exportVectorOptions;
524 exportVectorOptions << QObject::tr(
"Cartesian (x,y)" )
525 << QObject::tr(
"Polar (magnitude,degree)" )
526 << QObject::tr(
"Cartesian and Polar" );
527 addParameter(
new QgsProcessingParameterEnum( QStringLiteral(
"VECTOR_OPTION" ), QObject::tr(
"Export vector option" ), exportVectorOptions,
false, 0 ) );
531static void extractDatasetValues(
const QList<int> &datasetGroups,
535 const QSet<int> supportedDataType,
536 QList<DataGroup> &datasetPerGroup,
539 for (
int i = 0; i < datasetGroups.count(); ++i )
541 int groupIndex = datasetGroups.at( i );
546 if ( supportedDataType.contains( dataGroup.metadata.dataType() ) )
550 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, valueCount );
554 dataGroup.dataset3dStakedValue = meshLayer->
dataset3dValues( datasetIndex, 0, valueCount );
556 datasetPerGroup.append( dataGroup );
559 feedback->
setProgress( 100 * i / datasetGroups.count() );
565 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, QStringLiteral(
"INPUT" ), context );
567 if ( !meshLayer || !meshLayer->
isValid() )
579 QList<int> datasetGroups =
588 QVariant parameterTimeVariant = parameters.value( QStringLiteral(
"DATASET_TIME" ) );
589 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
591 extractDatasetValues( datasetGroups, meshLayer, nativeMesh, relativeTime, supportedDataType(), mDataPerGroup, feedback );
592 mTriangularMesh.update( meshLayer->
nativeMesh(), mTransform );
594 mExportVectorOption = parameterAsInt( parameters, QStringLiteral(
"VECTOR_OPTION" ), context );
604 return QVariantMap();
606 feedback->
setProgressText( QObject::tr(
"Creating output vector layer" ) );
611 for ( DataGroup &dataGroup : mDataPerGroup )
613 if ( dataGroup.dataset3dStakedValue.isValid() )
614 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
617 QList<QgsMeshDatasetGroupMetadata> metaList;
618 metaList.reserve( mDataPerGroup.size() );
619 for (
const DataGroup &dataGroup : std::as_const( mDataPerGroup ) )
620 metaList.append( dataGroup.metadata );
621 QgsFields fields = createFields( metaList, mExportVectorOption );
626 std::unique_ptr<QgsFeatureSink> sink( parameterAsSink( parameters,
627 QStringLiteral(
"OUTPUT" ),
634 return QVariantMap();
639 return QVariantMap();
645 double gridSpacing = parameterAsDouble( parameters, QStringLiteral(
"GRID_SPACING" ), context );
646 QgsRectangle extent = parameterAsExtent( parameters, QStringLiteral(
"EXTENT" ), context );
648 extent = mTriangularMesh.extent();
649 int pointXCount = int( extent.
width() / gridSpacing ) + 1;
650 int pointYCount = int( extent.
height() / gridSpacing ) + 1;
652 for (
int ix = 0; ix < pointXCount; ++ix )
654 for (
int iy = 0; iy < pointYCount; ++iy )
657 int triangularFaceIndex = mTriangularMesh.faceIndexForPoint_v2( point );
658 if ( triangularFaceIndex >= 0 )
662 int nativeFaceIndex = mTriangularMesh.trianglesToNativeFaces().at( triangularFaceIndex );
663 for (
int i = 0; i < mDataPerGroup.count(); ++i )
665 const DataGroup &dataGroup = mDataPerGroup.at( i );
666 bool faceActive = dataGroup.activeFaces.active( nativeFaceIndex );
674 dataGroup.activeFaces,
675 dataGroup.datasetValues,
676 dataGroup.metadata );
678 if ( dataGroup.metadata.isVector() )
680 QVector<double> vector = vectorValue( dataGroup.datasetValues.value( i ), mExportVectorOption );
681 for (
double v : vector )
683 attributes.append( v );
687 attributes.append( value.
scalar() );
698 feedback->
reportError( QObject::tr(
"Could not transform point to destination CRS" ) );
703 sink->addFeature( feat );
711 ret[QStringLiteral(
"OUTPUT" )] = identifier;
716QSet<int> QgsExportMeshOnGridAlgorithm::supportedDataType()
725QString QgsMeshRasterizeAlgorithm::name()
const
727 return QStringLiteral(
"meshrasterize" );
730QString QgsMeshRasterizeAlgorithm::displayName()
const
732 return QObject::tr(
"Rasterize mesh dataset" );
735QString QgsMeshRasterizeAlgorithm::group()
const
737 return QObject::tr(
"Mesh" );
740QString QgsMeshRasterizeAlgorithm::groupId()
const
742 return QStringLiteral(
"mesh" );
745QString QgsMeshRasterizeAlgorithm::shortHelpString()
const
747 return QObject::tr(
"This algorithm creates a raster layer from a mesh dataset.\n"
748 "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"
749 "1D meshes are not supported." );
752QString QgsMeshRasterizeAlgorithm::shortDescription()
const
754 return QObject::tr(
"Creates a raster layer from a mesh dataset" );
759 return new QgsMeshRasterizeAlgorithm();
762void QgsMeshRasterizeAlgorithm::initAlgorithm(
const QVariantMap &configuration )
764 Q_UNUSED( configuration );
769 QStringLiteral(
"DATASET_GROUPS" ),
770 QObject::tr(
"Dataset groups" ),
771 QStringLiteral(
"INPUT" ),
776 QStringLiteral(
"DATASET_TIME" ),
777 QObject::tr(
"Dataset time" ),
778 QStringLiteral(
"INPUT" ),
779 QStringLiteral(
"DATASET_GROUPS" ) ) );
782 addParameter(
new QgsProcessingParameterDistance( QStringLiteral(
"PIXEL_SIZE" ), QObject::tr(
"Pixel size" ), 1, QStringLiteral(
"INPUT" ),
false ) );
783 addParameter(
new QgsProcessingParameterCrs( QStringLiteral(
"CRS_OUTPUT" ), QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
785 std::unique_ptr< QgsProcessingParameterString > createOptsParam = std::make_unique< QgsProcessingParameterString >( QStringLiteral(
"CREATE_OPTIONS" ), QObject::tr(
"Creation options" ), QVariant(),
false,
true );
786 createOptsParam->setMetadata( QVariantMap( {{QStringLiteral(
"widget_wrapper" ), QVariantMap( {{QStringLiteral(
"widget_type" ), QStringLiteral(
"rasteroptions" ) }} ) }} ) );
788 addParameter( createOptsParam.release() );
795 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, QStringLiteral(
"INPUT" ), context );
797 if ( !meshLayer || !meshLayer->
isValid() )
807 mTriangularMesh.update( meshLayer->
nativeMesh(), mTransform );
809 QList<int> datasetGroups =
818 QVariant parameterTimeVariant = parameters.value( QStringLiteral(
"DATASET_TIME" ) );
819 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
821 extractDatasetValues( datasetGroups, meshLayer, *meshLayer->
nativeMesh(), relativeTime, supportedDataType(), mDataPerGroup, feedback );
833 return QVariantMap();
840 for ( DataGroup &dataGroup : mDataPerGroup )
842 if ( dataGroup.dataset3dStakedValue.isValid() )
843 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
847 double pixelSize = parameterAsDouble( parameters, QStringLiteral(
"PIXEL_SIZE" ), context );
848 QgsRectangle extent = parameterAsExtent( parameters, QStringLiteral(
"EXTENT" ), context );
850 extent = mTriangularMesh.extent();
852 int width = extent.
width() / pixelSize;
853 int height = extent.
height() / pixelSize;
855 const QString createOptions = parameterAsString( parameters, QStringLiteral(
"CREATE_OPTIONS" ), context ).trimmed();
856 const QString fileName = parameterAsOutputLayer( parameters, QStringLiteral(
"OUTPUT" ), context );
857 const QFileInfo fileInfo( fileName );
860 rasterFileWriter.setOutputProviderKey( QStringLiteral(
"gdal" ) );
861 if ( !createOptions.isEmpty() )
863 rasterFileWriter.setCreateOptions( createOptions.split(
'|' ) );
865 rasterFileWriter.setOutputFormat( outputFormat );
867 std::unique_ptr<QgsRasterDataProvider> rasterDataProvider(
868 rasterFileWriter.createMultiBandRaster(
Qgis::DataType::Float64, width, height, extent, mTransform.destinationCrs(), mDataPerGroup.count() ) );
869 rasterDataProvider->setEditable(
true );
871 for (
int i = 0; i < mDataPerGroup.count(); ++i )
873 const DataGroup &dataGroup = mDataPerGroup.at( i );
878 if ( dataGroup.datasetValues.isValid() )
882 dataGroup.datasetValues,
883 dataGroup.activeFaces,
884 dataGroup.metadata.dataType(),
888 &rasterBlockFeedBack ) );
890 rasterDataProvider->writeBlock( block.get(), i + 1 );
891 rasterDataProvider->setNoDataValue( i + 1, block->noDataValue() );
894 rasterDataProvider->setNoDataValue( i + 1, std::numeric_limits<double>::quiet_NaN() );
899 return QVariantMap();
900 feedback->
setProgress( 100 * i / mDataPerGroup.count() );
904 rasterDataProvider->setEditable(
false );
910 ret[QStringLiteral(
"OUTPUT" )] = fileName;
915QSet<int> QgsMeshRasterizeAlgorithm::supportedDataType()
924QString QgsMeshContoursAlgorithm::name()
const
926 return QStringLiteral(
"meshcontours" );
929QString QgsMeshContoursAlgorithm::displayName()
const
931 return QObject::tr(
"Export contours" );
934QString QgsMeshContoursAlgorithm::group()
const
936 return QObject::tr(
"Mesh" );
939QString QgsMeshContoursAlgorithm::groupId()
const
941 return QStringLiteral(
"mesh" );
944QString QgsMeshContoursAlgorithm::shortHelpString()
const
946 return QObject::tr(
"This algorithm creates contours as a vector layer from a mesh scalar dataset." );
949QString QgsMeshContoursAlgorithm::shortDescription()
const
951 return QObject::tr(
"Creates contours as vector layer from mesh scalar dataset" );
956 return new QgsMeshContoursAlgorithm();
959void QgsMeshContoursAlgorithm::initAlgorithm(
const QVariantMap &configuration )
961 Q_UNUSED( configuration );
966 QStringLiteral(
"DATASET_GROUPS" ),
967 QObject::tr(
"Dataset groups" ),
968 QStringLiteral(
"INPUT" ),
969 supportedDataType() ) );
972 QStringLiteral(
"DATASET_TIME" ),
973 QObject::tr(
"Dataset time" ),
974 QStringLiteral(
"INPUT" ),
975 QStringLiteral(
"DATASET_GROUPS" ) ) );
985 std::unique_ptr< QgsProcessingParameterString > contourLevelList = std::make_unique < QgsProcessingParameterString >(
986 QStringLiteral(
"CONTOUR_LEVEL_LIST" ), QObject::tr(
"List of contours level" ), QVariant(),
false,
true );
987 contourLevelList->setHelp( QObject::tr(
"Comma separated list of values to export. If filled, the increment, minimum and maximum settings are ignored." ) );
988 addParameter( contourLevelList.release() );
990 addParameter(
new QgsProcessingParameterCrs( QStringLiteral(
"CRS_OUTPUT" ), QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
999 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, QStringLiteral(
"INPUT" ), context );
1001 if ( !meshLayer || !meshLayer->
isValid() )
1011 mTriangularMesh.update( meshLayer->
nativeMesh(), mTransform );
1017 QString levelsString = parameterAsString( parameters, QStringLiteral(
"CONTOUR_LEVEL_LIST" ), context );
1018 if ( ! levelsString.isEmpty() )
1020 QStringList levelStringList = levelsString.split(
',' );
1021 if ( !levelStringList.isEmpty() )
1023 for (
const QString &stringVal : levelStringList )
1026 double val = stringVal.toDouble( &ok );
1028 mLevels.append( val );
1030 throw QgsProcessingException( QObject::tr(
"Invalid format for level values, must be numbers separated with comma" ) );
1032 if ( mLevels.count() >= 2 )
1033 if ( mLevels.last() <= mLevels.at( mLevels.count() - 2 ) )
1034 throw QgsProcessingException( QObject::tr(
"Invalid format for level values, must be different numbers and in increasing order" ) );
1039 if ( mLevels.isEmpty() )
1041 double minimum = parameterAsDouble( parameters, QStringLiteral(
"MINIMUM" ), context );
1042 double maximum = parameterAsDouble( parameters, QStringLiteral(
"MAXIMUM" ), context );
1043 double interval = parameterAsDouble( parameters, QStringLiteral(
"INCREMENT" ), context );
1045 if ( interval <= 0 )
1048 if ( minimum >= maximum )
1049 throw QgsProcessingException( QObject::tr(
"Invalid minimum and maximum values, minimum must be lesser than maximum" ) );
1051 if ( interval > ( maximum - minimum ) )
1052 throw QgsProcessingException( QObject::tr(
"Invalid minimum, maximum and interval values, difference between minimum and maximum must be greater or equal than interval" ) );
1054 int intervalCount = ( maximum - minimum ) / interval;
1056 mLevels.reserve( intervalCount );
1057 for (
int i = 0; i < intervalCount; ++i )
1059 mLevels.append( minimum + i * interval );
1064 QList<int> datasetGroups =
1073 QVariant parameterTimeVariant = parameters.value( QStringLiteral(
"DATASET_TIME" ) );
1074 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
1078 extractDatasetValues( datasetGroups, meshLayer, mNativeMesh, relativeTime, supportedDataType(), mDataPerGroup, feedback );
1089 for ( DataGroup &dataGroup : mDataPerGroup )
1091 if ( dataGroup.dataset3dStakedValue.isValid() )
1092 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
1098 polygonFields.
append(
QgsField( QObject::tr(
"group" ), QMetaType::Type::QString ) );
1099 polygonFields.
append(
QgsField( QObject::tr(
"time" ), QMetaType::Type::QString ) );
1100 polygonFields.
append(
QgsField( QObject::tr(
"min_value" ), QMetaType::Type::Double ) );
1101 polygonFields.
append(
QgsField( QObject::tr(
"max_value" ), QMetaType::Type::Double ) );
1102 lineFields.
append(
QgsField( QObject::tr(
"group" ), QMetaType::Type::QString ) );
1103 lineFields.
append(
QgsField( QObject::tr(
"time" ), QMetaType::Type::QString ) );
1104 lineFields.
append(
QgsField( QObject::tr(
"value" ), QMetaType::Type::Double ) );
1108 QString lineIdentifier;
1109 QString polygonIdentifier;
1110 std::unique_ptr<QgsFeatureSink> sinkPolygons( parameterAsSink(
1112 QStringLiteral(
"OUTPUT_POLYGONS" ),
1118 std::unique_ptr<QgsFeatureSink> sinkLines( parameterAsSink(
1120 QStringLiteral(
"OUTPUT_LINES" ),
1127 if ( !sinkLines || !sinkPolygons )
1128 return QVariantMap();
1131 for (
int i = 0; i < mDataPerGroup.count(); ++i )
1133 DataGroup dataGroup = mDataPerGroup.at( i );
1135 int count = scalarDataOnVertices ? mNativeMesh.vertices.count() : mNativeMesh.faces.count();
1137 QVector<double> values;
1138 if ( dataGroup.datasetValues.isValid() )
1141 values = QgsMeshLayerUtils::calculateMagnitudes( dataGroup.datasetValues );
1145 values = QVector<double>( count, std::numeric_limits<double>::quiet_NaN() );
1148 if ( ( !scalarDataOnVertices ) )
1150 values = QgsMeshLayerUtils::interpolateFromFacesData(
1153 &dataGroup.activeFaces,
1158 QgsMeshContours contoursExported( mTriangularMesh, mNativeMesh, values, dataGroup.activeFaces );
1161 firstAttributes.append( dataGroup.metadata.name() );
1162 firstAttributes.append( mDateTimeString );
1164 for (
double level : std::as_const( mLevels ) )
1166 QgsGeometry line = contoursExported.exportLines( level, feedback );
1168 return QVariantMap();
1172 lineAttributes.append( level );
1178 sinkLines->addFeature( lineFeat );
1182 for (
int l = 0; l < mLevels.count() - 1; ++l )
1184 QgsGeometry polygon = contoursExported.exportPolygons( mLevels.at( l ), mLevels.at( l + 1 ), feedback );
1186 return QVariantMap();
1191 polygonAttributes.append( mLevels.at( l ) );
1192 polygonAttributes.append( mLevels.at( l + 1 ) );
1197 sinkPolygons->addFeature( polygonFeature );
1202 feedback->
setProgress( 100 * i / mDataPerGroup.count() );
1207 sinkPolygons->finalize();
1209 sinkLines->finalize();
1212 ret[QStringLiteral(
"OUTPUT_LINES" )] = lineIdentifier;
1213 ret[QStringLiteral(
"OUTPUT_POLYGONS" )] = polygonIdentifier;
1218QString QgsMeshExportCrossSection::name()
const
1220 return QStringLiteral(
"meshexportcrosssection" );
1223QString QgsMeshExportCrossSection::displayName()
const
1225 return QObject::tr(
"Export cross section dataset values on lines from mesh" );
1228QString QgsMeshExportCrossSection::group()
const
1230 return QObject::tr(
"Mesh" );
1233QString QgsMeshExportCrossSection::groupId()
const
1235 return QStringLiteral(
"mesh" );
1238QString QgsMeshExportCrossSection::shortHelpString()
const
1240 return QObject::tr(
"This algorithm extracts mesh's dataset values from line contained in a vector layer.\n"
1241 "Each line is discretized with a resolution distance parameter for extraction of values on its vertices." );
1244QString QgsMeshExportCrossSection::shortDescription()
const
1246 return QObject::tr(
"Extracts a mesh dataset's values from lines contained in a vector layer" );
1251 return new QgsMeshExportCrossSection();
1254void QgsMeshExportCrossSection::initAlgorithm(
const QVariantMap &configuration )
1256 Q_UNUSED( configuration );
1261 QStringLiteral(
"DATASET_GROUPS" ),
1262 QObject::tr(
"Dataset groups" ),
1263 QStringLiteral(
"INPUT" ),
1264 supportedDataType() ) );
1267 QStringLiteral(
"DATASET_TIME" ),
1268 QObject::tr(
"Dataset time" ),
1269 QStringLiteral(
"INPUT" ),
1270 QStringLiteral(
"DATASET_GROUPS" ) ) );
1272 QList<int> datatype;
1275 QStringLiteral(
"INPUT_LINES" ), QObject::tr(
"Lines for data export" ), datatype, QVariant(),
false ) );
1278 QStringLiteral(
"RESOLUTION" ), QObject::tr(
"Line segmentation resolution" ), 10.0, QStringLiteral(
"INPUT_LINES" ),
false, 0 ) );
1287 QStringLiteral(
"OUTPUT" ), QObject::tr(
"Exported data CSV file" ), QObject::tr(
"CSV file (*.csv)" ) ) );
1292 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, QStringLiteral(
"INPUT" ), context );
1294 if ( !meshLayer || !meshLayer->
isValid() )
1297 mMeshLayerCrs = meshLayer->
crs();
1298 mTriangularMesh.update( meshLayer->
nativeMesh() );
1299 QList<int> datasetGroups =
1308 QVariant parameterTimeVariant = parameters.value( QStringLiteral(
"DATASET_TIME" ) );
1309 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
1311 extractDatasetValues( datasetGroups, meshLayer, *meshLayer->
nativeMesh(), relativeTime, supportedDataType(), mDataPerGroup, feedback );
1324 for ( DataGroup &dataGroup : mDataPerGroup )
1326 if ( dataGroup.dataset3dStakedValue.isValid() )
1327 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
1329 double resolution = parameterAsDouble( parameters, QStringLiteral(
"RESOLUTION" ), context );
1330 int datasetDigits = parameterAsInt( parameters, QStringLiteral(
"DATASET_DIGITS" ), context );
1331 int coordDigits = parameterAsInt( parameters, QStringLiteral(
"COORDINATES_DIGITS" ), context );
1333 std::unique_ptr< QgsProcessingFeatureSource > featureSource( parameterAsSource( parameters, QStringLiteral(
"INPUT_LINES" ), context ) );
1334 if ( !featureSource )
1339 QString outputFileName = parameterAsFileOutput( parameters, QStringLiteral(
"OUTPUT" ), context );
1340 QFile file( outputFileName );
1341 if ( ! file.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
1344 QTextStream textStream( &file );
1345#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
1346 textStream.setCodec(
"UTF-8" );
1349 header << QStringLiteral(
"fid" ) << QStringLiteral(
"x" ) << QStringLiteral(
"y" ) << QObject::tr(
"offset" );
1350 for (
const DataGroup &datagroup : std::as_const( mDataPerGroup ) )
1351 header << datagroup.metadata.name();
1352 textStream << header.join(
',' ) << QStringLiteral(
"\n" );
1354 long long featCount = featureSource->featureCount();
1355 long long featCounter = 0;
1369 feedback->
reportError( QObject::tr(
"Could not transform line to mesh CRS" ) );
1375 while ( offset <= line.
length() )
1378 return QVariantMap();
1380 QStringList textLine;
1382 int triangularFaceIndex = mTriangularMesh.faceIndexForPoint_v2( point );
1383 textLine << QString::number( fid ) << QString::number( point.
x(),
'f', coordDigits ) << QString::number( point.
y(),
'f', coordDigits ) << QString::number( offset,
'f', coordDigits );
1384 if ( triangularFaceIndex >= 0 )
1388 int nativeFaceIndex = mTriangularMesh.trianglesToNativeFaces().at( triangularFaceIndex );
1389 for (
int i = 0; i < mDataPerGroup.count(); ++i )
1391 const DataGroup &dataGroup = mDataPerGroup.at( i );
1392 bool faceActive = dataGroup.activeFaces.active( nativeFaceIndex );
1398 triangularFaceIndex,
1400 dataGroup.activeFaces,
1401 dataGroup.datasetValues,
1402 dataGroup.metadata );
1404 if ( abs( value.
x() ) == std::numeric_limits<double>::quiet_NaN() )
1405 textLine << QString(
' ' );
1407 textLine << QString::number( value.
scalar(),
'f', datasetDigits );
1411 for (
int i = 0; i < mDataPerGroup.count(); ++i )
1412 textLine << QString(
' ' );
1414 textStream << textLine.join(
',' ) << QStringLiteral(
"\n" );
1416 offset += resolution;
1421 feedback->
setProgress( 100.0 * featCounter / featCount );
1423 return QVariantMap();
1430 ret[QStringLiteral(
"OUTPUT" )] = outputFileName;
1434QString QgsMeshExportTimeSeries::name()
const
1436 return QStringLiteral(
"meshexporttimeseries" );
1439QString QgsMeshExportTimeSeries::displayName()
const
1441 return QObject::tr(
"Export time series values from points of a mesh dataset" );
1444QString QgsMeshExportTimeSeries::group()
const
1446 return QObject::tr(
"Mesh" );
1449QString QgsMeshExportTimeSeries::groupId()
const
1451 return QStringLiteral(
"mesh" );
1454QString QgsMeshExportTimeSeries::shortHelpString()
const
1456 return QObject::tr(
"This algorithm extracts mesh's dataset time series values from points contained in a vector layer.\n"
1457 "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." );
1460QString QgsMeshExportTimeSeries::shortDescription()
const
1462 return QObject::tr(
"Extracts a mesh dataset's time series values from points contained in a vector layer" );
1467 return new QgsMeshExportTimeSeries();
1470void QgsMeshExportTimeSeries::initAlgorithm(
const QVariantMap &configuration )
1472 Q_UNUSED( configuration );
1477 QStringLiteral(
"DATASET_GROUPS" ),
1478 QObject::tr(
"Dataset groups" ),
1479 QStringLiteral(
"INPUT" ),
1480 supportedDataType() ) );
1483 QStringLiteral(
"STARTING_TIME" ),
1484 QObject::tr(
"Starting time" ),
1485 QStringLiteral(
"INPUT" ),
1486 QStringLiteral(
"DATASET_GROUPS" ) ) );
1489 QStringLiteral(
"FINISHING_TIME" ),
1490 QObject::tr(
"Finishing time" ),
1491 QStringLiteral(
"INPUT" ),
1492 QStringLiteral(
"DATASET_GROUPS" ) ) );
1497 QList<int> datatype;
1500 QStringLiteral(
"INPUT_POINTS" ), QObject::tr(
"Points for data export" ), datatype, QVariant(),
false ) );
1509 QStringLiteral(
"OUTPUT" ), QObject::tr(
"Exported data CSV file" ), QObject::tr(
"CSV file (*.csv)" ) ) );
1514 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, QStringLiteral(
"INPUT" ), context );
1516 if ( !meshLayer || !meshLayer->
isValid() )
1519 mMeshLayerCrs = meshLayer->
crs();
1520 mTriangularMesh.update( meshLayer->
nativeMesh() );
1522 QList<int> datasetGroups =
1531 QVariant parameterStartTimeVariant = parameters.value( QStringLiteral(
"STARTING_TIME" ) );
1532 QgsInterval relativeStartTime = datasetRelativetime( parameterStartTimeVariant, meshLayer, context );
1534 QVariant parameterEndTimeVariant = parameters.value( QStringLiteral(
"FINISHING_TIME" ) );
1535 QgsInterval relativeEndTime = datasetRelativetime( parameterEndTimeVariant, meshLayer, context );
1538 qint64 timeStepInterval = parameterAsDouble( parameters, QStringLiteral(
"TIME_STEP" ), context ) * 1000 * 3600;
1539 if ( timeStepInterval == 0 )
1542 for (
int groupIndex : datasetGroups )
1556 mRelativeTimeSteps.clear();
1557 mTimeStepString.clear();
1558 if ( timeStepInterval != 0 )
1560 mRelativeTimeSteps.append( relativeStartTime.
seconds() * 1000 );
1561 while ( mRelativeTimeSteps.last() < relativeEndTime.
seconds() * 1000 )
1562 mRelativeTimeSteps.append( mRelativeTimeSteps.last() + timeStepInterval );
1564 for ( qint64 relativeTimeStep : std::as_const( mRelativeTimeSteps ) )
1566 mTimeStepString.append( meshLayer->
formatTime( relativeTimeStep / 3600.0 / 1000.0 ) );
1571 for (
int i = 0; i < datasetGroups.count(); ++i )
1573 int groupIndex = datasetGroups.at( i );
1575 if ( supportedDataType().contains( meta.
dataType() ) )
1577 mGroupIndexes.append( groupIndex );
1578 mGroupsMetadata[groupIndex] = meta;
1582 if ( !mRelativeTimeSteps.isEmpty() )
1586 for ( qint64 relativeTimeStep : std::as_const( mRelativeTimeSteps ) )
1588 QMap<int, int> &groupIndexToData = mRelativeTimeToData[relativeTimeStep];
1589 QgsInterval timeStepInterval( relativeTimeStep / 1000.0 );
1591 if ( !datasetIndex.
isValid() )
1593 if ( datasetIndex != lastDatasetIndex )
1595 DataGroup dataGroup;
1596 dataGroup.metadata = meta;
1597 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, valueCount );
1601 dataGroup.dataset3dStakedValue = meshLayer->
dataset3dValues( datasetIndex, 0, valueCount );
1603 mDatasets.append( dataGroup );
1604 lastDatasetIndex = datasetIndex;
1606 groupIndexToData[groupIndex] = mDatasets.count() - 1;
1612 QMap<int, int> &groupIndexToData = mRelativeTimeToData[0];
1614 DataGroup dataGroup;
1615 dataGroup.metadata = meta;
1616 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, valueCount );
1620 dataGroup.dataset3dStakedValue = meshLayer->
dataset3dValues( datasetIndex, 0, valueCount );
1622 mDatasets.append( dataGroup );
1623 groupIndexToData[groupIndex] = mDatasets.
count() - 1;
1628 feedback->
setProgress( 100 * i / datasetGroups.count() );
1644 for ( DataGroup &dataGroup : mDatasets )
1646 if ( dataGroup.dataset3dStakedValue.isValid() )
1647 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
1650 int datasetDigits = parameterAsInt( parameters, QStringLiteral(
"DATASET_DIGITS" ), context );
1651 int coordDigits = parameterAsInt( parameters, QStringLiteral(
"COORDINATES_DIGITS" ), context );
1653 std::unique_ptr< QgsProcessingFeatureSource > featureSource( parameterAsSource( parameters, QStringLiteral(
"INPUT_POINTS" ), context ) );
1654 if ( !featureSource )
1659 QString outputFileName = parameterAsFileOutput( parameters, QStringLiteral(
"OUTPUT" ), context );
1660 QFile file( outputFileName );
1661 if ( ! file.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
1664 QTextStream textStream( &file );
1665#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
1666 textStream.setCodec(
"UTF-8" );
1669 header << QStringLiteral(
"fid" ) << QStringLiteral(
"x" ) << QStringLiteral(
"y" ) << QObject::tr(
"time" );
1671 for (
int gi : std::as_const( mGroupIndexes ) )
1672 header << mGroupsMetadata.value( gi ).name();
1674 textStream << header.join(
',' ) << QStringLiteral(
"\n" );
1676 long long featCount = featureSource->featureCount();
1677 long long featCounter = 0;
1691 feedback->
reportError( QObject::tr(
"Could not transform line to mesh CRS" ) );
1698 int triangularFaceIndex = mTriangularMesh.faceIndexForPoint_v2( point );
1700 if ( triangularFaceIndex >= 0 )
1702 int nativeFaceIndex = mTriangularMesh.trianglesToNativeFaces().at( triangularFaceIndex );
1703 if ( !mRelativeTimeSteps.isEmpty() )
1705 for (
int timeIndex = 0; timeIndex < mRelativeTimeSteps.count(); ++timeIndex )
1707 qint64 timeStep = mRelativeTimeSteps.at( timeIndex );
1708 QStringList textLine;
1709 textLine << QString::number( fid )
1710 << QString::number( point.
x(),
'f', coordDigits )
1711 << QString::number( point.
y(),
'f', coordDigits )
1712 << mTimeStepString.at( timeIndex );
1714 if ( mRelativeTimeToData.contains( timeStep ) )
1716 const QMap<int, int> &groupToData = mRelativeTimeToData.value( timeStep );
1717 for (
int groupIndex : std::as_const( mGroupIndexes ) )
1719 if ( !groupToData.contains( groupIndex ) )
1721 int dataIndex = groupToData.value( groupIndex );
1722 if ( dataIndex < 0 || dataIndex > mDatasets.count() - 1 )
1725 const DataGroup &dataGroup = mDatasets.at( dataIndex );
1728 triangularFaceIndex,
1730 dataGroup.activeFaces,
1731 dataGroup.datasetValues,
1732 dataGroup.metadata );
1733 if ( abs( value.
x() ) == std::numeric_limits<double>::quiet_NaN() )
1734 textLine << QString(
' ' );
1736 textLine << QString::number( value.
scalar(),
'f', datasetDigits ) ;
1739 textStream << textLine.join(
',' ) << QStringLiteral(
"\n" );
1744 QStringList textLine;
1745 textLine << QString::number( fid )
1746 << QString::number( point.
x(),
'f', coordDigits )
1747 << QString::number( point.
y(),
'f', coordDigits )
1748 << QObject::tr(
"static dataset" );
1749 const QMap<int, int> &groupToData = mRelativeTimeToData.value( 0 );
1750 for (
int groupIndex : std::as_const( mGroupIndexes ) )
1752 if ( !groupToData.contains( groupIndex ) )
1754 int dataIndex = groupToData.value( groupIndex );
1755 if ( dataIndex < 0 || dataIndex > mDatasets.count() - 1 )
1757 const DataGroup &dataGroup = mDatasets.at( dataIndex );
1760 triangularFaceIndex,
1762 dataGroup.activeFaces,
1763 dataGroup.datasetValues,
1764 dataGroup.metadata );
1765 if ( abs( value.
x() ) == std::numeric_limits<double>::quiet_NaN() )
1766 textLine << QString(
' ' );
1768 textLine << QString::number( value.
scalar(),
'f', datasetDigits );
1770 textStream << textLine.join(
',' ) << QStringLiteral(
"\n" );
1776 feedback->
setProgress( 100.0 * featCounter / featCount );
1778 return QVariantMap();
1785 ret[QStringLiteral(
"OUTPUT" )] = outputFileName;
@ VectorPoint
Vector point layers.
@ VectorPolygon
Vector polygon layers.
@ VectorLine
Vector line layers.
@ Float64
Sixty four bit floating point (double)
@ LineStringZ
LineStringZ.
@ Advanced
Parameter is an advanced parameter which should be hidden from users by default.
@ Double
Double/float values.
This class 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.
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 to interpolate 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.
int count() const
Number of 2d faces for which the volume data is stored in the block.
Exporter of contours lines or polygons from a mesh layer.
QgsMeshDataBlock is a block of integers/doubles that can be used to retrieve: active flags (e....
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.
QgsMeshDatasetIndex is index that identifies the dataset group (e.g.
bool isValid() const
Returns whether index is valid, ie at least groups is set.
QgsMeshDatasetValue represents single 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.
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.
A class to represent a 2D point.
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.
static QString driverForExtension(const QString &extension)
Returns the GDAL driver name for a specified file extension.
A rectangle specified with double values.
double xMinimum() const
Returns the x minimum value (left side of rectangle).
double yMinimum() const
Returns the y minimum value (bottom side of rectangle).
double width() const
Returns the width of the rectangle.
bool isEmpty() const
Returns true if the rectangle has no area.
double height() const
Returns the height of the rectangle.
T begin() const
Returns the beginning of the range.
Triangular/Derived Mesh is mesh with vertices in map coordinates.
const QVector< QgsMeshFace > & triangles() const
Returns triangles.
const QVector< QgsMeshVertex > & vertices() const
Returns vertices in map coordinate system.
CORE_EXPORT 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.
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.
const QgsCoordinateReferenceSystem & outputCrs
Mesh - vertices, edges and faces.
QVector< QgsMeshVertex > vertices
void clear()
Remove all vertices, edges and faces.
int faceCount() const
Returns number of faces.