36static QgsFields createFields(
const QList<QgsMeshDatasetGroupMetadata> &groupMetadataList,
int vectorOption )
41 if ( meta.isVector() )
43 if ( vectorOption == 0 || vectorOption == 2 )
45 fields.
append(
QgsField( QStringLiteral(
"%1_x" ).arg( meta.name() ), QMetaType::Type::Double ) );
46 fields.
append(
QgsField( QStringLiteral(
"%1_y" ).arg( meta.name() ), QMetaType::Type::Double ) );
49 if ( vectorOption == 1 || vectorOption == 2 )
51 fields.
append(
QgsField( QStringLiteral(
"%1_mag" ).arg( meta.name() ), QMetaType::Type::Double ) );
52 fields.
append(
QgsField( QStringLiteral(
"%1_dir" ).arg( meta.name() ), QMetaType::Type::Double ) );
63 QVector<double> ret( exportOption == 2 ? 4 : 2 );
65 if ( exportOption == 0 || exportOption == 2 )
70 if ( exportOption == 1 || exportOption == 2 )
74 double magnitude = sqrt( x * x + y * y );
75 double direction = ( asin( x / magnitude ) ) / M_PI * 180;
77 direction = 180 - direction;
79 if ( exportOption == 1 )
84 if ( exportOption == 2 )
97 QVector<double> vectorValues = vectorValue( value, vectorOption );
98 for (
double v : vectorValues )
100 if ( v == std::numeric_limits<double>::quiet_NaN() )
101 attributes.append( QVariant() );
103 attributes.append( v );
108 if ( value.
scalar() == std::numeric_limits<double>::quiet_NaN() )
109 attributes.append( QVariant() );
111 attributes.append( value.
scalar() );
118 int triangularFaceIndex,
125 bool faceActive = activeFaces.
active( nativeFaceIndex );
137 value = datasetValues.
value( nativeFaceIndex );
144 const int v1 = face[0], v2 = face[1], v3 = face[2];
149 const double x = QgsMeshLayerUtils::interpolateFromVerticesData( p1, p2, p3, val1.
x(), val2.
x(), val3.
x(), point );
150 double y = std::numeric_limits<double>::quiet_NaN();
151 bool isVector = metadata.
isVector();
153 y = QgsMeshLayerUtils::interpolateFromVerticesData( p1, p2, p3, val1.
y(), val2.
y(), val3.
y(), point );
164QString QgsExportMeshOnElement::group()
const
166 return QObject::tr(
"Mesh" );
169QString QgsExportMeshOnElement::groupId()
const
171 return QStringLiteral(
"mesh" );
174QString QgsExportMeshVerticesAlgorithm::shortHelpString()
const
176 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." );
179QString QgsExportMeshVerticesAlgorithm::shortDescription()
const
181 return QObject::tr(
"Exports mesh vertices to a point vector layer." );
184QString QgsExportMeshVerticesAlgorithm::name()
const
186 return QStringLiteral(
"exportmeshvertices" );
189QString QgsExportMeshVerticesAlgorithm::displayName()
const
191 return QObject::tr(
"Export mesh vertices" );
196 return new QgsExportMeshVerticesAlgorithm();
199QgsGeometry QgsExportMeshVerticesAlgorithm::meshElement(
int index )
const
204void QgsExportMeshOnElement::initAlgorithm(
const QVariantMap &configuration )
206 Q_UNUSED( configuration );
212 QStringLiteral(
"DATASET_GROUPS" ),
213 QObject::tr(
"Dataset groups" ),
214 QStringLiteral(
"INPUT" ),
215 supportedDataType(),
true
219 QStringLiteral(
"DATASET_TIME" ),
220 QObject::tr(
"Dataset time" ),
221 QStringLiteral(
"INPUT" ),
222 QStringLiteral(
"DATASET_GROUPS" )
225 addParameter(
new QgsProcessingParameterCrs( QStringLiteral(
"CRS_OUTPUT" ), QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
227 QStringList exportVectorOptions;
228 exportVectorOptions << QObject::tr(
"Cartesian (x,y)" )
229 << QObject::tr(
"Polar (magnitude,degree)" )
230 << QObject::tr(
"Cartesian and Polar" );
231 addParameter(
new QgsProcessingParameterEnum( QStringLiteral(
"VECTOR_OPTION" ), QObject::tr(
"Export vector option" ), exportVectorOptions,
false, 0 ) );
241 if ( timeType == QLatin1String(
"dataset-time-step" ) )
246 else if ( timeType == QLatin1String(
"defined-date-time" ) )
249 if ( dateTime.isValid() )
250 relativeTime =
QgsInterval( layerReferenceTime.secsTo( dateTime ) );
252 else if ( timeType == QLatin1String(
"current-context-time" ) )
255 if ( dateTime.isValid() )
256 relativeTime =
QgsInterval( layerReferenceTime.secsTo( dateTime ) );
265 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, QStringLiteral(
"INPUT" ), context );
267 if ( !meshLayer || !meshLayer->
isValid() )
275 outputCrs = meshLayer->
crs();
290 QVariant parameterTimeVariant = parameters.value( QStringLiteral(
"DATASET_TIME" ) );
291 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
293 switch ( meshElementType() )
296 mElementCount = mNativeMesh.faceCount();
299 mElementCount = mNativeMesh.vertexCount();
302 mElementCount = mNativeMesh.edgeCount();
306 for (
int i = 0; i < datasetGroups.count(); ++i )
308 int groupIndex = datasetGroups.at( i );
313 if ( supportedDataType().contains( dataGroup.metadata.dataType() ) )
315 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, mElementCount );
316 mDataPerGroup.append( dataGroup );
319 feedback->
setProgress( 100 * i / datasetGroups.count() );
322 mExportVectorOption = parameterAsInt( parameters, QStringLiteral(
"VECTOR_OPTION" ), context );
332 return QVariantMap();
334 feedback->
setProgressText( QObject::tr(
"Creating output vector layer" ) );
337 QList<QgsMeshDatasetGroupMetadata> metaList;
338 metaList.reserve( mDataPerGroup.size() );
339 for (
const DataGroup &dataGroup : std::as_const( mDataPerGroup ) )
340 metaList.append( dataGroup.metadata );
341 QgsFields fields = createFields( metaList, mExportVectorOption );
345 std::unique_ptr<QgsFeatureSink> sink( parameterAsSink( parameters, QStringLiteral(
"OUTPUT" ), context, identifier, fields, sinkGeometryType(), outputCrs ) );
347 return QVariantMap();
352 return QVariantMap();
354 feedback->
setProgressText( QObject::tr(
"Creating points for each vertices" ) );
357 for (
int i = 0; i < mElementCount; ++i )
360 for (
const DataGroup &dataGroup : std::as_const( mDataPerGroup ) )
363 addAttributes( value, attributes, dataGroup.metadata.isVector(), mExportVectorOption );
374 geom = meshElement( i );
376 feedback->
reportError( QObject::tr(
"Could not transform point to destination CRS" ) );
387 return QVariantMap();
395 ret[QStringLiteral(
"OUTPUT" )] = identifier;
400QString QgsExportMeshFacesAlgorithm::shortHelpString()
const
402 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." );
405QString QgsExportMeshFacesAlgorithm::shortDescription()
const
407 return QObject::tr(
"Exports mesh faces to a polygon vector layer." );
410QString QgsExportMeshFacesAlgorithm::name()
const
412 return QStringLiteral(
"exportmeshfaces" );
415QString QgsExportMeshFacesAlgorithm::displayName()
const
417 return QObject::tr(
"Export mesh faces" );
422 return new QgsExportMeshFacesAlgorithm();
425QgsGeometry QgsExportMeshFacesAlgorithm::meshElement(
int index )
const
427 const QgsMeshFace &face = mNativeMesh.face( index );
428 QVector<QgsPoint> vertices( face.size() );
429 for (
int i = 0; i < face.size(); ++i )
430 vertices[i] = mNativeMesh.vertex( face.at( i ) );
431 auto polygon = std::make_unique<QgsPolygon>();
436QString QgsExportMeshEdgesAlgorithm::shortHelpString()
const
438 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." );
441QString QgsExportMeshEdgesAlgorithm::shortDescription()
const
443 return QObject::tr(
"Exports mesh edges to a line vector layer." );
446QString QgsExportMeshEdgesAlgorithm::name()
const
448 return QStringLiteral(
"exportmeshedges" );
451QString QgsExportMeshEdgesAlgorithm::displayName()
const
453 return QObject::tr(
"Export mesh edges" );
458 return new QgsExportMeshEdgesAlgorithm();
461QgsGeometry QgsExportMeshEdgesAlgorithm::meshElement(
int index )
const
463 const QgsMeshEdge &edge = mNativeMesh.edge( index );
464 QVector<QgsPoint> vertices( 2 );
465 vertices[0] = mNativeMesh.vertex( edge.first );
466 vertices[1] = mNativeMesh.vertex( edge.second );
471QString QgsExportMeshOnGridAlgorithm::name()
const {
return QStringLiteral(
"exportmeshongrid" ); }
473QString QgsExportMeshOnGridAlgorithm::displayName()
const {
return QObject::tr(
"Export mesh on grid" ); }
475QString QgsExportMeshOnGridAlgorithm::group()
const {
return QObject::tr(
"Mesh" ); }
477QString QgsExportMeshOnGridAlgorithm::groupId()
const {
return QStringLiteral(
"mesh" ); }
479QString QgsExportMeshOnGridAlgorithm::shortHelpString()
const
481 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"
482 "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"
483 "1D meshes are not supported." );
486QString QgsExportMeshOnGridAlgorithm::shortDescription()
const
488 return QObject::tr(
"Exports mesh dataset values to a gridded point vector layer." );
493 return new QgsExportMeshOnGridAlgorithm();
496void QgsExportMeshOnGridAlgorithm::initAlgorithm(
const QVariantMap &configuration )
498 Q_UNUSED( configuration );
503 QStringLiteral(
"DATASET_GROUPS" ),
504 QObject::tr(
"Dataset groups" ),
505 QStringLiteral(
"INPUT" ),
510 QStringLiteral(
"DATASET_TIME" ),
511 QObject::tr(
"Dataset time" ),
512 QStringLiteral(
"INPUT" ),
513 QStringLiteral(
"DATASET_GROUPS" )
518 addParameter(
new QgsProcessingParameterDistance( QStringLiteral(
"GRID_SPACING" ), QObject::tr(
"Grid spacing" ), 10, QStringLiteral(
"INPUT" ),
false ) );
520 addParameter(
new QgsProcessingParameterCrs( QStringLiteral(
"CRS_OUTPUT" ), QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
522 QStringList exportVectorOptions;
523 exportVectorOptions << QObject::tr(
"Cartesian (x,y)" )
524 << QObject::tr(
"Polar (magnitude,degree)" )
525 << QObject::tr(
"Cartesian and Polar" );
526 addParameter(
new QgsProcessingParameterEnum( QStringLiteral(
"VECTOR_OPTION" ), QObject::tr(
"Export vector option" ), exportVectorOptions,
false, 0 ) );
530static void extractDatasetValues(
const QList<int> &datasetGroups,
QgsMeshLayer *meshLayer,
const QgsMesh &nativeMesh,
const QgsInterval &relativeTime,
const QSet<int> supportedDataType, QList<DataGroup> &datasetPerGroup,
QgsProcessingFeedback *feedback )
532 for (
int i = 0; i < datasetGroups.count(); ++i )
534 int groupIndex = datasetGroups.at( i );
539 if ( supportedDataType.contains( dataGroup.metadata.dataType() ) )
542 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, valueCount );
546 dataGroup.dataset3dStakedValue = meshLayer->
dataset3dValues( datasetIndex, 0, valueCount );
548 datasetPerGroup.append( dataGroup );
551 feedback->
setProgress( 100 * i / datasetGroups.count() );
557 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, QStringLiteral(
"INPUT" ), context );
559 if ( !meshLayer || !meshLayer->
isValid() )
564 outputCrs = meshLayer->
crs();
579 QVariant parameterTimeVariant = parameters.value( QStringLiteral(
"DATASET_TIME" ) );
580 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
582 extractDatasetValues( datasetGroups, meshLayer, nativeMesh, relativeTime, supportedDataType(), mDataPerGroup, feedback );
583 mTriangularMesh.update( meshLayer->
nativeMesh(), mTransform );
585 mExportVectorOption = parameterAsInt( parameters, QStringLiteral(
"VECTOR_OPTION" ), context );
595 return QVariantMap();
597 feedback->
setProgressText( QObject::tr(
"Creating output vector layer" ) );
602 for ( DataGroup &dataGroup : mDataPerGroup )
604 if ( dataGroup.dataset3dStakedValue.isValid() )
605 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
608 QList<QgsMeshDatasetGroupMetadata> metaList;
609 metaList.reserve( mDataPerGroup.size() );
610 for (
const DataGroup &dataGroup : std::as_const( mDataPerGroup ) )
611 metaList.append( dataGroup.metadata );
612 QgsFields fields = createFields( metaList, mExportVectorOption );
617 std::unique_ptr<QgsFeatureSink> sink( parameterAsSink( parameters, QStringLiteral(
"OUTPUT" ), context, identifier, fields,
Qgis::WkbType::Point, outputCrs ) );
619 return QVariantMap();
624 return QVariantMap();
630 const double gridSpacing = parameterAsDouble( parameters, QStringLiteral(
"GRID_SPACING" ), context );
636 QgsRectangle extent = parameterAsExtent( parameters, QStringLiteral(
"EXTENT" ), context );
638 extent = mTriangularMesh.extent();
639 int pointXCount = int( extent.
width() / gridSpacing ) + 1;
640 int pointYCount = int( extent.
height() / gridSpacing ) + 1;
642 for (
int ix = 0; ix < pointXCount; ++ix )
644 for (
int iy = 0; iy < pointYCount; ++iy )
647 int triangularFaceIndex = mTriangularMesh.faceIndexForPoint_v2( point );
648 if ( triangularFaceIndex >= 0 )
652 int nativeFaceIndex = mTriangularMesh.trianglesToNativeFaces().at( triangularFaceIndex );
653 for (
int i = 0; i < mDataPerGroup.count(); ++i )
655 const DataGroup &dataGroup = mDataPerGroup.at( i );
656 bool faceActive = dataGroup.activeFaces.active( nativeFaceIndex );
664 dataGroup.activeFaces,
665 dataGroup.datasetValues,
669 if ( dataGroup.metadata.isVector() )
671 QVector<double> vector = vectorValue( dataGroup.datasetValues.value( i ), mExportVectorOption );
672 for (
double v : vector )
674 attributes.append( v );
678 attributes.append( value.
scalar() );
689 feedback->
reportError( QObject::tr(
"Could not transform point to destination CRS" ) );
705 ret[QStringLiteral(
"OUTPUT" )] = identifier;
710QSet<int> QgsExportMeshOnGridAlgorithm::supportedDataType()
719QString QgsMeshRasterizeAlgorithm::name()
const
721 return QStringLiteral(
"meshrasterize" );
724QString QgsMeshRasterizeAlgorithm::displayName()
const
726 return QObject::tr(
"Rasterize mesh dataset" );
729QString QgsMeshRasterizeAlgorithm::group()
const
731 return QObject::tr(
"Mesh" );
734QString QgsMeshRasterizeAlgorithm::groupId()
const
736 return QStringLiteral(
"mesh" );
739QString QgsMeshRasterizeAlgorithm::shortHelpString()
const
741 return QObject::tr(
"This algorithm creates a raster layer from a mesh dataset.\n"
742 "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"
743 "1D meshes are not supported." );
746QString QgsMeshRasterizeAlgorithm::shortDescription()
const
748 return QObject::tr(
"Creates a raster layer from a mesh dataset." );
753 return new QgsMeshRasterizeAlgorithm();
756void QgsMeshRasterizeAlgorithm::initAlgorithm(
const QVariantMap &configuration )
758 Q_UNUSED( configuration );
763 QStringLiteral(
"DATASET_GROUPS" ),
764 QObject::tr(
"Dataset groups" ),
765 QStringLiteral(
"INPUT" ),
771 QStringLiteral(
"DATASET_TIME" ),
772 QObject::tr(
"Dataset time" ),
773 QStringLiteral(
"INPUT" ),
774 QStringLiteral(
"DATASET_GROUPS" )
778 addParameter(
new QgsProcessingParameterDistance( QStringLiteral(
"PIXEL_SIZE" ), QObject::tr(
"Pixel size" ), 1, QStringLiteral(
"INPUT" ),
false ) );
779 addParameter(
new QgsProcessingParameterCrs( QStringLiteral(
"CRS_OUTPUT" ), QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
783 auto createOptsParam = std::make_unique<QgsProcessingParameterString>( QStringLiteral(
"CREATE_OPTIONS" ), QObject::tr(
"Creation options" ), QVariant(),
false,
true );
784 createOptsParam->setMetadata( QVariantMap( { { QStringLiteral(
"widget_wrapper" ), QVariantMap( { { QStringLiteral(
"widget_type" ), QStringLiteral(
"rasteroptions" ) } } ) } } ) );
786 addParameter( createOptsParam.release() );
788 auto creationOptsParam = std::make_unique<QgsProcessingParameterString>( QStringLiteral(
"CREATION_OPTIONS" ), QObject::tr(
"Creation options" ), QVariant(),
false,
true );
789 creationOptsParam->setMetadata( QVariantMap( { { QStringLiteral(
"widget_wrapper" ), QVariantMap( { { QStringLiteral(
"widget_type" ), QStringLiteral(
"rasteroptions" ) } } ) } } ) );
791 addParameter( creationOptsParam.release() );
798 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, QStringLiteral(
"INPUT" ), context );
800 if ( !meshLayer || !meshLayer->
isValid() )
805 outputCrs = meshLayer->
crs();
810 mTriangularMesh.update( meshLayer->
nativeMesh(), mTransform );
820 QVariant parameterTimeVariant = parameters.value( QStringLiteral(
"DATASET_TIME" ) );
821 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
823 extractDatasetValues( datasetGroups, meshLayer, *meshLayer->
nativeMesh(), relativeTime, supportedDataType(), mDataPerGroup, feedback );
835 return QVariantMap();
842 for ( DataGroup &dataGroup : mDataPerGroup )
844 if ( dataGroup.dataset3dStakedValue.isValid() )
845 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
849 const double pixelSize = parameterAsDouble( parameters, QStringLiteral(
"PIXEL_SIZE" ), context );
855 QgsRectangle extent = parameterAsExtent( parameters, QStringLiteral(
"EXTENT" ), context );
857 extent = mTriangularMesh.extent();
859 int width = extent.
width() / pixelSize;
860 int height = extent.
height() / pixelSize;
862 QString creationOptions = parameterAsString( parameters, QStringLiteral(
"CREATION_OPTIONS" ), context ).trimmed();
864 const QString optionsString = parameterAsString( parameters, QStringLiteral(
"CREATE_OPTIONS" ), context );
865 if ( !optionsString.isEmpty() )
866 creationOptions = optionsString;
868 const QString fileName = parameterAsOutputLayer( parameters, QStringLiteral(
"OUTPUT" ), context );
869 const QFileInfo fileInfo( fileName );
872 rasterFileWriter.setOutputProviderKey( QStringLiteral(
"gdal" ) );
873 if ( !creationOptions.isEmpty() )
875 rasterFileWriter.setCreationOptions( creationOptions.split(
'|' ) );
877 rasterFileWriter.setOutputFormat( outputFormat );
879 std::unique_ptr<QgsRasterDataProvider> rasterDataProvider(
880 rasterFileWriter.createMultiBandRaster(
Qgis::DataType::Float64, width, height, extent, mTransform.destinationCrs(), mDataPerGroup.count() )
882 rasterDataProvider->setEditable(
true );
884 for (
int i = 0; i < mDataPerGroup.count(); ++i )
886 const DataGroup &dataGroup = mDataPerGroup.at( i );
891 if ( dataGroup.datasetValues.isValid() )
895 dataGroup.datasetValues,
896 dataGroup.activeFaces,
897 dataGroup.metadata.dataType(),
904 if ( !rasterDataProvider->writeBlock( block.get(), i + 1 ) )
906 throw QgsProcessingException( QObject::tr(
"Could not write raster block: %1" ).arg( rasterDataProvider->error().summary() ) );
908 rasterDataProvider->setNoDataValue( i + 1, block->noDataValue() );
911 rasterDataProvider->setNoDataValue( i + 1, std::numeric_limits<double>::quiet_NaN() );
916 return QVariantMap();
917 feedback->
setProgress( 100 * i / mDataPerGroup.count() );
921 rasterDataProvider->setEditable(
false );
927 ret[QStringLiteral(
"OUTPUT" )] = fileName;
932QSet<int> QgsMeshRasterizeAlgorithm::supportedDataType()
941QString QgsMeshContoursAlgorithm::name()
const
943 return QStringLiteral(
"meshcontours" );
946QString QgsMeshContoursAlgorithm::displayName()
const
948 return QObject::tr(
"Export contours" );
951QString QgsMeshContoursAlgorithm::group()
const
953 return QObject::tr(
"Mesh" );
956QString QgsMeshContoursAlgorithm::groupId()
const
958 return QStringLiteral(
"mesh" );
961QString QgsMeshContoursAlgorithm::shortHelpString()
const
963 return QObject::tr(
"This algorithm creates contours as a vector layer from a mesh scalar dataset." );
966QString QgsMeshContoursAlgorithm::shortDescription()
const
968 return QObject::tr(
"Creates contours as vector layer from mesh scalar dataset." );
973 return new QgsMeshContoursAlgorithm();
976void QgsMeshContoursAlgorithm::initAlgorithm(
const QVariantMap &configuration )
978 Q_UNUSED( configuration );
983 QStringLiteral(
"DATASET_GROUPS" ),
984 QObject::tr(
"Dataset groups" ),
985 QStringLiteral(
"INPUT" ),
990 QStringLiteral(
"DATASET_TIME" ),
991 QObject::tr(
"Dataset time" ),
992 QStringLiteral(
"INPUT" ),
993 QStringLiteral(
"DATASET_GROUPS" )
1007 auto contourLevelList = std::make_unique<QgsProcessingParameterString>(
1008 QStringLiteral(
"CONTOUR_LEVEL_LIST" ), QObject::tr(
"List of contours level" ), QVariant(),
false,
true
1010 contourLevelList->setHelp( QObject::tr(
"Comma separated list of values to export. If filled, the increment, minimum and maximum settings are ignored." ) );
1011 addParameter( contourLevelList.release() );
1013 addParameter(
new QgsProcessingParameterCrs( QStringLiteral(
"CRS_OUTPUT" ), QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
1022 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, QStringLiteral(
"INPUT" ), context );
1024 if ( !meshLayer || !meshLayer->
isValid() )
1029 outputCrs = meshLayer->
crs();
1034 mTriangularMesh.update( meshLayer->
nativeMesh(), mTransform );
1040 QString levelsString = parameterAsString( parameters, QStringLiteral(
"CONTOUR_LEVEL_LIST" ), context );
1041 if ( !levelsString.isEmpty() )
1043 QStringList levelStringList = levelsString.split(
',' );
1044 if ( !levelStringList.isEmpty() )
1046 for (
const QString &stringVal : levelStringList )
1049 double val = stringVal.toDouble( &ok );
1051 mLevels.append( val );
1053 throw QgsProcessingException( QObject::tr(
"Invalid format for level values, must be numbers separated with comma" ) );
1055 if ( mLevels.count() >= 2 )
1056 if ( mLevels.last() <= mLevels.at( mLevels.count() - 2 ) )
1057 throw QgsProcessingException( QObject::tr(
"Invalid format for level values, must be different numbers and in increasing order" ) );
1062 if ( mLevels.isEmpty() )
1064 double minimum = parameterAsDouble( parameters, QStringLiteral(
"MINIMUM" ), context );
1065 double maximum = parameterAsDouble( parameters, QStringLiteral(
"MAXIMUM" ), context );
1066 double interval = parameterAsDouble( parameters, QStringLiteral(
"INCREMENT" ), context );
1068 if ( interval <= 0 )
1071 if ( minimum >= maximum )
1072 throw QgsProcessingException( QObject::tr(
"Invalid minimum and maximum values, minimum must be lesser than maximum" ) );
1074 if ( interval > ( maximum - minimum ) )
1075 throw QgsProcessingException( QObject::tr(
"Invalid minimum, maximum and interval values, difference between minimum and maximum must be greater or equal than interval" ) );
1077 int intervalCount = ( maximum - minimum ) / interval;
1079 mLevels.reserve( intervalCount );
1080 for (
int i = 0; i < intervalCount; ++i )
1082 mLevels.append( minimum + i * interval );
1095 QVariant parameterTimeVariant = parameters.value( QStringLiteral(
"DATASET_TIME" ) );
1096 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
1100 extractDatasetValues( datasetGroups, meshLayer, mNativeMesh, relativeTime, supportedDataType(), mDataPerGroup, feedback );
1111 for ( DataGroup &dataGroup : mDataPerGroup )
1113 if ( dataGroup.dataset3dStakedValue.isValid() )
1114 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
1120 polygonFields.
append(
QgsField( QObject::tr(
"group" ), QMetaType::Type::QString ) );
1121 polygonFields.
append(
QgsField( QObject::tr(
"time" ), QMetaType::Type::QString ) );
1122 polygonFields.
append(
QgsField( QObject::tr(
"min_value" ), QMetaType::Type::Double ) );
1123 polygonFields.
append(
QgsField( QObject::tr(
"max_value" ), QMetaType::Type::Double ) );
1124 lineFields.
append(
QgsField( QObject::tr(
"group" ), QMetaType::Type::QString ) );
1125 lineFields.
append(
QgsField( QObject::tr(
"time" ), QMetaType::Type::QString ) );
1126 lineFields.
append(
QgsField( QObject::tr(
"value" ), QMetaType::Type::Double ) );
1130 QString lineIdentifier;
1131 QString polygonIdentifier;
1132 std::unique_ptr<QgsFeatureSink> sinkPolygons( parameterAsSink(
1134 QStringLiteral(
"OUTPUT_POLYGONS" ),
1141 std::unique_ptr<QgsFeatureSink> sinkLines( parameterAsSink(
1143 QStringLiteral(
"OUTPUT_LINES" ),
1151 if ( !sinkLines || !sinkPolygons )
1152 return QVariantMap();
1155 for (
int i = 0; i < mDataPerGroup.count(); ++i )
1157 DataGroup dataGroup = mDataPerGroup.at( i );
1159 int count = scalarDataOnVertices ? mNativeMesh.vertices.count() : mNativeMesh.faces.count();
1161 QVector<double> values;
1162 if ( dataGroup.datasetValues.isValid() )
1165 values = QgsMeshLayerUtils::calculateMagnitudes( dataGroup.datasetValues );
1169 values = QVector<double>( count, std::numeric_limits<double>::quiet_NaN() );
1172 if ( ( !scalarDataOnVertices ) )
1174 values = QgsMeshLayerUtils::interpolateFromFacesData(
1177 &dataGroup.activeFaces,
1182 QgsMeshContours contoursExported( mTriangularMesh, mNativeMesh, values, dataGroup.activeFaces );
1185 firstAttributes.append( dataGroup.metadata.name() );
1186 firstAttributes.append( mDateTimeString );
1188 for (
double level : std::as_const( mLevels ) )
1190 QgsGeometry line = contoursExported.exportLines( level, feedback );
1192 return QVariantMap();
1196 lineAttributes.append( level );
1203 throw QgsProcessingException( writeFeatureError( sinkLines.get(), parameters, QStringLiteral(
"OUTPUT_LINES" ) ) );
1206 for (
int l = 0; l < mLevels.count() - 1; ++l )
1208 QgsGeometry polygon = contoursExported.exportPolygons( mLevels.at( l ), mLevels.at( l + 1 ), feedback );
1210 return QVariantMap();
1215 polygonAttributes.append( mLevels.at( l ) );
1216 polygonAttributes.append( mLevels.at( l + 1 ) );
1221 sinkPolygons->addFeature( polygonFeature );
1226 feedback->
setProgress( 100 * i / mDataPerGroup.count() );
1231 sinkPolygons->finalize();
1233 sinkLines->finalize();
1236 ret[QStringLiteral(
"OUTPUT_LINES" )] = lineIdentifier;
1237 ret[QStringLiteral(
"OUTPUT_POLYGONS" )] = polygonIdentifier;
1242QString QgsMeshExportCrossSection::name()
const
1244 return QStringLiteral(
"meshexportcrosssection" );
1247QString QgsMeshExportCrossSection::displayName()
const
1249 return QObject::tr(
"Export cross section dataset values on lines from mesh" );
1252QString QgsMeshExportCrossSection::group()
const
1254 return QObject::tr(
"Mesh" );
1257QString QgsMeshExportCrossSection::groupId()
const
1259 return QStringLiteral(
"mesh" );
1262QString QgsMeshExportCrossSection::shortHelpString()
const
1264 return QObject::tr(
"This algorithm extracts mesh's dataset values from line contained in a vector layer.\n"
1265 "Each line is discretized with a resolution distance parameter for extraction of values on its vertices." );
1268QString QgsMeshExportCrossSection::shortDescription()
const
1270 return QObject::tr(
"Extracts a mesh dataset's values from lines contained in a vector layer." );
1275 return new QgsMeshExportCrossSection();
1278void QgsMeshExportCrossSection::initAlgorithm(
const QVariantMap &configuration )
1280 Q_UNUSED( configuration );
1285 QStringLiteral(
"DATASET_GROUPS" ),
1286 QObject::tr(
"Dataset groups" ),
1287 QStringLiteral(
"INPUT" ),
1292 QStringLiteral(
"DATASET_TIME" ),
1293 QObject::tr(
"Dataset time" ),
1294 QStringLiteral(
"INPUT" ),
1295 QStringLiteral(
"DATASET_GROUPS" )
1298 QList<int> datatype;
1301 QStringLiteral(
"INPUT_LINES" ), QObject::tr(
"Lines for data export" ), datatype, QVariant(),
false
1305 QStringLiteral(
"RESOLUTION" ), QObject::tr(
"Line segmentation resolution" ), 10.0, QStringLiteral(
"INPUT_LINES" ),
false, 0
1317 QStringLiteral(
"OUTPUT" ), QObject::tr(
"Exported data CSV file" ), QObject::tr(
"CSV file (*.csv)" )
1323 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, QStringLiteral(
"INPUT" ), context );
1325 if ( !meshLayer || !meshLayer->
isValid() )
1328 mMeshLayerCrs = meshLayer->
crs();
1329 mTriangularMesh.update( meshLayer->
nativeMesh() );
1338 QVariant parameterTimeVariant = parameters.value( QStringLiteral(
"DATASET_TIME" ) );
1339 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
1341 extractDatasetValues( datasetGroups, meshLayer, *meshLayer->
nativeMesh(), relativeTime, supportedDataType(), mDataPerGroup, feedback );
1354 for ( DataGroup &dataGroup : mDataPerGroup )
1356 if ( dataGroup.dataset3dStakedValue.isValid() )
1357 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
1359 double resolution = parameterAsDouble( parameters, QStringLiteral(
"RESOLUTION" ), context );
1360 int datasetDigits = parameterAsInt( parameters, QStringLiteral(
"DATASET_DIGITS" ), context );
1361 int coordDigits = parameterAsInt( parameters, QStringLiteral(
"COORDINATES_DIGITS" ), context );
1363 std::unique_ptr<QgsProcessingFeatureSource> featureSource( parameterAsSource( parameters, QStringLiteral(
"INPUT_LINES" ), context ) );
1364 if ( !featureSource )
1369 QString outputFileName = parameterAsFileOutput( parameters, QStringLiteral(
"OUTPUT" ), context );
1370 QFile file( outputFileName );
1371 if ( !file.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
1374 QTextStream textStream( &file );
1375#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
1376 textStream.setCodec(
"UTF-8" );
1379 header << QStringLiteral(
"fid" ) << QStringLiteral(
"x" ) << QStringLiteral(
"y" ) << QObject::tr(
"offset" );
1380 for (
const DataGroup &datagroup : std::as_const( mDataPerGroup ) )
1381 header << datagroup.metadata.name();
1382 textStream << header.join(
',' ) << QStringLiteral(
"\n" );
1384 long long featCount = featureSource->featureCount();
1385 long long featCounter = 0;
1399 feedback->
reportError( QObject::tr(
"Could not transform line to mesh CRS" ) );
1405 while ( offset <= line.
length() )
1408 return QVariantMap();
1410 QStringList textLine;
1412 int triangularFaceIndex = mTriangularMesh.faceIndexForPoint_v2( point );
1413 textLine << QString::number( fid ) << QString::number( point.
x(),
'f', coordDigits ) << QString::number( point.
y(),
'f', coordDigits ) << QString::number( offset,
'f', coordDigits );
1414 if ( triangularFaceIndex >= 0 )
1418 int nativeFaceIndex = mTriangularMesh.trianglesToNativeFaces().at( triangularFaceIndex );
1419 for (
int i = 0; i < mDataPerGroup.count(); ++i )
1421 const DataGroup &dataGroup = mDataPerGroup.at( i );
1422 bool faceActive = dataGroup.activeFaces.active( nativeFaceIndex );
1428 triangularFaceIndex,
1430 dataGroup.activeFaces,
1431 dataGroup.datasetValues,
1435 if ( abs( value.
x() ) == std::numeric_limits<double>::quiet_NaN() )
1436 textLine << QString(
' ' );
1438 textLine << QString::number( value.
scalar(),
'f', datasetDigits );
1442 for (
int i = 0; i < mDataPerGroup.count(); ++i )
1443 textLine << QString(
' ' );
1445 textStream << textLine.join(
',' ) << QStringLiteral(
"\n" );
1447 offset += resolution;
1452 feedback->
setProgress( 100.0 * featCounter / featCount );
1454 return QVariantMap();
1461 ret[QStringLiteral(
"OUTPUT" )] = outputFileName;
1465QString QgsMeshExportTimeSeries::name()
const
1467 return QStringLiteral(
"meshexporttimeseries" );
1470QString QgsMeshExportTimeSeries::displayName()
const
1472 return QObject::tr(
"Export time series values from points of a mesh dataset" );
1475QString QgsMeshExportTimeSeries::group()
const
1477 return QObject::tr(
"Mesh" );
1480QString QgsMeshExportTimeSeries::groupId()
const
1482 return QStringLiteral(
"mesh" );
1485QString QgsMeshExportTimeSeries::shortHelpString()
const
1487 return QObject::tr(
"This algorithm extracts mesh's dataset time series values from points contained in a vector layer.\n"
1488 "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." );
1491QString QgsMeshExportTimeSeries::shortDescription()
const
1493 return QObject::tr(
"Extracts a mesh dataset's time series values from points contained in a vector layer." );
1498 return new QgsMeshExportTimeSeries();
1501void QgsMeshExportTimeSeries::initAlgorithm(
const QVariantMap &configuration )
1503 Q_UNUSED( configuration );
1508 QStringLiteral(
"DATASET_GROUPS" ),
1509 QObject::tr(
"Dataset groups" ),
1510 QStringLiteral(
"INPUT" ),
1515 QStringLiteral(
"STARTING_TIME" ),
1516 QObject::tr(
"Starting time" ),
1517 QStringLiteral(
"INPUT" ),
1518 QStringLiteral(
"DATASET_GROUPS" )
1522 QStringLiteral(
"FINISHING_TIME" ),
1523 QObject::tr(
"Finishing time" ),
1524 QStringLiteral(
"INPUT" ),
1525 QStringLiteral(
"DATASET_GROUPS" )
1532 QList<int> datatype;
1535 QStringLiteral(
"INPUT_POINTS" ), QObject::tr(
"Points for data export" ), datatype, QVariant(),
false
1547 QStringLiteral(
"OUTPUT" ), QObject::tr(
"Exported data CSV file" ), QObject::tr(
"CSV file (*.csv)" )
1553 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, QStringLiteral(
"INPUT" ), context );
1555 if ( !meshLayer || !meshLayer->
isValid() )
1558 mMeshLayerCrs = meshLayer->
crs();
1559 mTriangularMesh.update( meshLayer->
nativeMesh() );
1569 QVariant parameterStartTimeVariant = parameters.value( QStringLiteral(
"STARTING_TIME" ) );
1570 QgsInterval relativeStartTime = datasetRelativetime( parameterStartTimeVariant, meshLayer, context );
1572 QVariant parameterEndTimeVariant = parameters.value( QStringLiteral(
"FINISHING_TIME" ) );
1573 QgsInterval relativeEndTime = datasetRelativetime( parameterEndTimeVariant, meshLayer, context );
1576 qint64 timeStepInterval = parameterAsDouble( parameters, QStringLiteral(
"TIME_STEP" ), context ) * 1000 * 3600;
1577 if ( timeStepInterval == 0 )
1580 for (
int groupIndex : datasetGroups )
1594 mRelativeTimeSteps.clear();
1595 mTimeStepString.clear();
1596 if ( timeStepInterval != 0 )
1598 mRelativeTimeSteps.append( relativeStartTime.
seconds() * 1000 );
1599 while ( mRelativeTimeSteps.last() < relativeEndTime.
seconds() * 1000 )
1600 mRelativeTimeSteps.append( mRelativeTimeSteps.last() + timeStepInterval );
1602 for ( qint64 relativeTimeStep : std::as_const( mRelativeTimeSteps ) )
1604 mTimeStepString.append( meshLayer->
formatTime( relativeTimeStep / 3600.0 / 1000.0 ) );
1609 for (
int i = 0; i < datasetGroups.count(); ++i )
1611 int groupIndex = datasetGroups.at( i );
1613 if ( supportedDataType().contains( meta.
dataType() ) )
1615 mGroupIndexes.append( groupIndex );
1616 mGroupsMetadata[groupIndex] = meta;
1619 if ( !mRelativeTimeSteps.isEmpty() )
1623 for ( qint64 relativeTimeStep : std::as_const( mRelativeTimeSteps ) )
1625 QMap<int, int> &groupIndexToData = mRelativeTimeToData[relativeTimeStep];
1626 QgsInterval timeStepInterval( relativeTimeStep / 1000.0 );
1628 if ( !datasetIndex.
isValid() )
1630 if ( datasetIndex != lastDatasetIndex )
1632 DataGroup dataGroup;
1633 dataGroup.metadata = meta;
1634 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, valueCount );
1638 dataGroup.dataset3dStakedValue = meshLayer->
dataset3dValues( datasetIndex, 0, valueCount );
1640 mDatasets.append( dataGroup );
1641 lastDatasetIndex = datasetIndex;
1643 groupIndexToData[groupIndex] = mDatasets.count() - 1;
1649 QMap<int, int> &groupIndexToData = mRelativeTimeToData[0];
1651 DataGroup dataGroup;
1652 dataGroup.metadata = meta;
1653 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, valueCount );
1657 dataGroup.dataset3dStakedValue = meshLayer->
dataset3dValues( datasetIndex, 0, valueCount );
1659 mDatasets.append( dataGroup );
1660 groupIndexToData[groupIndex] = mDatasets.
count() - 1;
1665 feedback->
setProgress( 100 * i / datasetGroups.count() );
1681 for ( DataGroup &dataGroup : mDatasets )
1683 if ( dataGroup.dataset3dStakedValue.isValid() )
1684 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
1687 int datasetDigits = parameterAsInt( parameters, QStringLiteral(
"DATASET_DIGITS" ), context );
1688 int coordDigits = parameterAsInt( parameters, QStringLiteral(
"COORDINATES_DIGITS" ), context );
1690 std::unique_ptr<QgsProcessingFeatureSource> featureSource( parameterAsSource( parameters, QStringLiteral(
"INPUT_POINTS" ), context ) );
1691 if ( !featureSource )
1696 QString outputFileName = parameterAsFileOutput( parameters, QStringLiteral(
"OUTPUT" ), context );
1697 QFile file( outputFileName );
1698 if ( !file.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
1701 QTextStream textStream( &file );
1702#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
1703 textStream.setCodec(
"UTF-8" );
1706 header << QStringLiteral(
"fid" ) << QStringLiteral(
"x" ) << QStringLiteral(
"y" ) << QObject::tr(
"time" );
1708 for (
int gi : std::as_const( mGroupIndexes ) )
1709 header << mGroupsMetadata.value( gi ).name();
1711 textStream << header.join(
',' ) << QStringLiteral(
"\n" );
1713 long long featCount = featureSource->featureCount();
1714 long long featCounter = 0;
1728 feedback->
reportError( QObject::tr(
"Could not transform line to mesh CRS" ) );
1735 int triangularFaceIndex = mTriangularMesh.faceIndexForPoint_v2( point );
1737 if ( triangularFaceIndex >= 0 )
1739 int nativeFaceIndex = mTriangularMesh.trianglesToNativeFaces().at( triangularFaceIndex );
1740 if ( !mRelativeTimeSteps.isEmpty() )
1742 for (
int timeIndex = 0; timeIndex < mRelativeTimeSteps.count(); ++timeIndex )
1744 qint64 timeStep = mRelativeTimeSteps.at( timeIndex );
1745 QStringList textLine;
1746 textLine << QString::number( fid )
1747 << QString::number( point.
x(),
'f', coordDigits )
1748 << QString::number( point.
y(),
'f', coordDigits )
1749 << mTimeStepString.at( timeIndex );
1751 if ( mRelativeTimeToData.contains( timeStep ) )
1753 const QMap<int, int> &groupToData = mRelativeTimeToData.value( timeStep );
1754 for (
int groupIndex : std::as_const( mGroupIndexes ) )
1756 if ( !groupToData.contains( groupIndex ) )
1758 int dataIndex = groupToData.value( groupIndex );
1759 if ( dataIndex < 0 || dataIndex > mDatasets.count() - 1 )
1762 const DataGroup &dataGroup = mDatasets.at( dataIndex );
1763 QgsMeshDatasetValue value = extractDatasetValue( point, nativeFaceIndex, triangularFaceIndex, mTriangularMesh, dataGroup.activeFaces, dataGroup.datasetValues, dataGroup.metadata );
1764 if ( abs( value.
x() ) == std::numeric_limits<double>::quiet_NaN() )
1765 textLine << QString(
' ' );
1767 textLine << QString::number( value.
scalar(),
'f', datasetDigits );
1770 textStream << textLine.join(
',' ) << QStringLiteral(
"\n" );
1775 QStringList textLine;
1776 textLine << QString::number( fid )
1777 << QString::number( point.
x(),
'f', coordDigits )
1778 << QString::number( point.
y(),
'f', coordDigits )
1779 << QObject::tr(
"static dataset" );
1780 const QMap<int, int> &groupToData = mRelativeTimeToData.value( 0 );
1781 for (
int groupIndex : std::as_const( mGroupIndexes ) )
1783 if ( !groupToData.contains( groupIndex ) )
1785 int dataIndex = groupToData.value( groupIndex );
1786 if ( dataIndex < 0 || dataIndex > mDatasets.count() - 1 )
1788 const DataGroup &dataGroup = mDatasets.at( dataIndex );
1789 QgsMeshDatasetValue value = extractDatasetValue( point, nativeFaceIndex, triangularFaceIndex, mTriangularMesh, dataGroup.activeFaces, dataGroup.datasetValues, dataGroup.metadata );
1790 if ( abs( value.
x() ) == std::numeric_limits<double>::quiet_NaN() )
1791 textLine << QString(
' ' );
1793 textLine << QString::number( value.
scalar(),
'f', datasetDigits );
1795 textStream << textLine.join(
',' ) << QStringLiteral(
"\n" );
1801 feedback->
setProgress( 100.0 * featCounter / featCount );
1803 return QVariantMap();
1810 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.
@ 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.
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.
static QString driverForExtension(const QString &extension)
Returns the GDAL driver name for a specified file extension.
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.