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,
124 bool faceActive = activeFaces.
active( nativeFaceIndex );
136 value = datasetValues.
value( nativeFaceIndex );
143 const int v1 = face[0], v2 = face[1], v3 = face[2];
148 const double x = QgsMeshLayerUtils::interpolateFromVerticesData( p1, p2, p3, val1.
x(), val2.
x(), val3.
x(), point );
149 double y = std::numeric_limits<double>::quiet_NaN();
150 bool isVector = metadata.
isVector();
152 y = QgsMeshLayerUtils::interpolateFromVerticesData( p1, p2, p3, val1.
y(), val2.
y(), val3.
y(), point );
163QString QgsExportMeshOnElement::group()
const
165 return QObject::tr(
"Mesh" );
168QString QgsExportMeshOnElement::groupId()
const
170 return QStringLiteral(
"mesh" );
173QString QgsExportMeshVerticesAlgorithm::shortHelpString()
const
175 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." );
178QString QgsExportMeshVerticesAlgorithm::shortDescription()
const
180 return QObject::tr(
"Exports mesh vertices to a point vector layer" );
183QString QgsExportMeshVerticesAlgorithm::name()
const
185 return QStringLiteral(
"exportmeshvertices" );
188QString QgsExportMeshVerticesAlgorithm::displayName()
const
190 return QObject::tr(
"Export mesh vertices" );
195 return new QgsExportMeshVerticesAlgorithm();
198QgsGeometry QgsExportMeshVerticesAlgorithm::meshElement(
int index )
const
203void QgsExportMeshOnElement::initAlgorithm(
const QVariantMap &configuration )
205 Q_UNUSED( configuration );
211 QStringLiteral(
"DATASET_GROUPS" ),
212 QObject::tr(
"Dataset groups" ),
213 QStringLiteral(
"INPUT" ),
214 supportedDataType(),
true
218 QStringLiteral(
"DATASET_TIME" ),
219 QObject::tr(
"Dataset time" ),
220 QStringLiteral(
"INPUT" ),
221 QStringLiteral(
"DATASET_GROUPS" )
224 addParameter(
new QgsProcessingParameterCrs( QStringLiteral(
"CRS_OUTPUT" ), QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
226 QStringList exportVectorOptions;
227 exportVectorOptions << QObject::tr(
"Cartesian (x,y)" )
228 << QObject::tr(
"Polar (magnitude,degree)" )
229 << QObject::tr(
"Cartesian and Polar" );
230 addParameter(
new QgsProcessingParameterEnum( QStringLiteral(
"VECTOR_OPTION" ), QObject::tr(
"Export vector option" ), exportVectorOptions,
false, 0 ) );
240 if ( timeType == QLatin1String(
"dataset-time-step" ) )
245 else if ( timeType == QLatin1String(
"defined-date-time" ) )
248 if ( dateTime.isValid() )
249 relativeTime =
QgsInterval( layerReferenceTime.secsTo( dateTime ) );
251 else if ( timeType == QLatin1String(
"current-context-time" ) )
254 if ( dateTime.isValid() )
255 relativeTime =
QgsInterval( layerReferenceTime.secsTo( dateTime ) );
264 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, QStringLiteral(
"INPUT" ), context );
266 if ( !meshLayer || !meshLayer->
isValid() )
289 QVariant parameterTimeVariant = parameters.value( QStringLiteral(
"DATASET_TIME" ) );
290 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
292 switch ( meshElementType() )
295 mElementCount = mNativeMesh.faceCount();
298 mElementCount = mNativeMesh.vertexCount();
301 mElementCount = mNativeMesh.edgeCount();
305 for (
int i = 0; i < datasetGroups.count(); ++i )
307 int groupIndex = datasetGroups.at( i );
312 if ( supportedDataType().contains( dataGroup.metadata.dataType() ) )
314 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, mElementCount );
315 mDataPerGroup.append( dataGroup );
318 feedback->
setProgress( 100 * i / datasetGroups.count() );
321 mExportVectorOption = parameterAsInt( parameters, QStringLiteral(
"VECTOR_OPTION" ), context );
331 return QVariantMap();
333 feedback->
setProgressText( QObject::tr(
"Creating output vector layer" ) );
336 QList<QgsMeshDatasetGroupMetadata> metaList;
337 metaList.reserve( mDataPerGroup.size() );
338 for (
const DataGroup &dataGroup : std::as_const( mDataPerGroup ) )
339 metaList.append( dataGroup.metadata );
340 QgsFields fields = createFields( metaList, mExportVectorOption );
344 std::unique_ptr<QgsFeatureSink> sink( parameterAsSink( parameters, QStringLiteral(
"OUTPUT" ), context, identifier, fields, sinkGeometryType(),
outputCrs ) );
346 return QVariantMap();
351 return QVariantMap();
353 feedback->
setProgressText( QObject::tr(
"Creating points for each vertices" ) );
356 for (
int i = 0; i < mElementCount; ++i )
359 for (
const DataGroup &dataGroup : std::as_const( mDataPerGroup ) )
362 addAttributes( value, attributes, dataGroup.metadata.isVector(), mExportVectorOption );
373 geom = meshElement( i );
375 feedback->
reportError( QObject::tr(
"Could not transform point to destination CRS" ) );
386 return QVariantMap();
394 ret[QStringLiteral(
"OUTPUT" )] = identifier;
399QString QgsExportMeshFacesAlgorithm::shortHelpString()
const
401 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." );
404QString QgsExportMeshFacesAlgorithm::shortDescription()
const
406 return QObject::tr(
"Exports mesh faces to a polygon vector layer" );
409QString QgsExportMeshFacesAlgorithm::name()
const
411 return QStringLiteral(
"exportmeshfaces" );
414QString QgsExportMeshFacesAlgorithm::displayName()
const
416 return QObject::tr(
"Export mesh faces" );
421 return new QgsExportMeshFacesAlgorithm();
424QgsGeometry QgsExportMeshFacesAlgorithm::meshElement(
int index )
const
426 const QgsMeshFace &face = mNativeMesh.face( index );
427 QVector<QgsPoint> vertices( face.size() );
428 for (
int i = 0; i < face.size(); ++i )
429 vertices[i] = mNativeMesh.vertex( face.at( i ) );
430 auto polygon = std::make_unique<QgsPolygon>();
435QString QgsExportMeshEdgesAlgorithm::shortHelpString()
const
437 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." );
440QString QgsExportMeshEdgesAlgorithm::shortDescription()
const
442 return QObject::tr(
"Exports mesh edges to a line vector layer" );
445QString QgsExportMeshEdgesAlgorithm::name()
const
447 return QStringLiteral(
"exportmeshedges" );
450QString QgsExportMeshEdgesAlgorithm::displayName()
const
452 return QObject::tr(
"Export mesh edges" );
457 return new QgsExportMeshEdgesAlgorithm();
460QgsGeometry QgsExportMeshEdgesAlgorithm::meshElement(
int index )
const
462 const QgsMeshEdge &edge = mNativeMesh.edge( index );
463 QVector<QgsPoint> vertices( 2 );
464 vertices[0] = mNativeMesh.vertex( edge.first );
465 vertices[1] = mNativeMesh.vertex( edge.second );
470QString QgsExportMeshOnGridAlgorithm::name()
const {
return QStringLiteral(
"exportmeshongrid" ); }
472QString QgsExportMeshOnGridAlgorithm::displayName()
const {
return QObject::tr(
"Export mesh on grid" ); }
474QString QgsExportMeshOnGridAlgorithm::group()
const {
return QObject::tr(
"Mesh" ); }
476QString QgsExportMeshOnGridAlgorithm::groupId()
const {
return QStringLiteral(
"mesh" ); }
478QString QgsExportMeshOnGridAlgorithm::shortHelpString()
const
480 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"
481 "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"
482 "1D meshes are not supported." );
485QString QgsExportMeshOnGridAlgorithm::shortDescription()
const
487 return QObject::tr(
"Exports mesh dataset values to a gridded point vector layer" );
492 return new QgsExportMeshOnGridAlgorithm();
495void QgsExportMeshOnGridAlgorithm::initAlgorithm(
const QVariantMap &configuration )
497 Q_UNUSED( configuration );
502 QStringLiteral(
"DATASET_GROUPS" ),
503 QObject::tr(
"Dataset groups" ),
504 QStringLiteral(
"INPUT" ),
509 QStringLiteral(
"DATASET_TIME" ),
510 QObject::tr(
"Dataset time" ),
511 QStringLiteral(
"INPUT" ),
512 QStringLiteral(
"DATASET_GROUPS" )
517 addParameter(
new QgsProcessingParameterDistance( QStringLiteral(
"GRID_SPACING" ), QObject::tr(
"Grid spacing" ), 10, QStringLiteral(
"INPUT" ),
false ) );
519 addParameter(
new QgsProcessingParameterCrs( QStringLiteral(
"CRS_OUTPUT" ), QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
521 QStringList exportVectorOptions;
522 exportVectorOptions << QObject::tr(
"Cartesian (x,y)" )
523 << QObject::tr(
"Polar (magnitude,degree)" )
524 << QObject::tr(
"Cartesian and Polar" );
525 addParameter(
new QgsProcessingParameterEnum( QStringLiteral(
"VECTOR_OPTION" ), QObject::tr(
"Export vector option" ), exportVectorOptions,
false, 0 ) );
529static void extractDatasetValues(
const QList<int> &datasetGroups,
QgsMeshLayer *meshLayer,
const QgsMesh &nativeMesh,
const QgsInterval &relativeTime,
const QSet<int> supportedDataType, QList<DataGroup> &datasetPerGroup,
QgsProcessingFeedback *feedback )
531 for (
int i = 0; i < datasetGroups.count(); ++i )
533 int groupIndex = datasetGroups.at( i );
538 if ( supportedDataType.contains( dataGroup.metadata.dataType() ) )
541 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, valueCount );
545 dataGroup.dataset3dStakedValue = meshLayer->
dataset3dValues( datasetIndex, 0, valueCount );
547 datasetPerGroup.append( dataGroup );
550 feedback->
setProgress( 100 * i / datasetGroups.count() );
556 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, QStringLiteral(
"INPUT" ), context );
558 if ( !meshLayer || !meshLayer->
isValid() )
578 QVariant parameterTimeVariant = parameters.value( QStringLiteral(
"DATASET_TIME" ) );
579 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
581 extractDatasetValues( datasetGroups, meshLayer, nativeMesh, relativeTime, supportedDataType(), mDataPerGroup, feedback );
582 mTriangularMesh.update( meshLayer->
nativeMesh(), mTransform );
584 mExportVectorOption = parameterAsInt( parameters, QStringLiteral(
"VECTOR_OPTION" ), context );
594 return QVariantMap();
596 feedback->
setProgressText( QObject::tr(
"Creating output vector layer" ) );
601 for ( DataGroup &dataGroup : mDataPerGroup )
603 if ( dataGroup.dataset3dStakedValue.isValid() )
604 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
607 QList<QgsMeshDatasetGroupMetadata> metaList;
608 metaList.reserve( mDataPerGroup.size() );
609 for (
const DataGroup &dataGroup : std::as_const( mDataPerGroup ) )
610 metaList.append( dataGroup.metadata );
611 QgsFields fields = createFields( metaList, mExportVectorOption );
616 std::unique_ptr<QgsFeatureSink> sink( parameterAsSink( parameters, QStringLiteral(
"OUTPUT" ), context, identifier, fields,
Qgis::WkbType::Point,
outputCrs ) );
618 return QVariantMap();
623 return QVariantMap();
629 const double gridSpacing = parameterAsDouble( parameters, QStringLiteral(
"GRID_SPACING" ), context );
635 QgsRectangle extent = parameterAsExtent( parameters, QStringLiteral(
"EXTENT" ), context );
637 extent = mTriangularMesh.extent();
638 int pointXCount = int( extent.
width() / gridSpacing ) + 1;
639 int pointYCount = int( extent.
height() / gridSpacing ) + 1;
641 for (
int ix = 0; ix < pointXCount; ++ix )
643 for (
int iy = 0; iy < pointYCount; ++iy )
646 int triangularFaceIndex = mTriangularMesh.faceIndexForPoint_v2( point );
647 if ( triangularFaceIndex >= 0 )
651 int nativeFaceIndex = mTriangularMesh.trianglesToNativeFaces().at( triangularFaceIndex );
652 for (
int i = 0; i < mDataPerGroup.count(); ++i )
654 const DataGroup &dataGroup = mDataPerGroup.at( i );
655 bool faceActive = dataGroup.activeFaces.active( nativeFaceIndex );
663 dataGroup.activeFaces,
664 dataGroup.datasetValues,
668 if ( dataGroup.metadata.isVector() )
670 QVector<double> vector = vectorValue( dataGroup.datasetValues.value( i ), mExportVectorOption );
671 for (
double v : vector )
673 attributes.append( v );
677 attributes.append( value.
scalar() );
688 feedback->
reportError( QObject::tr(
"Could not transform point to destination CRS" ) );
693 sink->addFeature( feat );
701 ret[QStringLiteral(
"OUTPUT" )] = identifier;
706QSet<int> QgsExportMeshOnGridAlgorithm::supportedDataType()
715QString QgsMeshRasterizeAlgorithm::name()
const
717 return QStringLiteral(
"meshrasterize" );
720QString QgsMeshRasterizeAlgorithm::displayName()
const
722 return QObject::tr(
"Rasterize mesh dataset" );
725QString QgsMeshRasterizeAlgorithm::group()
const
727 return QObject::tr(
"Mesh" );
730QString QgsMeshRasterizeAlgorithm::groupId()
const
732 return QStringLiteral(
"mesh" );
735QString QgsMeshRasterizeAlgorithm::shortHelpString()
const
737 return QObject::tr(
"This algorithm creates a raster layer from a mesh dataset.\n"
738 "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"
739 "1D meshes are not supported." );
742QString QgsMeshRasterizeAlgorithm::shortDescription()
const
744 return QObject::tr(
"Creates a raster layer from a mesh dataset" );
749 return new QgsMeshRasterizeAlgorithm();
752void QgsMeshRasterizeAlgorithm::initAlgorithm(
const QVariantMap &configuration )
754 Q_UNUSED( configuration );
759 QStringLiteral(
"DATASET_GROUPS" ),
760 QObject::tr(
"Dataset groups" ),
761 QStringLiteral(
"INPUT" ),
767 QStringLiteral(
"DATASET_TIME" ),
768 QObject::tr(
"Dataset time" ),
769 QStringLiteral(
"INPUT" ),
770 QStringLiteral(
"DATASET_GROUPS" )
774 addParameter(
new QgsProcessingParameterDistance( QStringLiteral(
"PIXEL_SIZE" ), QObject::tr(
"Pixel size" ), 1, QStringLiteral(
"INPUT" ),
false ) );
775 addParameter(
new QgsProcessingParameterCrs( QStringLiteral(
"CRS_OUTPUT" ), QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
779 auto createOptsParam = std::make_unique<QgsProcessingParameterString>( QStringLiteral(
"CREATE_OPTIONS" ), QObject::tr(
"Creation options" ), QVariant(),
false,
true );
780 createOptsParam->setMetadata( QVariantMap( { { QStringLiteral(
"widget_wrapper" ), QVariantMap( { { QStringLiteral(
"widget_type" ), QStringLiteral(
"rasteroptions" ) } } ) } } ) );
782 addParameter( createOptsParam.release() );
784 auto creationOptsParam = std::make_unique<QgsProcessingParameterString>( QStringLiteral(
"CREATION_OPTIONS" ), QObject::tr(
"Creation options" ), QVariant(),
false,
true );
785 creationOptsParam->setMetadata( QVariantMap( { { QStringLiteral(
"widget_wrapper" ), QVariantMap( { { QStringLiteral(
"widget_type" ), QStringLiteral(
"rasteroptions" ) } } ) } } ) );
787 addParameter( creationOptsParam.release() );
794 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, QStringLiteral(
"INPUT" ), context );
796 if ( !meshLayer || !meshLayer->
isValid() )
806 mTriangularMesh.update( meshLayer->
nativeMesh(), mTransform );
816 QVariant parameterTimeVariant = parameters.value( QStringLiteral(
"DATASET_TIME" ) );
817 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
819 extractDatasetValues( datasetGroups, meshLayer, *meshLayer->
nativeMesh(), relativeTime, supportedDataType(), mDataPerGroup, feedback );
831 return QVariantMap();
838 for ( DataGroup &dataGroup : mDataPerGroup )
840 if ( dataGroup.dataset3dStakedValue.isValid() )
841 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
845 const double pixelSize = parameterAsDouble( parameters, QStringLiteral(
"PIXEL_SIZE" ), context );
851 QgsRectangle extent = parameterAsExtent( parameters, QStringLiteral(
"EXTENT" ), context );
853 extent = mTriangularMesh.extent();
855 int width = extent.
width() / pixelSize;
856 int height = extent.
height() / pixelSize;
858 QString creationOptions = parameterAsString( parameters, QStringLiteral(
"CREATION_OPTIONS" ), context ).trimmed();
860 const QString optionsString = parameterAsString( parameters, QStringLiteral(
"CREATE_OPTIONS" ), context );
861 if ( !optionsString.isEmpty() )
862 creationOptions = optionsString;
864 const QString fileName = parameterAsOutputLayer( parameters, QStringLiteral(
"OUTPUT" ), context );
865 const QFileInfo fileInfo( fileName );
868 rasterFileWriter.setOutputProviderKey( QStringLiteral(
"gdal" ) );
869 if ( !creationOptions.isEmpty() )
871 rasterFileWriter.setCreationOptions( creationOptions.split(
'|' ) );
873 rasterFileWriter.setOutputFormat( outputFormat );
875 std::unique_ptr<QgsRasterDataProvider> rasterDataProvider(
876 rasterFileWriter.createMultiBandRaster(
Qgis::DataType::Float64, width, height, extent, mTransform.destinationCrs(), mDataPerGroup.count() )
878 rasterDataProvider->setEditable(
true );
880 for (
int i = 0; i < mDataPerGroup.count(); ++i )
882 const DataGroup &dataGroup = mDataPerGroup.at( i );
887 if ( dataGroup.datasetValues.isValid() )
891 dataGroup.datasetValues,
892 dataGroup.activeFaces,
893 dataGroup.metadata.dataType(),
900 if ( !rasterDataProvider->writeBlock( block.get(), i + 1 ) )
902 throw QgsProcessingException( QObject::tr(
"Could not write raster block: %1" ).arg( rasterDataProvider->error().summary() ) );
904 rasterDataProvider->setNoDataValue( i + 1, block->noDataValue() );
907 rasterDataProvider->setNoDataValue( i + 1, std::numeric_limits<double>::quiet_NaN() );
912 return QVariantMap();
913 feedback->
setProgress( 100 * i / mDataPerGroup.count() );
917 rasterDataProvider->setEditable(
false );
923 ret[QStringLiteral(
"OUTPUT" )] = fileName;
928QSet<int> QgsMeshRasterizeAlgorithm::supportedDataType()
937QString QgsMeshContoursAlgorithm::name()
const
939 return QStringLiteral(
"meshcontours" );
942QString QgsMeshContoursAlgorithm::displayName()
const
944 return QObject::tr(
"Export contours" );
947QString QgsMeshContoursAlgorithm::group()
const
949 return QObject::tr(
"Mesh" );
952QString QgsMeshContoursAlgorithm::groupId()
const
954 return QStringLiteral(
"mesh" );
957QString QgsMeshContoursAlgorithm::shortHelpString()
const
959 return QObject::tr(
"This algorithm creates contours as a vector layer from a mesh scalar dataset." );
962QString QgsMeshContoursAlgorithm::shortDescription()
const
964 return QObject::tr(
"Creates contours as vector layer from mesh scalar dataset" );
969 return new QgsMeshContoursAlgorithm();
972void QgsMeshContoursAlgorithm::initAlgorithm(
const QVariantMap &configuration )
974 Q_UNUSED( configuration );
979 QStringLiteral(
"DATASET_GROUPS" ),
980 QObject::tr(
"Dataset groups" ),
981 QStringLiteral(
"INPUT" ),
986 QStringLiteral(
"DATASET_TIME" ),
987 QObject::tr(
"Dataset time" ),
988 QStringLiteral(
"INPUT" ),
989 QStringLiteral(
"DATASET_GROUPS" )
1003 auto contourLevelList = std::make_unique<QgsProcessingParameterString>(
1004 QStringLiteral(
"CONTOUR_LEVEL_LIST" ), QObject::tr(
"List of contours level" ), QVariant(),
false,
true
1006 contourLevelList->setHelp( QObject::tr(
"Comma separated list of values to export. If filled, the increment, minimum and maximum settings are ignored." ) );
1007 addParameter( contourLevelList.release() );
1009 addParameter(
new QgsProcessingParameterCrs( QStringLiteral(
"CRS_OUTPUT" ), QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
1018 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, QStringLiteral(
"INPUT" ), context );
1020 if ( !meshLayer || !meshLayer->
isValid() )
1030 mTriangularMesh.update( meshLayer->
nativeMesh(), mTransform );
1036 QString levelsString = parameterAsString( parameters, QStringLiteral(
"CONTOUR_LEVEL_LIST" ), context );
1037 if ( !levelsString.isEmpty() )
1039 QStringList levelStringList = levelsString.split(
',' );
1040 if ( !levelStringList.isEmpty() )
1042 for (
const QString &stringVal : levelStringList )
1045 double val = stringVal.toDouble( &ok );
1047 mLevels.append( val );
1049 throw QgsProcessingException( QObject::tr(
"Invalid format for level values, must be numbers separated with comma" ) );
1051 if ( mLevels.count() >= 2 )
1052 if ( mLevels.last() <= mLevels.at( mLevels.count() - 2 ) )
1053 throw QgsProcessingException( QObject::tr(
"Invalid format for level values, must be different numbers and in increasing order" ) );
1058 if ( mLevels.isEmpty() )
1060 double minimum = parameterAsDouble( parameters, QStringLiteral(
"MINIMUM" ), context );
1061 double maximum = parameterAsDouble( parameters, QStringLiteral(
"MAXIMUM" ), context );
1062 double interval = parameterAsDouble( parameters, QStringLiteral(
"INCREMENT" ), context );
1064 if ( interval <= 0 )
1067 if ( minimum >= maximum )
1068 throw QgsProcessingException( QObject::tr(
"Invalid minimum and maximum values, minimum must be lesser than maximum" ) );
1070 if ( interval > ( maximum - minimum ) )
1071 throw QgsProcessingException( QObject::tr(
"Invalid minimum, maximum and interval values, difference between minimum and maximum must be greater or equal than interval" ) );
1073 int intervalCount = ( maximum - minimum ) / interval;
1075 mLevels.reserve( intervalCount );
1076 for (
int i = 0; i < intervalCount; ++i )
1078 mLevels.append( minimum + i * interval );
1091 QVariant parameterTimeVariant = parameters.value( QStringLiteral(
"DATASET_TIME" ) );
1092 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
1096 extractDatasetValues( datasetGroups, meshLayer, mNativeMesh, relativeTime, supportedDataType(), mDataPerGroup, feedback );
1107 for ( DataGroup &dataGroup : mDataPerGroup )
1109 if ( dataGroup.dataset3dStakedValue.isValid() )
1110 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
1116 polygonFields.
append(
QgsField( QObject::tr(
"group" ), QMetaType::Type::QString ) );
1117 polygonFields.
append(
QgsField( QObject::tr(
"time" ), QMetaType::Type::QString ) );
1118 polygonFields.
append(
QgsField( QObject::tr(
"min_value" ), QMetaType::Type::Double ) );
1119 polygonFields.
append(
QgsField( QObject::tr(
"max_value" ), QMetaType::Type::Double ) );
1120 lineFields.
append(
QgsField( QObject::tr(
"group" ), QMetaType::Type::QString ) );
1121 lineFields.
append(
QgsField( QObject::tr(
"time" ), QMetaType::Type::QString ) );
1122 lineFields.
append(
QgsField( QObject::tr(
"value" ), QMetaType::Type::Double ) );
1126 QString lineIdentifier;
1127 QString polygonIdentifier;
1128 std::unique_ptr<QgsFeatureSink> sinkPolygons( parameterAsSink(
1130 QStringLiteral(
"OUTPUT_POLYGONS" ),
1137 std::unique_ptr<QgsFeatureSink> sinkLines( parameterAsSink(
1139 QStringLiteral(
"OUTPUT_LINES" ),
1147 if ( !sinkLines || !sinkPolygons )
1148 return QVariantMap();
1151 for (
int i = 0; i < mDataPerGroup.count(); ++i )
1153 DataGroup dataGroup = mDataPerGroup.at( i );
1155 int count = scalarDataOnVertices ? mNativeMesh.vertices.count() : mNativeMesh.faces.count();
1157 QVector<double> values;
1158 if ( dataGroup.datasetValues.isValid() )
1161 values = QgsMeshLayerUtils::calculateMagnitudes( dataGroup.datasetValues );
1165 values = QVector<double>( count, std::numeric_limits<double>::quiet_NaN() );
1168 if ( ( !scalarDataOnVertices ) )
1170 values = QgsMeshLayerUtils::interpolateFromFacesData(
1173 &dataGroup.activeFaces,
1178 QgsMeshContours contoursExported( mTriangularMesh, mNativeMesh, values, dataGroup.activeFaces );
1181 firstAttributes.append( dataGroup.metadata.name() );
1182 firstAttributes.append( mDateTimeString );
1184 for (
double level : std::as_const( mLevels ) )
1186 QgsGeometry line = contoursExported.exportLines( level, feedback );
1188 return QVariantMap();
1192 lineAttributes.append( level );
1199 throw QgsProcessingException( writeFeatureError( sinkLines.get(), parameters, QStringLiteral(
"OUTPUT_LINES" ) ) );
1202 for (
int l = 0; l < mLevels.count() - 1; ++l )
1204 QgsGeometry polygon = contoursExported.exportPolygons( mLevels.at( l ), mLevels.at( l + 1 ), feedback );
1206 return QVariantMap();
1211 polygonAttributes.append( mLevels.at( l ) );
1212 polygonAttributes.append( mLevels.at( l + 1 ) );
1217 sinkPolygons->addFeature( polygonFeature );
1222 feedback->
setProgress( 100 * i / mDataPerGroup.count() );
1227 sinkPolygons->finalize();
1229 sinkLines->finalize();
1232 ret[QStringLiteral(
"OUTPUT_LINES" )] = lineIdentifier;
1233 ret[QStringLiteral(
"OUTPUT_POLYGONS" )] = polygonIdentifier;
1238QString QgsMeshExportCrossSection::name()
const
1240 return QStringLiteral(
"meshexportcrosssection" );
1243QString QgsMeshExportCrossSection::displayName()
const
1245 return QObject::tr(
"Export cross section dataset values on lines from mesh" );
1248QString QgsMeshExportCrossSection::group()
const
1250 return QObject::tr(
"Mesh" );
1253QString QgsMeshExportCrossSection::groupId()
const
1255 return QStringLiteral(
"mesh" );
1258QString QgsMeshExportCrossSection::shortHelpString()
const
1260 return QObject::tr(
"This algorithm extracts mesh's dataset values from line contained in a vector layer.\n"
1261 "Each line is discretized with a resolution distance parameter for extraction of values on its vertices." );
1264QString QgsMeshExportCrossSection::shortDescription()
const
1266 return QObject::tr(
"Extracts a mesh dataset's values from lines contained in a vector layer" );
1271 return new QgsMeshExportCrossSection();
1274void QgsMeshExportCrossSection::initAlgorithm(
const QVariantMap &configuration )
1276 Q_UNUSED( configuration );
1281 QStringLiteral(
"DATASET_GROUPS" ),
1282 QObject::tr(
"Dataset groups" ),
1283 QStringLiteral(
"INPUT" ),
1288 QStringLiteral(
"DATASET_TIME" ),
1289 QObject::tr(
"Dataset time" ),
1290 QStringLiteral(
"INPUT" ),
1291 QStringLiteral(
"DATASET_GROUPS" )
1294 QList<int> datatype;
1297 QStringLiteral(
"INPUT_LINES" ), QObject::tr(
"Lines for data export" ), datatype, QVariant(),
false
1301 QStringLiteral(
"RESOLUTION" ), QObject::tr(
"Line segmentation resolution" ), 10.0, QStringLiteral(
"INPUT_LINES" ),
false, 0
1313 QStringLiteral(
"OUTPUT" ), QObject::tr(
"Exported data CSV file" ), QObject::tr(
"CSV file (*.csv)" )
1319 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, QStringLiteral(
"INPUT" ), context );
1321 if ( !meshLayer || !meshLayer->
isValid() )
1324 mMeshLayerCrs = meshLayer->
crs();
1325 mTriangularMesh.update( meshLayer->
nativeMesh() );
1334 QVariant parameterTimeVariant = parameters.value( QStringLiteral(
"DATASET_TIME" ) );
1335 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
1337 extractDatasetValues( datasetGroups, meshLayer, *meshLayer->
nativeMesh(), relativeTime, supportedDataType(), mDataPerGroup, feedback );
1350 for ( DataGroup &dataGroup : mDataPerGroup )
1352 if ( dataGroup.dataset3dStakedValue.isValid() )
1353 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
1355 double resolution = parameterAsDouble( parameters, QStringLiteral(
"RESOLUTION" ), context );
1356 int datasetDigits = parameterAsInt( parameters, QStringLiteral(
"DATASET_DIGITS" ), context );
1357 int coordDigits = parameterAsInt( parameters, QStringLiteral(
"COORDINATES_DIGITS" ), context );
1359 std::unique_ptr<QgsProcessingFeatureSource> featureSource( parameterAsSource( parameters, QStringLiteral(
"INPUT_LINES" ), context ) );
1360 if ( !featureSource )
1365 QString outputFileName = parameterAsFileOutput( parameters, QStringLiteral(
"OUTPUT" ), context );
1366 QFile file( outputFileName );
1367 if ( !file.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
1370 QTextStream textStream( &file );
1371#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
1372 textStream.setCodec(
"UTF-8" );
1375 header << QStringLiteral(
"fid" ) << QStringLiteral(
"x" ) << QStringLiteral(
"y" ) << QObject::tr(
"offset" );
1376 for (
const DataGroup &datagroup : std::as_const( mDataPerGroup ) )
1377 header << datagroup.metadata.name();
1378 textStream << header.join(
',' ) << QStringLiteral(
"\n" );
1380 long long featCount = featureSource->featureCount();
1381 long long featCounter = 0;
1395 feedback->
reportError( QObject::tr(
"Could not transform line to mesh CRS" ) );
1401 while ( offset <= line.
length() )
1404 return QVariantMap();
1406 QStringList textLine;
1408 int triangularFaceIndex = mTriangularMesh.faceIndexForPoint_v2( point );
1409 textLine << QString::number( fid ) << QString::number( point.
x(),
'f', coordDigits ) << QString::number( point.
y(),
'f', coordDigits ) << QString::number( offset,
'f', coordDigits );
1410 if ( triangularFaceIndex >= 0 )
1414 int nativeFaceIndex = mTriangularMesh.trianglesToNativeFaces().at( triangularFaceIndex );
1415 for (
int i = 0; i < mDataPerGroup.count(); ++i )
1417 const DataGroup &dataGroup = mDataPerGroup.at( i );
1418 bool faceActive = dataGroup.activeFaces.active( nativeFaceIndex );
1424 triangularFaceIndex,
1426 dataGroup.activeFaces,
1427 dataGroup.datasetValues,
1431 if ( abs( value.
x() ) == std::numeric_limits<double>::quiet_NaN() )
1432 textLine << QString(
' ' );
1434 textLine << QString::number( value.
scalar(),
'f', datasetDigits );
1438 for (
int i = 0; i < mDataPerGroup.count(); ++i )
1439 textLine << QString(
' ' );
1441 textStream << textLine.join(
',' ) << QStringLiteral(
"\n" );
1443 offset += resolution;
1448 feedback->
setProgress( 100.0 * featCounter / featCount );
1450 return QVariantMap();
1457 ret[QStringLiteral(
"OUTPUT" )] = outputFileName;
1461QString QgsMeshExportTimeSeries::name()
const
1463 return QStringLiteral(
"meshexporttimeseries" );
1466QString QgsMeshExportTimeSeries::displayName()
const
1468 return QObject::tr(
"Export time series values from points of a mesh dataset" );
1471QString QgsMeshExportTimeSeries::group()
const
1473 return QObject::tr(
"Mesh" );
1476QString QgsMeshExportTimeSeries::groupId()
const
1478 return QStringLiteral(
"mesh" );
1481QString QgsMeshExportTimeSeries::shortHelpString()
const
1483 return QObject::tr(
"This algorithm extracts mesh's dataset time series values from points contained in a vector layer.\n"
1484 "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." );
1487QString QgsMeshExportTimeSeries::shortDescription()
const
1489 return QObject::tr(
"Extracts a mesh dataset's time series values from points contained in a vector layer" );
1494 return new QgsMeshExportTimeSeries();
1497void QgsMeshExportTimeSeries::initAlgorithm(
const QVariantMap &configuration )
1499 Q_UNUSED( configuration );
1504 QStringLiteral(
"DATASET_GROUPS" ),
1505 QObject::tr(
"Dataset groups" ),
1506 QStringLiteral(
"INPUT" ),
1511 QStringLiteral(
"STARTING_TIME" ),
1512 QObject::tr(
"Starting time" ),
1513 QStringLiteral(
"INPUT" ),
1514 QStringLiteral(
"DATASET_GROUPS" )
1518 QStringLiteral(
"FINISHING_TIME" ),
1519 QObject::tr(
"Finishing time" ),
1520 QStringLiteral(
"INPUT" ),
1521 QStringLiteral(
"DATASET_GROUPS" )
1528 QList<int> datatype;
1531 QStringLiteral(
"INPUT_POINTS" ), QObject::tr(
"Points for data export" ), datatype, QVariant(),
false
1543 QStringLiteral(
"OUTPUT" ), QObject::tr(
"Exported data CSV file" ), QObject::tr(
"CSV file (*.csv)" )
1549 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, QStringLiteral(
"INPUT" ), context );
1551 if ( !meshLayer || !meshLayer->
isValid() )
1554 mMeshLayerCrs = meshLayer->
crs();
1555 mTriangularMesh.update( meshLayer->
nativeMesh() );
1565 QVariant parameterStartTimeVariant = parameters.value( QStringLiteral(
"STARTING_TIME" ) );
1566 QgsInterval relativeStartTime = datasetRelativetime( parameterStartTimeVariant, meshLayer, context );
1568 QVariant parameterEndTimeVariant = parameters.value( QStringLiteral(
"FINISHING_TIME" ) );
1569 QgsInterval relativeEndTime = datasetRelativetime( parameterEndTimeVariant, meshLayer, context );
1572 qint64 timeStepInterval = parameterAsDouble( parameters, QStringLiteral(
"TIME_STEP" ), context ) * 1000 * 3600;
1573 if ( timeStepInterval == 0 )
1576 for (
int groupIndex : datasetGroups )
1590 mRelativeTimeSteps.clear();
1591 mTimeStepString.clear();
1592 if ( timeStepInterval != 0 )
1594 mRelativeTimeSteps.append( relativeStartTime.
seconds() * 1000 );
1595 while ( mRelativeTimeSteps.last() < relativeEndTime.
seconds() * 1000 )
1596 mRelativeTimeSteps.append( mRelativeTimeSteps.last() + timeStepInterval );
1598 for ( qint64 relativeTimeStep : std::as_const( mRelativeTimeSteps ) )
1600 mTimeStepString.append( meshLayer->
formatTime( relativeTimeStep / 3600.0 / 1000.0 ) );
1605 for (
int i = 0; i < datasetGroups.count(); ++i )
1607 int groupIndex = datasetGroups.at( i );
1609 if ( supportedDataType().contains( meta.
dataType() ) )
1611 mGroupIndexes.append( groupIndex );
1612 mGroupsMetadata[groupIndex] = meta;
1615 if ( !mRelativeTimeSteps.isEmpty() )
1619 for ( qint64 relativeTimeStep : std::as_const( mRelativeTimeSteps ) )
1621 QMap<int, int> &groupIndexToData = mRelativeTimeToData[relativeTimeStep];
1622 QgsInterval timeStepInterval( relativeTimeStep / 1000.0 );
1624 if ( !datasetIndex.
isValid() )
1626 if ( datasetIndex != lastDatasetIndex )
1628 DataGroup dataGroup;
1629 dataGroup.metadata = meta;
1630 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, valueCount );
1634 dataGroup.dataset3dStakedValue = meshLayer->
dataset3dValues( datasetIndex, 0, valueCount );
1636 mDatasets.append( dataGroup );
1637 lastDatasetIndex = datasetIndex;
1639 groupIndexToData[groupIndex] = mDatasets.count() - 1;
1645 QMap<int, int> &groupIndexToData = mRelativeTimeToData[0];
1647 DataGroup dataGroup;
1648 dataGroup.metadata = meta;
1649 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, valueCount );
1653 dataGroup.dataset3dStakedValue = meshLayer->
dataset3dValues( datasetIndex, 0, valueCount );
1655 mDatasets.append( dataGroup );
1656 groupIndexToData[groupIndex] = mDatasets.
count() - 1;
1661 feedback->
setProgress( 100 * i / datasetGroups.count() );
1677 for ( DataGroup &dataGroup : mDatasets )
1679 if ( dataGroup.dataset3dStakedValue.isValid() )
1680 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
1683 int datasetDigits = parameterAsInt( parameters, QStringLiteral(
"DATASET_DIGITS" ), context );
1684 int coordDigits = parameterAsInt( parameters, QStringLiteral(
"COORDINATES_DIGITS" ), context );
1686 std::unique_ptr<QgsProcessingFeatureSource> featureSource( parameterAsSource( parameters, QStringLiteral(
"INPUT_POINTS" ), context ) );
1687 if ( !featureSource )
1692 QString outputFileName = parameterAsFileOutput( parameters, QStringLiteral(
"OUTPUT" ), context );
1693 QFile file( outputFileName );
1694 if ( !file.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
1697 QTextStream textStream( &file );
1698#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
1699 textStream.setCodec(
"UTF-8" );
1702 header << QStringLiteral(
"fid" ) << QStringLiteral(
"x" ) << QStringLiteral(
"y" ) << QObject::tr(
"time" );
1704 for (
int gi : std::as_const( mGroupIndexes ) )
1705 header << mGroupsMetadata.value( gi ).name();
1707 textStream << header.join(
',' ) << QStringLiteral(
"\n" );
1709 long long featCount = featureSource->featureCount();
1710 long long featCounter = 0;
1724 feedback->
reportError( QObject::tr(
"Could not transform line to mesh CRS" ) );
1731 int triangularFaceIndex = mTriangularMesh.faceIndexForPoint_v2( point );
1733 if ( triangularFaceIndex >= 0 )
1735 int nativeFaceIndex = mTriangularMesh.trianglesToNativeFaces().at( triangularFaceIndex );
1736 if ( !mRelativeTimeSteps.isEmpty() )
1738 for (
int timeIndex = 0; timeIndex < mRelativeTimeSteps.count(); ++timeIndex )
1740 qint64 timeStep = mRelativeTimeSteps.at( timeIndex );
1741 QStringList textLine;
1742 textLine << QString::number( fid )
1743 << QString::number( point.
x(),
'f', coordDigits )
1744 << QString::number( point.
y(),
'f', coordDigits )
1745 << mTimeStepString.at( timeIndex );
1747 if ( mRelativeTimeToData.contains( timeStep ) )
1749 const QMap<int, int> &groupToData = mRelativeTimeToData.value( timeStep );
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 )
1758 const DataGroup &dataGroup = mDatasets.at( dataIndex );
1759 QgsMeshDatasetValue value = extractDatasetValue( point, nativeFaceIndex, triangularFaceIndex, mTriangularMesh, dataGroup.activeFaces, dataGroup.datasetValues, dataGroup.metadata );
1760 if ( abs( value.
x() ) == std::numeric_limits<double>::quiet_NaN() )
1761 textLine << QString(
' ' );
1763 textLine << QString::number( value.
scalar(),
'f', datasetDigits );
1766 textStream << textLine.join(
',' ) << QStringLiteral(
"\n" );
1771 QStringList textLine;
1772 textLine << QString::number( fid )
1773 << QString::number( point.
x(),
'f', coordDigits )
1774 << QString::number( point.
y(),
'f', coordDigits )
1775 << QObject::tr(
"static dataset" );
1776 const QMap<int, int> &groupToData = mRelativeTimeToData.value( 0 );
1777 for (
int groupIndex : std::as_const( mGroupIndexes ) )
1779 if ( !groupToData.contains( groupIndex ) )
1781 int dataIndex = groupToData.value( groupIndex );
1782 if ( dataIndex < 0 || dataIndex > mDatasets.count() - 1 )
1784 const DataGroup &dataGroup = mDatasets.at( dataIndex );
1785 QgsMeshDatasetValue value = extractDatasetValue( point, nativeFaceIndex, triangularFaceIndex, mTriangularMesh, dataGroup.activeFaces, dataGroup.datasetValues, dataGroup.metadata );
1786 if ( abs( value.
x() ) == std::numeric_limits<double>::quiet_NaN() )
1787 textLine << QString(
' ' );
1789 textLine << QString::number( value.
scalar(),
'f', datasetDigits );
1791 textStream << textLine.join(
',' ) << QStringLiteral(
"\n" );
1797 feedback->
setProgress( 100.0 * featCounter / featCount );
1799 return QVariantMap();
1806 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.
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.
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.
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.
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.
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.