34using namespace Qt::StringLiterals;
39static QgsFields createFields(
const QList<QgsMeshDatasetGroupMetadata> &groupMetadataList,
int vectorOption )
44 if ( meta.isVector() )
46 if ( vectorOption == 0 || vectorOption == 2 )
48 fields.
append(
QgsField( u
"%1_x"_s.arg( meta.name() ), QMetaType::Type::Double ) );
49 fields.
append(
QgsField( u
"%1_y"_s.arg( meta.name() ), QMetaType::Type::Double ) );
52 if ( vectorOption == 1 || vectorOption == 2 )
54 fields.
append(
QgsField( u
"%1_mag"_s.arg( meta.name() ), QMetaType::Type::Double ) );
55 fields.
append(
QgsField( u
"%1_dir"_s.arg( meta.name() ), QMetaType::Type::Double ) );
66 QVector<double> ret( exportOption == 2 ? 4 : 2 );
68 if ( exportOption == 0 || exportOption == 2 )
73 if ( exportOption == 1 || exportOption == 2 )
77 double magnitude = sqrt( x * x + y * y );
78 double direction = ( asin( x / magnitude ) ) / M_PI * 180;
80 direction = 180 - direction;
82 if ( exportOption == 1 )
87 if ( exportOption == 2 )
100 QVector<double> vectorValues = vectorValue( value, vectorOption );
101 for (
double v : vectorValues )
103 if ( v == std::numeric_limits<double>::quiet_NaN() )
104 attributes.append( QVariant() );
106 attributes.append( v );
111 if ( value.
scalar() == std::numeric_limits<double>::quiet_NaN() )
112 attributes.append( QVariant() );
114 attributes.append( value.
scalar() );
121 int triangularFaceIndex,
128 bool faceActive = activeFaces.
active( nativeFaceIndex );
140 value = datasetValues.
value( nativeFaceIndex );
147 const int v1 = face[0], v2 = face[1], v3 = face[2];
152 const double x = QgsMeshLayerUtils::interpolateFromVerticesData( p1, p2, p3, val1.
x(), val2.
x(), val3.
x(), point );
153 double y = std::numeric_limits<double>::quiet_NaN();
154 bool isVector = metadata.
isVector();
156 y = QgsMeshLayerUtils::interpolateFromVerticesData( p1, p2, p3, val1.
y(), val2.
y(), val3.
y(), point );
167QString QgsExportMeshOnElement::group()
const
169 return QObject::tr(
"Mesh" );
172QString QgsExportMeshOnElement::groupId()
const
177QString QgsExportMeshVerticesAlgorithm::shortHelpString()
const
179 return QObject::tr(
"This algorithm exports a mesh layer's vertices to a point vector layer, with the dataset values on vertices as attribute values." );
182QString QgsExportMeshVerticesAlgorithm::shortDescription()
const
184 return QObject::tr(
"Exports mesh vertices to a point vector layer." );
187QString QgsExportMeshVerticesAlgorithm::name()
const
189 return u
"exportmeshvertices"_s;
192QString QgsExportMeshVerticesAlgorithm::displayName()
const
194 return QObject::tr(
"Export mesh vertices" );
199 return new QgsExportMeshVerticesAlgorithm();
202QgsGeometry QgsExportMeshVerticesAlgorithm::meshElement(
int index )
const
207void QgsExportMeshOnElement::initAlgorithm(
const QVariantMap &configuration )
209 Q_UNUSED( configuration );
218 addParameter(
new QgsProcessingParameterCrs( u
"CRS_OUTPUT"_s, QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
220 QStringList exportVectorOptions;
221 exportVectorOptions << QObject::tr(
"Cartesian (x,y)" ) << QObject::tr(
"Polar (magnitude,degree)" ) << QObject::tr(
"Cartesian and Polar" );
222 addParameter(
new QgsProcessingParameterEnum( u
"VECTOR_OPTION"_s, QObject::tr(
"Export vector option" ), exportVectorOptions,
false, 0 ) );
232 if ( timeType ==
"dataset-time-step"_L1 )
237 else if ( timeType ==
"defined-date-time"_L1 )
240 if ( dateTime.isValid() )
241 relativeTime =
QgsInterval( layerReferenceTime.secsTo( dateTime ) );
243 else if ( timeType ==
"current-context-time"_L1 )
246 if ( dateTime.isValid() )
247 relativeTime =
QgsInterval( layerReferenceTime.secsTo( dateTime ) );
256 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
258 if ( !meshLayer || !meshLayer->
isValid() )
266 outputCrs = meshLayer->
crs();
281 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
282 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
284 switch ( meshElementType() )
287 mElementCount = mNativeMesh.faceCount();
290 mElementCount = mNativeMesh.vertexCount();
293 mElementCount = mNativeMesh.edgeCount();
297 for (
int i = 0; i < datasetGroups.count(); ++i )
299 int groupIndex = datasetGroups.at( i );
304 if ( supportedDataType().contains( dataGroup.metadata.dataType() ) )
306 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, mElementCount );
307 mDataPerGroup.append( dataGroup );
310 feedback->
setProgress( 100 * i / datasetGroups.count() );
313 mExportVectorOption = parameterAsInt( parameters, u
"VECTOR_OPTION"_s, context );
323 return QVariantMap();
325 feedback->
setProgressText( QObject::tr(
"Creating output vector layer" ) );
328 QList<QgsMeshDatasetGroupMetadata> metaList;
329 metaList.reserve( mDataPerGroup.size() );
330 for (
const DataGroup &dataGroup : std::as_const( mDataPerGroup ) )
331 metaList.append( dataGroup.metadata );
332 QgsFields fields = createFields( metaList, mExportVectorOption );
336 std::unique_ptr<QgsFeatureSink> sink( parameterAsSink( parameters, u
"OUTPUT"_s, context, identifier, fields, sinkGeometryType(), outputCrs ) );
338 return QVariantMap();
343 return QVariantMap();
345 feedback->
setProgressText( QObject::tr(
"Creating points for each vertices" ) );
348 for (
int i = 0; i < mElementCount; ++i )
351 for (
const DataGroup &dataGroup : std::as_const( mDataPerGroup ) )
354 addAttributes( value, attributes, dataGroup.metadata.isVector(), mExportVectorOption );
365 geom = meshElement( i );
367 feedback->
reportError( QObject::tr(
"Could not transform point to destination CRS" ) );
380 return QVariantMap();
389 ret[u
"OUTPUT"_s] = identifier;
394QString QgsExportMeshFacesAlgorithm::shortHelpString()
const
396 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." );
399QString QgsExportMeshFacesAlgorithm::shortDescription()
const
401 return QObject::tr(
"Exports mesh faces to a polygon vector layer." );
404QString QgsExportMeshFacesAlgorithm::name()
const
406 return u
"exportmeshfaces"_s;
409QString QgsExportMeshFacesAlgorithm::displayName()
const
411 return QObject::tr(
"Export mesh faces" );
416 return new QgsExportMeshFacesAlgorithm();
419QgsGeometry QgsExportMeshFacesAlgorithm::meshElement(
int index )
const
421 const QgsMeshFace &face = mNativeMesh.face( index );
422 QVector<QgsPoint> vertices( face.size() );
423 for (
int i = 0; i < face.size(); ++i )
424 vertices[i] = mNativeMesh.vertex( face.at( i ) );
425 auto polygon = std::make_unique<QgsPolygon>();
430QString QgsExportMeshEdgesAlgorithm::shortHelpString()
const
432 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." );
435QString QgsExportMeshEdgesAlgorithm::shortDescription()
const
437 return QObject::tr(
"Exports mesh edges to a line vector layer." );
440QString QgsExportMeshEdgesAlgorithm::name()
const
442 return u
"exportmeshedges"_s;
445QString QgsExportMeshEdgesAlgorithm::displayName()
const
447 return QObject::tr(
"Export mesh edges" );
452 return new QgsExportMeshEdgesAlgorithm();
455QgsGeometry QgsExportMeshEdgesAlgorithm::meshElement(
int index )
const
457 const QgsMeshEdge &edge = mNativeMesh.edge( index );
458 QVector<QgsPoint> vertices( 2 );
459 vertices[0] = mNativeMesh.vertex( edge.first );
460 vertices[1] = mNativeMesh.vertex( edge.second );
465QString QgsExportMeshOnGridAlgorithm::name()
const
467 return u
"exportmeshongrid"_s;
470QString QgsExportMeshOnGridAlgorithm::displayName()
const
472 return QObject::tr(
"Export mesh on grid" );
475QString QgsExportMeshOnGridAlgorithm::group()
const
477 return QObject::tr(
"Mesh" );
480QString QgsExportMeshOnGridAlgorithm::groupId()
const
485QString QgsExportMeshOnGridAlgorithm::shortHelpString()
const
488 "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"
489 "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 "
491 "1D meshes are not supported."
495QString QgsExportMeshOnGridAlgorithm::shortDescription()
const
497 return QObject::tr(
"Exports mesh dataset values to a gridded point vector layer." );
502 return new QgsExportMeshOnGridAlgorithm();
505void QgsExportMeshOnGridAlgorithm::initAlgorithm(
const QVariantMap &configuration )
507 Q_UNUSED( configuration );
519 addParameter(
new QgsProcessingParameterCrs( u
"CRS_OUTPUT"_s, QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
521 QStringList exportVectorOptions;
522 exportVectorOptions << QObject::tr(
"Cartesian (x,y)" ) << QObject::tr(
"Polar (magnitude,degree)" ) << QObject::tr(
"Cartesian and Polar" );
523 addParameter(
new QgsProcessingParameterEnum( u
"VECTOR_OPTION"_s, QObject::tr(
"Export vector option" ), exportVectorOptions,
false, 0 ) );
527static void extractDatasetValues(
528 const QList<int> &datasetGroups,
532 const QSet<int> supportedDataType,
533 QList<DataGroup> &datasetPerGroup,
537 for (
int i = 0; i < datasetGroups.count(); ++i )
539 int groupIndex = datasetGroups.at( i );
544 if ( supportedDataType.contains( dataGroup.metadata.dataType() ) )
547 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, valueCount );
551 dataGroup.dataset3dStakedValue = meshLayer->
dataset3dValues( datasetIndex, 0, valueCount );
553 datasetPerGroup.append( dataGroup );
556 feedback->
setProgress( 100 * i / datasetGroups.count() );
562 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
564 if ( !meshLayer || !meshLayer->
isValid() )
569 outputCrs = meshLayer->
crs();
584 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
585 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
587 extractDatasetValues( datasetGroups, meshLayer, nativeMesh, relativeTime, supportedDataType(), mDataPerGroup, feedback );
588 mTriangularMesh.update( meshLayer->
nativeMesh(), mTransform );
590 mExportVectorOption = parameterAsInt( parameters, u
"VECTOR_OPTION"_s, context );
600 return QVariantMap();
602 feedback->
setProgressText( QObject::tr(
"Creating output vector layer" ) );
607 for ( DataGroup &dataGroup : mDataPerGroup )
609 if ( dataGroup.dataset3dStakedValue.isValid() )
610 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
613 QList<QgsMeshDatasetGroupMetadata> metaList;
614 metaList.reserve( mDataPerGroup.size() );
615 for (
const DataGroup &dataGroup : std::as_const( mDataPerGroup ) )
616 metaList.append( dataGroup.metadata );
617 QgsFields fields = createFields( metaList, mExportVectorOption );
622 std::unique_ptr<QgsFeatureSink> sink( parameterAsSink( parameters, u
"OUTPUT"_s, context, identifier, fields,
Qgis::WkbType::Point, outputCrs ) );
624 return QVariantMap();
629 return QVariantMap();
635 const double gridSpacing = parameterAsDouble( parameters, u
"GRID_SPACING"_s, context );
641 QgsRectangle extent = parameterAsExtent( parameters, u
"EXTENT"_s, context );
643 extent = mTriangularMesh.extent();
644 int pointXCount = int( extent.
width() / gridSpacing ) + 1;
645 int pointYCount = int( extent.
height() / gridSpacing ) + 1;
647 for (
int ix = 0; ix < pointXCount; ++ix )
649 for (
int iy = 0; iy < pointYCount; ++iy )
652 int triangularFaceIndex = mTriangularMesh.faceIndexForPoint_v2( point );
653 if ( triangularFaceIndex >= 0 )
657 int nativeFaceIndex = mTriangularMesh.trianglesToNativeFaces().at( triangularFaceIndex );
658 for (
int i = 0; i < mDataPerGroup.count(); ++i )
660 const DataGroup &dataGroup = mDataPerGroup.at( i );
661 bool faceActive = dataGroup.activeFaces.active( nativeFaceIndex );
664 QgsMeshDatasetValue value = extractDatasetValue( point, nativeFaceIndex, triangularFaceIndex, mTriangularMesh, dataGroup.activeFaces, dataGroup.datasetValues, dataGroup.metadata );
666 if ( dataGroup.metadata.isVector() )
668 QVector<double> vector = vectorValue( dataGroup.datasetValues.value( i ), mExportVectorOption );
669 for (
double v : vector )
671 attributes.append( v );
675 attributes.append( value.
scalar() );
686 feedback->
reportError( QObject::tr(
"Could not transform point to destination CRS" ) );
707 ret[u
"OUTPUT"_s] = identifier;
712QSet<int> QgsExportMeshOnGridAlgorithm::supportedDataType()
717QString QgsMeshRasterizeAlgorithm::name()
const
719 return u
"meshrasterize"_s;
722QString QgsMeshRasterizeAlgorithm::displayName()
const
724 return QObject::tr(
"Rasterize mesh dataset" );
727QString QgsMeshRasterizeAlgorithm::group()
const
729 return QObject::tr(
"Mesh" );
732QString QgsMeshRasterizeAlgorithm::groupId()
const
737QString QgsMeshRasterizeAlgorithm::shortHelpString()
const
740 "This algorithm creates a raster layer from a mesh dataset.\n"
741 "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 "
743 "1D meshes are not supported."
747QString QgsMeshRasterizeAlgorithm::shortDescription()
const
749 return QObject::tr(
"Creates a raster layer from a mesh dataset." );
754 return new QgsMeshRasterizeAlgorithm();
757void QgsMeshRasterizeAlgorithm::initAlgorithm(
const QVariantMap &configuration )
759 Q_UNUSED( configuration );
769 addParameter(
new QgsProcessingParameterCrs( u
"CRS_OUTPUT"_s, QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
773 auto createOptsParam = std::make_unique<QgsProcessingParameterString>( u
"CREATE_OPTIONS"_s, QObject::tr(
"Creation options" ), QVariant(),
false,
true );
774 createOptsParam->setMetadata( QVariantMap( { { u
"widget_wrapper"_s, QVariantMap( { { u
"widget_type"_s, u
"rasteroptions"_s } } ) } } ) );
776 addParameter( createOptsParam.release() );
778 auto creationOptsParam = std::make_unique<QgsProcessingParameterString>( u
"CREATION_OPTIONS"_s, QObject::tr(
"Creation options" ), QVariant(),
false,
true );
779 creationOptsParam->setMetadata( QVariantMap( { { u
"widget_wrapper"_s, QVariantMap( { { u
"widget_type"_s, u
"rasteroptions"_s } } ) } } ) );
781 addParameter( creationOptsParam.release() );
788 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
790 if ( !meshLayer || !meshLayer->
isValid() )
795 outputCrs = meshLayer->
crs();
800 mTriangularMesh.update( meshLayer->
nativeMesh(), mTransform );
810 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
811 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
813 extractDatasetValues( datasetGroups, meshLayer, *meshLayer->
nativeMesh(), relativeTime, supportedDataType(), mDataPerGroup, feedback );
825 return QVariantMap();
832 for ( DataGroup &dataGroup : mDataPerGroup )
834 if ( dataGroup.dataset3dStakedValue.isValid() )
835 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
839 const double pixelSize = parameterAsDouble( parameters, u
"PIXEL_SIZE"_s, context );
845 QgsRectangle extent = parameterAsExtent( parameters, u
"EXTENT"_s, context );
847 extent = mTriangularMesh.extent();
849 int width = extent.
width() / pixelSize;
850 int height = extent.
height() / pixelSize;
852 QString creationOptions = parameterAsString( parameters, u
"CREATION_OPTIONS"_s, context ).trimmed();
854 const QString optionsString = parameterAsString( parameters, u
"CREATE_OPTIONS"_s, context );
855 if ( !optionsString.isEmpty() )
856 creationOptions = optionsString;
858 const QString fileName = parameterAsOutputLayer( parameters, u
"OUTPUT"_s, context );
859 const QString outputFormat = parameterAsOutputRasterFormat( parameters, u
"OUTPUT"_s, context );
861 rasterFileWriter.setOutputProviderKey( u
"gdal"_s );
862 if ( !creationOptions.isEmpty() )
864 rasterFileWriter.setCreationOptions( creationOptions.split(
'|' ) );
866 rasterFileWriter.setOutputFormat( outputFormat );
868 std::unique_ptr<QgsRasterDataProvider> rasterDataProvider( rasterFileWriter.createMultiBandRaster(
Qgis::DataType::Float64, width, height, extent, mTransform.destinationCrs(), mDataPerGroup.count() ) );
869 rasterDataProvider->setEditable(
true );
871 const bool hasReportsDuringClose = rasterDataProvider->hasReportsDuringClose();
872 const double maxProgressDuringBlockWriting = hasReportsDuringClose ? 50.0 : 100.0;
874 for (
int i = 0; i < mDataPerGroup.count(); ++i )
876 const DataGroup &dataGroup = mDataPerGroup.at( i );
881 if ( dataGroup.datasetValues.isValid() )
883 std::unique_ptr<QgsRasterBlock> block(
884 QgsMeshUtils::exportRasterBlock( mTriangularMesh, dataGroup.datasetValues, dataGroup.activeFaces, dataGroup.metadata.dataType(), mTransform, pixelSize, extent, &rasterBlockFeedBack )
887 if ( !rasterDataProvider->writeBlock( block.get(), i + 1 ) )
889 throw QgsProcessingException( QObject::tr(
"Could not write raster block: %1" ).arg( rasterDataProvider->error().summary() ) );
891 rasterDataProvider->setNoDataValue( i + 1, block->noDataValue() );
894 rasterDataProvider->setNoDataValue( i + 1, std::numeric_limits<double>::quiet_NaN() );
899 return QVariantMap();
900 feedback->
setProgress( maxProgressDuringBlockWriting * i / mDataPerGroup.count() );
904 rasterDataProvider->setEditable(
false );
907 feedback->
setProgress( maxProgressDuringBlockWriting );
909 if ( feedback && hasReportsDuringClose )
912 if ( !rasterDataProvider->closeWithProgress( scaledFeedback.get() ) )
921 ret[u
"OUTPUT"_s] = fileName;
926QSet<int> QgsMeshRasterizeAlgorithm::supportedDataType()
931QString QgsMeshContoursAlgorithm::name()
const
933 return u
"meshcontours"_s;
936QString QgsMeshContoursAlgorithm::displayName()
const
938 return QObject::tr(
"Export contours" );
941QString QgsMeshContoursAlgorithm::group()
const
943 return QObject::tr(
"Mesh" );
946QString QgsMeshContoursAlgorithm::groupId()
const
951QString QgsMeshContoursAlgorithm::shortHelpString()
const
953 return QObject::tr(
"This algorithm creates contours as a vector layer from a mesh scalar dataset." );
956QString QgsMeshContoursAlgorithm::shortDescription()
const
958 return QObject::tr(
"Creates contours as vector layer from mesh scalar dataset." );
963 return new QgsMeshContoursAlgorithm();
966void QgsMeshContoursAlgorithm::initAlgorithm(
const QVariantMap &configuration )
968 Q_UNUSED( configuration );
981 auto contourLevelList = std::make_unique<QgsProcessingParameterString>( u
"CONTOUR_LEVEL_LIST"_s, QObject::tr(
"List of contours level" ), QVariant(),
false,
true );
982 contourLevelList->setHelp( QObject::tr(
"Comma separated list of values to export. If filled, the increment, minimum and maximum settings are ignored." ) );
983 addParameter( contourLevelList.release() );
985 addParameter(
new QgsProcessingParameterCrs( u
"CRS_OUTPUT"_s, QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
994 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
996 if ( !meshLayer || !meshLayer->
isValid() )
1001 outputCrs = meshLayer->
crs();
1006 mTriangularMesh.update( meshLayer->
nativeMesh(), mTransform );
1012 QString levelsString = parameterAsString( parameters, u
"CONTOUR_LEVEL_LIST"_s, context );
1013 if ( !levelsString.isEmpty() )
1015 QStringList levelStringList = levelsString.split(
',' );
1016 if ( !levelStringList.isEmpty() )
1018 for (
const QString &stringVal : levelStringList )
1021 double val = stringVal.toDouble( &ok );
1023 mLevels.append( val );
1025 throw QgsProcessingException( QObject::tr(
"Invalid format for level values, must be numbers separated with comma" ) );
1027 if ( mLevels.count() >= 2 )
1028 if ( mLevels.last() <= mLevels.at( mLevels.count() - 2 ) )
1029 throw QgsProcessingException( QObject::tr(
"Invalid format for level values, must be different numbers and in increasing order" ) );
1034 if ( mLevels.isEmpty() )
1036 double minimum = parameterAsDouble( parameters, u
"MINIMUM"_s, context );
1037 double maximum = parameterAsDouble( parameters, u
"MAXIMUM"_s, context );
1038 double interval = parameterAsDouble( parameters, u
"INCREMENT"_s, context );
1040 if ( interval <= 0 )
1043 if ( minimum >= maximum )
1044 throw QgsProcessingException( QObject::tr(
"Invalid minimum and maximum values, minimum must be lesser than maximum" ) );
1046 if ( interval > ( maximum - minimum ) )
1047 throw QgsProcessingException( QObject::tr(
"Invalid minimum, maximum and interval values, difference between minimum and maximum must be greater or equal than interval" ) );
1049 int intervalCount = ( maximum - minimum ) / interval;
1051 mLevels.reserve( intervalCount );
1052 for (
int i = 0; i < intervalCount; ++i )
1054 mLevels.append( minimum + i * interval );
1067 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
1068 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
1072 extractDatasetValues( datasetGroups, meshLayer, mNativeMesh, relativeTime, supportedDataType(), mDataPerGroup, feedback );
1083 for ( DataGroup &dataGroup : mDataPerGroup )
1085 if ( dataGroup.dataset3dStakedValue.isValid() )
1086 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
1092 polygonFields.
append(
QgsField( QObject::tr(
"group" ), QMetaType::Type::QString ) );
1093 polygonFields.
append(
QgsField( QObject::tr(
"time" ), QMetaType::Type::QString ) );
1094 polygonFields.
append(
QgsField( QObject::tr(
"min_value" ), QMetaType::Type::Double ) );
1095 polygonFields.
append(
QgsField( QObject::tr(
"max_value" ), QMetaType::Type::Double ) );
1096 lineFields.
append(
QgsField( QObject::tr(
"group" ), QMetaType::Type::QString ) );
1097 lineFields.
append(
QgsField( QObject::tr(
"time" ), QMetaType::Type::QString ) );
1098 lineFields.
append(
QgsField( QObject::tr(
"value" ), QMetaType::Type::Double ) );
1102 QString lineIdentifier;
1103 QString polygonIdentifier;
1104 std::unique_ptr<QgsFeatureSink> sinkPolygons( parameterAsSink( parameters, u
"OUTPUT_POLYGONS"_s, context, polygonIdentifier, polygonFields,
Qgis::WkbType::PolygonZ, outputCrs ) );
1105 std::unique_ptr<QgsFeatureSink> sinkLines( parameterAsSink( parameters, u
"OUTPUT_LINES"_s, context, lineIdentifier, lineFields,
Qgis::WkbType::LineStringZ, outputCrs ) );
1107 if ( !sinkLines || !sinkPolygons )
1108 return QVariantMap();
1111 for (
int i = 0; i < mDataPerGroup.count(); ++i )
1113 DataGroup dataGroup = mDataPerGroup.at( i );
1115 int count = scalarDataOnVertices ? mNativeMesh.vertices.count() : mNativeMesh.faces.count();
1117 QVector<double> values;
1118 if ( dataGroup.datasetValues.isValid() )
1121 values = QgsMeshLayerUtils::calculateMagnitudes( dataGroup.datasetValues );
1125 values = QVector<double>( count, std::numeric_limits<double>::quiet_NaN() );
1128 if ( ( !scalarDataOnVertices ) )
1133 QgsMeshContours contoursExported( mTriangularMesh, mNativeMesh, values, dataGroup.activeFaces );
1136 firstAttributes.append( dataGroup.metadata.name() );
1137 firstAttributes.append( mDateTimeString );
1139 for (
double level : std::as_const( mLevels ) )
1141 QgsGeometry line = contoursExported.exportLines( level, feedback );
1143 return QVariantMap();
1147 lineAttributes.append( level );
1159 for (
int l = 0; l < mLevels.count() - 1; ++l )
1161 QgsGeometry polygon = contoursExported.exportPolygons( mLevels.at( l ), mLevels.at( l + 1 ), feedback );
1163 return QVariantMap();
1168 polygonAttributes.append( mLevels.at( l ) );
1169 polygonAttributes.append( mLevels.at( l + 1 ) );
1174 if ( !sinkPolygons->addFeature( polygonFeature ) )
1186 feedback->
setProgress( 100 * i / mDataPerGroup.count() );
1192 sinkPolygons->finalize();
1197 sinkLines->finalize();
1202 ret[u
"OUTPUT_LINES"_s] = lineIdentifier;
1203 ret[u
"OUTPUT_POLYGONS"_s] = polygonIdentifier;
1208QString QgsMeshExportCrossSection::name()
const
1210 return u
"meshexportcrosssection"_s;
1213QString QgsMeshExportCrossSection::displayName()
const
1215 return QObject::tr(
"Export cross section dataset values on lines from mesh" );
1218QString QgsMeshExportCrossSection::group()
const
1220 return QObject::tr(
"Mesh" );
1223QString QgsMeshExportCrossSection::groupId()
const
1228QString QgsMeshExportCrossSection::shortHelpString()
const
1231 "This algorithm extracts mesh's dataset values from line contained in a vector layer.\n"
1232 "Each line is discretized with a resolution distance parameter for extraction of values on its vertices."
1236QString QgsMeshExportCrossSection::shortDescription()
const
1238 return QObject::tr(
"Extracts a mesh dataset's values from lines contained in a vector layer." );
1243 return new QgsMeshExportCrossSection();
1246void QgsMeshExportCrossSection::initAlgorithm(
const QVariantMap &configuration )
1248 Q_UNUSED( configuration );
1256 QList<int> datatype;
1260 addParameter(
new QgsProcessingParameterDistance( u
"RESOLUTION"_s, QObject::tr(
"Line segmentation resolution" ), 10.0, u
"INPUT_LINES"_s,
false, 0 ) );
1271 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
1273 if ( !meshLayer || !meshLayer->
isValid() )
1276 mMeshLayerCrs = meshLayer->
crs();
1277 mTriangularMesh.update( meshLayer->
nativeMesh() );
1286 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
1287 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
1289 extractDatasetValues( datasetGroups, meshLayer, *meshLayer->
nativeMesh(), relativeTime, supportedDataType(), mDataPerGroup, feedback );
1302 for ( DataGroup &dataGroup : mDataPerGroup )
1304 if ( dataGroup.dataset3dStakedValue.isValid() )
1305 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
1307 double resolution = parameterAsDouble( parameters, u
"RESOLUTION"_s, context );
1308 int datasetDigits = parameterAsInt( parameters, u
"DATASET_DIGITS"_s, context );
1309 int coordDigits = parameterAsInt( parameters, u
"COORDINATES_DIGITS"_s, context );
1311 std::unique_ptr<QgsProcessingFeatureSource> featureSource( parameterAsSource( parameters, u
"INPUT_LINES"_s, context ) );
1312 if ( !featureSource )
1317 QString outputFileName = parameterAsFileOutput( parameters, u
"OUTPUT"_s, context );
1318 QFile file( outputFileName );
1319 if ( !file.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
1322 QTextStream textStream( &file );
1324 header << u
"fid"_s << u
"x"_s << u
"y"_s << QObject::tr(
"offset" );
1325 for (
const DataGroup &datagroup : std::as_const( mDataPerGroup ) )
1326 header << datagroup.metadata.name();
1327 textStream << header.join(
',' ) << u
"\n"_s;
1329 long long featCount = featureSource->featureCount();
1330 long long featCounter = 0;
1344 feedback->
reportError( QObject::tr(
"Could not transform line to mesh CRS" ) );
1350 while ( offset <= line.
length() )
1353 return QVariantMap();
1355 QStringList textLine;
1357 int triangularFaceIndex = mTriangularMesh.faceIndexForPoint_v2( point );
1358 textLine << QString::number( fid ) << QString::number( point.
x(),
'f', coordDigits ) << QString::number( point.
y(),
'f', coordDigits ) << QString::number( offset,
'f', coordDigits );
1359 if ( triangularFaceIndex >= 0 )
1363 int nativeFaceIndex = mTriangularMesh.trianglesToNativeFaces().at( triangularFaceIndex );
1364 for (
int i = 0; i < mDataPerGroup.count(); ++i )
1366 const DataGroup &dataGroup = mDataPerGroup.at( i );
1367 bool faceActive = dataGroup.activeFaces.active( nativeFaceIndex );
1370 QgsMeshDatasetValue value = extractDatasetValue( point, nativeFaceIndex, triangularFaceIndex, mTriangularMesh, dataGroup.activeFaces, dataGroup.datasetValues, dataGroup.metadata );
1372 if ( abs( value.
x() ) == std::numeric_limits<double>::quiet_NaN() )
1373 textLine << QString(
' ' );
1375 textLine << QString::number( value.
scalar(),
'f', datasetDigits );
1379 for (
int i = 0; i < mDataPerGroup.count(); ++i )
1380 textLine << QString(
' ' );
1382 textStream << textLine.join(
',' ) << u
"\n"_s;
1384 offset += resolution;
1389 feedback->
setProgress( 100.0 * featCounter / featCount );
1391 return QVariantMap();
1398 ret[u
"OUTPUT"_s] = outputFileName;
1402QString QgsMeshExportTimeSeries::name()
const
1404 return u
"meshexporttimeseries"_s;
1407QString QgsMeshExportTimeSeries::displayName()
const
1409 return QObject::tr(
"Export time series values from points of a mesh dataset" );
1412QString QgsMeshExportTimeSeries::group()
const
1414 return QObject::tr(
"Mesh" );
1417QString QgsMeshExportTimeSeries::groupId()
const
1422QString QgsMeshExportTimeSeries::shortHelpString()
const
1425 "This algorithm extracts mesh's dataset time series values from points contained in a vector layer.\n"
1426 "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."
1430QString QgsMeshExportTimeSeries::shortDescription()
const
1432 return QObject::tr(
"Extracts a mesh dataset's time series values from points contained in a vector layer." );
1437 return new QgsMeshExportTimeSeries();
1440void QgsMeshExportTimeSeries::initAlgorithm(
const QVariantMap &configuration )
1442 Q_UNUSED( configuration );
1454 QList<int> datatype;
1467 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
1469 if ( !meshLayer || !meshLayer->
isValid() )
1472 mMeshLayerCrs = meshLayer->
crs();
1473 mTriangularMesh.update( meshLayer->
nativeMesh() );
1483 QVariant parameterStartTimeVariant = parameters.value( u
"STARTING_TIME"_s );
1484 QgsInterval relativeStartTime = datasetRelativetime( parameterStartTimeVariant, meshLayer, context );
1486 QVariant parameterEndTimeVariant = parameters.value( u
"FINISHING_TIME"_s );
1487 QgsInterval relativeEndTime = datasetRelativetime( parameterEndTimeVariant, meshLayer, context );
1490 qint64 timeStepInterval = parameterAsDouble( parameters, u
"TIME_STEP"_s, context ) * 1000 * 3600;
1491 if ( timeStepInterval == 0 )
1494 for (
int groupIndex : datasetGroups )
1507 mRelativeTimeSteps.clear();
1508 mTimeStepString.clear();
1509 if ( timeStepInterval != 0 )
1511 mRelativeTimeSteps.append( relativeStartTime.
seconds() * 1000 );
1512 while ( mRelativeTimeSteps.last() < relativeEndTime.
seconds() * 1000 )
1513 mRelativeTimeSteps.append( mRelativeTimeSteps.last() + timeStepInterval );
1515 for ( qint64 relativeTimeStep : std::as_const( mRelativeTimeSteps ) )
1517 mTimeStepString.append( meshLayer->
formatTime( relativeTimeStep / 3600.0 / 1000.0 ) );
1522 for (
int i = 0; i < datasetGroups.count(); ++i )
1524 int groupIndex = datasetGroups.at( i );
1526 if ( supportedDataType().contains( meta.
dataType() ) )
1528 mGroupIndexes.append( groupIndex );
1529 mGroupsMetadata[groupIndex] = meta;
1532 if ( !mRelativeTimeSteps.isEmpty() )
1536 for ( qint64 relativeTimeStep : std::as_const( mRelativeTimeSteps ) )
1538 QMap<int, int> &groupIndexToData = mRelativeTimeToData[relativeTimeStep];
1539 QgsInterval timeStepInterval( relativeTimeStep / 1000.0 );
1541 if ( !datasetIndex.
isValid() )
1543 if ( datasetIndex != lastDatasetIndex )
1545 DataGroup dataGroup;
1546 dataGroup.metadata = meta;
1547 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, valueCount );
1551 dataGroup.dataset3dStakedValue = meshLayer->
dataset3dValues( datasetIndex, 0, valueCount );
1553 mDatasets.append( dataGroup );
1554 lastDatasetIndex = datasetIndex;
1556 groupIndexToData[groupIndex] = mDatasets.count() - 1;
1562 QMap<int, int> &groupIndexToData = mRelativeTimeToData[0];
1564 DataGroup dataGroup;
1565 dataGroup.metadata = meta;
1566 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, valueCount );
1570 dataGroup.dataset3dStakedValue = meshLayer->
dataset3dValues( datasetIndex, 0, valueCount );
1572 mDatasets.append( dataGroup );
1573 groupIndexToData[groupIndex] = mDatasets.
count() - 1;
1578 feedback->
setProgress( 100 * i / datasetGroups.count() );
1594 for ( DataGroup &dataGroup : mDatasets )
1596 if ( dataGroup.dataset3dStakedValue.isValid() )
1597 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
1600 int datasetDigits = parameterAsInt( parameters, u
"DATASET_DIGITS"_s, context );
1601 int coordDigits = parameterAsInt( parameters, u
"COORDINATES_DIGITS"_s, context );
1603 std::unique_ptr<QgsProcessingFeatureSource> featureSource( parameterAsSource( parameters, u
"INPUT_POINTS"_s, context ) );
1604 if ( !featureSource )
1609 QString outputFileName = parameterAsFileOutput( parameters, u
"OUTPUT"_s, context );
1610 QFile file( outputFileName );
1611 if ( !file.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
1614 QTextStream textStream( &file );
1616 header << u
"fid"_s << u
"x"_s << u
"y"_s << QObject::tr(
"time" );
1618 for (
int gi : std::as_const( mGroupIndexes ) )
1619 header << mGroupsMetadata.value( gi ).name();
1621 textStream << header.join(
',' ) << u
"\n"_s;
1623 long long featCount = featureSource->featureCount();
1624 long long featCounter = 0;
1638 feedback->
reportError( QObject::tr(
"Could not transform line to mesh CRS" ) );
1645 int triangularFaceIndex = mTriangularMesh.faceIndexForPoint_v2( point );
1647 if ( triangularFaceIndex >= 0 )
1649 int nativeFaceIndex = mTriangularMesh.trianglesToNativeFaces().at( triangularFaceIndex );
1650 if ( !mRelativeTimeSteps.isEmpty() )
1652 for (
int timeIndex = 0; timeIndex < mRelativeTimeSteps.count(); ++timeIndex )
1654 qint64 timeStep = mRelativeTimeSteps.at( timeIndex );
1655 QStringList textLine;
1656 textLine << QString::number( fid ) << QString::number( point.
x(),
'f', coordDigits ) << QString::number( point.
y(),
'f', coordDigits ) << mTimeStepString.at( timeIndex );
1658 if ( mRelativeTimeToData.contains( timeStep ) )
1660 const QMap<int, int> &groupToData = mRelativeTimeToData.value( timeStep );
1661 for (
int groupIndex : std::as_const( mGroupIndexes ) )
1663 if ( !groupToData.contains( groupIndex ) )
1665 int dataIndex = groupToData.value( groupIndex );
1666 if ( dataIndex < 0 || dataIndex > mDatasets.count() - 1 )
1669 const DataGroup &dataGroup = mDatasets.at( dataIndex );
1670 QgsMeshDatasetValue value = extractDatasetValue( point, nativeFaceIndex, triangularFaceIndex, mTriangularMesh, dataGroup.activeFaces, dataGroup.datasetValues, dataGroup.metadata );
1671 if ( abs( value.
x() ) == std::numeric_limits<double>::quiet_NaN() )
1672 textLine << QString(
' ' );
1674 textLine << QString::number( value.
scalar(),
'f', datasetDigits );
1677 textStream << textLine.join(
',' ) << u
"\n"_s;
1682 QStringList textLine;
1683 textLine << QString::number( fid ) << QString::number( point.
x(),
'f', coordDigits ) << QString::number( point.
y(),
'f', coordDigits ) << QObject::tr(
"static dataset" );
1684 const QMap<int, int> &groupToData = mRelativeTimeToData.value( 0 );
1685 for (
int groupIndex : std::as_const( mGroupIndexes ) )
1687 if ( !groupToData.contains( groupIndex ) )
1689 int dataIndex = groupToData.value( groupIndex );
1690 if ( dataIndex < 0 || dataIndex > mDatasets.count() - 1 )
1692 const DataGroup &dataGroup = mDatasets.at( dataIndex );
1693 QgsMeshDatasetValue value = extractDatasetValue( point, nativeFaceIndex, triangularFaceIndex, mTriangularMesh, dataGroup.activeFaces, dataGroup.datasetValues, dataGroup.metadata );
1694 if ( abs( value.
x() ) == std::numeric_limits<double>::quiet_NaN() )
1695 textLine << QString(
' ' );
1697 textLine << QString::number( value.
scalar(),
'f', datasetDigits );
1699 textStream << textLine.join(
',' ) << u
"\n"_s;
1705 feedback->
setProgress( 100.0 * featCounter / featCount );
1707 return QVariantMap();
1714 ret[u
"OUTPUT"_s] = outputFileName;
@ VectorPoint
Vector point layers.
@ VectorPolygon
Vector polygon layers.
@ VectorLine
Vector line layers.
@ Float64
Sixty four bit floating point (double).
@ LineStringZ
LineStringZ.
@ Hidden
Parameter is hidden and should not be shown to users.
@ Advanced
Parameter is an advanced parameter which should be hidden from users by default.
@ Double
Double/float values.
Represents a coordinate reference system (CRS).
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
Custom exception class for Coordinate Reference System related exceptions.
Wrapper for iterator of features from vector data provider or vector layer.
bool nextFeature(QgsFeature &f)
Fetch next feature and stores in f, returns true on success.
@ FastInsert
Use faster inserts, at the cost of updating the passed features to reflect changes made at the provid...
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
void setAttributes(const QgsAttributes &attrs)
Sets the feature's attributes.
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
bool isCanceled() const
Tells whether the operation has been canceled already.
void canceled()
Internal routines can connect to this signal if they use event loop.
void cancel()
Tells the internal routines that the current operation should be canceled. This should be run by the ...
void setProgress(double progress)
Sets the current progress for the feedback object.
static std::unique_ptr< QgsFeedback > createScaledFeedback(QgsFeedback *parentFeedback, double startPercentage, double endPercentage)
Returns a feedback object whose [0, 100] progression range will be mapped to parentFeedback [startPer...
Encapsulate a field in an attribute table or data source.
Container of fields for a vector layer.
bool append(const QgsField &field, Qgis::FieldOrigin origin=Qgis::FieldOrigin::Provider, int originIndex=-1)
Appends a field.
A geometry is the spatial representation of a feature.
double length() const
Returns the planar, 2-dimensional length of geometry.
Qgis::GeometryOperationResult transform(const QgsCoordinateTransform &ct, Qgis::TransformDirection direction=Qgis::TransformDirection::Forward, bool transformZ=false)
Transforms this geometry as described by the coordinate transform ct.
QgsGeometry interpolate(double distance) const
Returns an interpolated point on the geometry at the specified distance.
QgsPointXY asPoint() const
Returns the contents of the geometry as a 2-dimensional point.
bool isEmpty() const
Returns true if the geometry is empty (eg a linestring with no vertices, or a collection with no geom...
A representation of the interval between two datetime values.
double seconds() const
Returns the interval duration in seconds.
double hours() const
Returns the interval duration in hours.
Line string geometry type, with support for z-dimension and m-values.
QgsCoordinateReferenceSystem crs
Abstract class for interpolating 3d stacked mesh data to 2d data.
QgsMeshDataBlock calculate(const QgsMesh3DDataBlock &block3d, QgsFeedback *feedback=nullptr) const
Calculated 2d block values from 3d stacked mesh values.
Exporter of contours lines or polygons from a mesh layer.
A block of integers/doubles from a mesh dataset.
QgsMeshDatasetValue value(int index) const
Returns a value represented by the index For active flag the behavior is undefined.
bool active(int index) const
Returns a value for active flag by the index For scalar and vector 2d the behavior is undefined.
int count() const
Number of items stored in the block.
An index that identifies the dataset group (e.g.
bool isValid() const
Returns whether index is valid, ie at least groups is set.
Represents a single mesh dataset value.
double y() const
Returns y value.
double scalar() const
Returns magnitude of vector for vector data or scalar value for scalar data.
double x() const
Returns x value.
Implementation of map layer temporal properties for mesh layers.
QDateTime referenceTime() const
Returns the reference time.
Represents a mesh layer supporting display of data on structured or unstructured meshes.
int datasetCount(const QgsMeshDatasetIndex &index) const
Returns the dataset count in the dataset groups.
QgsMeshRendererSettings rendererSettings() const
Returns renderer settings.
void updateTriangularMesh(const QgsCoordinateTransform &transform=QgsCoordinateTransform())
Gets native mesh and updates (creates if it doesn't exist) the base triangular mesh.
QgsMesh * nativeMesh()
Returns native mesh (nullptr before rendering or calling to updateMesh).
QgsMeshDatasetIndex datasetIndexAtRelativeTime(const QgsInterval &relativeTime, int datasetGroupIndex) const
Returns dataset index from datasets group depending on the relative time from the layer reference tim...
QgsMeshDataBlock datasetValues(const QgsMeshDatasetIndex &index, int valueIndex, int count) const
Returns N vector/scalar values from the index from the dataset.
bool isEditable() const override
Returns true if the layer can be edited.
QgsMeshDataBlock areFacesActive(const QgsMeshDatasetIndex &index, int faceIndex, int count) const
Returns whether the faces are active for particular dataset.
QgsInterval datasetRelativeTime(const QgsMeshDatasetIndex &index)
Returns the relative time of the dataset from the reference time of its group.
QgsMapLayerTemporalProperties * temporalProperties() override
Returns the layer's temporal properties.
qint64 datasetRelativeTimeInMilliseconds(const QgsMeshDatasetIndex &index)
Returns the relative time (in milliseconds) of the dataset from the reference time of its group.
QgsMesh3DDataBlock dataset3dValues(const QgsMeshDatasetIndex &index, int faceIndex, int count) const
Returns N vector/scalar values from the face index from the dataset for 3d stacked meshes.
QString formatTime(double hours)
Returns (date) time in hours formatted to human readable form.
QgsMeshDatasetGroupMetadata datasetGroupMetadata(const QgsMeshDatasetIndex &index) const
Returns the dataset groups metadata.
@ NeighbourAverage
Does a simple average of values defined for all surrounding faces/vertices.
static QgsRasterBlock * exportRasterBlock(const QgsMeshLayer &layer, const QgsMeshDatasetIndex &datasetIndex, const QgsCoordinateReferenceSystem &destinationCrs, const QgsCoordinateTransformContext &transformContext, double mapUnitsPerPixel, const QgsRectangle &extent, QgsRasterBlockFeedback *feedback=nullptr)
Exports mesh layer's dataset values as raster block.
Point geometry type, with support for z-dimension and m-values.
Abstract base class for processing algorithms.
Contains information about the context in which a processing algorithm is executed.
QgsDateTimeRange currentTimeRange() const
Returns the current time range to use for temporal operations.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context.
Custom exception class for processing related exceptions.
Base class for providing feedback from a processing algorithm.
void featureAddedToSink(const QString &output)
Reports that a feature was added to the the sink associated with the specified algorithm output.
void featureSinkFinalized(const QString &output)
Reports that a feature sink has been finalized.
virtual void reportError(const QString &error, bool fatalError=false)
Reports that the algorithm encountered an error while executing.
virtual void setProgressText(const QString &text)
Sets a progress report text string.
A coordinate reference system parameter for processing algorithms.
A double numeric parameter for distance values.
An enum based parameter for processing algorithms, allowing for selection from predefined values.
A rectangular map extent parameter for processing algorithms.
A feature sink output for processing algorithms.
An input feature source (such as vector layers) parameter for processing algorithms.
A generic file based destination parameter, for specifying the destination path for a file (non-map l...
A parameter for processing algorithms that need a list of mesh dataset groups.
static QList< int > valueAsDatasetGroup(const QVariant &value)
Returns the value as a list if dataset group indexes.
A parameter for processing algorithms that need a list of mesh dataset index from time parameter.
static QString valueAsTimeType(const QVariant &value)
Returns the dataset value time type as a string : current-context-time : the time is store in the pro...
static QgsMeshDatasetIndex timeValueAsDatasetIndex(const QVariant &value)
Returns the value as a QgsMeshDatasetIndex if the value has "dataset-time-step" type.
static QDateTime timeValueAsDefinedDateTime(const QVariant &value)
Returns the value as a QDateTime if the value has "defined-date-time" type.
A mesh layer parameter for processing algorithms.
A numeric parameter for processing algorithms.
A raster layer destination parameter, for specifying the destination path for a raster layer created ...
Feedback object tailored for raster block reading.
The raster file writer which allows you to save a raster to a new file.
A rectangle specified with double values.
T begin() const
Returns the beginning of the range.
A triangular/derived mesh with vertices in map coordinates.
const QVector< QgsMeshFace > & triangles() const
Returns triangles.
const QVector< QgsMeshVertex > & vertices() const
Returns vertices in map coordinate system.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference).
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
QVector< int > QgsMeshFace
List of vertex indexes.
QPair< int, int > QgsMeshEdge
Edge is a straight line seqment between 2 points.
Mesh - vertices, edges and faces.
QVector< QgsMeshVertex > vertices
void clear()
Remove all vertices, edges and faces.
int faceCount() const
Returns number of faces.