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" ) );
378 return QVariantMap();
386 ret[u
"OUTPUT"_s] = identifier;
391QString QgsExportMeshFacesAlgorithm::shortHelpString()
const
393 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." );
396QString QgsExportMeshFacesAlgorithm::shortDescription()
const
398 return QObject::tr(
"Exports mesh faces to a polygon vector layer." );
401QString QgsExportMeshFacesAlgorithm::name()
const
403 return u
"exportmeshfaces"_s;
406QString QgsExportMeshFacesAlgorithm::displayName()
const
408 return QObject::tr(
"Export mesh faces" );
413 return new QgsExportMeshFacesAlgorithm();
416QgsGeometry QgsExportMeshFacesAlgorithm::meshElement(
int index )
const
418 const QgsMeshFace &face = mNativeMesh.face( index );
419 QVector<QgsPoint> vertices( face.size() );
420 for (
int i = 0; i < face.size(); ++i )
421 vertices[i] = mNativeMesh.vertex( face.at( i ) );
422 auto polygon = std::make_unique<QgsPolygon>();
427QString QgsExportMeshEdgesAlgorithm::shortHelpString()
const
429 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." );
432QString QgsExportMeshEdgesAlgorithm::shortDescription()
const
434 return QObject::tr(
"Exports mesh edges to a line vector layer." );
437QString QgsExportMeshEdgesAlgorithm::name()
const
439 return u
"exportmeshedges"_s;
442QString QgsExportMeshEdgesAlgorithm::displayName()
const
444 return QObject::tr(
"Export mesh edges" );
449 return new QgsExportMeshEdgesAlgorithm();
452QgsGeometry QgsExportMeshEdgesAlgorithm::meshElement(
int index )
const
454 const QgsMeshEdge &edge = mNativeMesh.edge( index );
455 QVector<QgsPoint> vertices( 2 );
456 vertices[0] = mNativeMesh.vertex( edge.first );
457 vertices[1] = mNativeMesh.vertex( edge.second );
462QString QgsExportMeshOnGridAlgorithm::name()
const
464 return u
"exportmeshongrid"_s;
467QString QgsExportMeshOnGridAlgorithm::displayName()
const
469 return QObject::tr(
"Export mesh on grid" );
472QString QgsExportMeshOnGridAlgorithm::group()
const
474 return QObject::tr(
"Mesh" );
477QString QgsExportMeshOnGridAlgorithm::groupId()
const
482QString QgsExportMeshOnGridAlgorithm::shortHelpString()
const
485 "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"
486 "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 "
488 "1D meshes are not supported."
492QString QgsExportMeshOnGridAlgorithm::shortDescription()
const
494 return QObject::tr(
"Exports mesh dataset values to a gridded point vector layer." );
499 return new QgsExportMeshOnGridAlgorithm();
502void QgsExportMeshOnGridAlgorithm::initAlgorithm(
const QVariantMap &configuration )
504 Q_UNUSED( configuration );
516 addParameter(
new QgsProcessingParameterCrs( u
"CRS_OUTPUT"_s, QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
518 QStringList exportVectorOptions;
519 exportVectorOptions << QObject::tr(
"Cartesian (x,y)" ) << QObject::tr(
"Polar (magnitude,degree)" ) << QObject::tr(
"Cartesian and Polar" );
520 addParameter(
new QgsProcessingParameterEnum( u
"VECTOR_OPTION"_s, QObject::tr(
"Export vector option" ), exportVectorOptions,
false, 0 ) );
524static void extractDatasetValues(
525 const QList<int> &datasetGroups,
529 const QSet<int> supportedDataType,
530 QList<DataGroup> &datasetPerGroup,
534 for (
int i = 0; i < datasetGroups.count(); ++i )
536 int groupIndex = datasetGroups.at( i );
541 if ( supportedDataType.contains( dataGroup.metadata.dataType() ) )
544 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, valueCount );
548 dataGroup.dataset3dStakedValue = meshLayer->
dataset3dValues( datasetIndex, 0, valueCount );
550 datasetPerGroup.append( dataGroup );
553 feedback->
setProgress( 100 * i / datasetGroups.count() );
559 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
561 if ( !meshLayer || !meshLayer->
isValid() )
566 outputCrs = meshLayer->
crs();
581 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
582 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
584 extractDatasetValues( datasetGroups, meshLayer, nativeMesh, relativeTime, supportedDataType(), mDataPerGroup, feedback );
585 mTriangularMesh.update( meshLayer->
nativeMesh(), mTransform );
587 mExportVectorOption = parameterAsInt( parameters, u
"VECTOR_OPTION"_s, context );
597 return QVariantMap();
599 feedback->
setProgressText( QObject::tr(
"Creating output vector layer" ) );
604 for ( DataGroup &dataGroup : mDataPerGroup )
606 if ( dataGroup.dataset3dStakedValue.isValid() )
607 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
610 QList<QgsMeshDatasetGroupMetadata> metaList;
611 metaList.reserve( mDataPerGroup.size() );
612 for (
const DataGroup &dataGroup : std::as_const( mDataPerGroup ) )
613 metaList.append( dataGroup.metadata );
614 QgsFields fields = createFields( metaList, mExportVectorOption );
619 std::unique_ptr<QgsFeatureSink> sink( parameterAsSink( parameters, u
"OUTPUT"_s, context, identifier, fields,
Qgis::WkbType::Point, outputCrs ) );
621 return QVariantMap();
626 return QVariantMap();
632 const double gridSpacing = parameterAsDouble( parameters, u
"GRID_SPACING"_s, context );
638 QgsRectangle extent = parameterAsExtent( parameters, u
"EXTENT"_s, context );
640 extent = mTriangularMesh.extent();
641 int pointXCount = int( extent.
width() / gridSpacing ) + 1;
642 int pointYCount = int( extent.
height() / gridSpacing ) + 1;
644 for (
int ix = 0; ix < pointXCount; ++ix )
646 for (
int iy = 0; iy < pointYCount; ++iy )
649 int triangularFaceIndex = mTriangularMesh.faceIndexForPoint_v2( point );
650 if ( triangularFaceIndex >= 0 )
654 int nativeFaceIndex = mTriangularMesh.trianglesToNativeFaces().at( triangularFaceIndex );
655 for (
int i = 0; i < mDataPerGroup.count(); ++i )
657 const DataGroup &dataGroup = mDataPerGroup.at( i );
658 bool faceActive = dataGroup.activeFaces.active( nativeFaceIndex );
661 QgsMeshDatasetValue value = extractDatasetValue( point, nativeFaceIndex, triangularFaceIndex, mTriangularMesh, dataGroup.activeFaces, dataGroup.datasetValues, dataGroup.metadata );
663 if ( dataGroup.metadata.isVector() )
665 QVector<double> vector = vectorValue( dataGroup.datasetValues.value( i ), mExportVectorOption );
666 for (
double v : vector )
668 attributes.append( v );
672 attributes.append( value.
scalar() );
683 feedback->
reportError( QObject::tr(
"Could not transform point to destination CRS" ) );
699 ret[u
"OUTPUT"_s] = identifier;
704QSet<int> QgsExportMeshOnGridAlgorithm::supportedDataType()
709QString QgsMeshRasterizeAlgorithm::name()
const
711 return u
"meshrasterize"_s;
714QString QgsMeshRasterizeAlgorithm::displayName()
const
716 return QObject::tr(
"Rasterize mesh dataset" );
719QString QgsMeshRasterizeAlgorithm::group()
const
721 return QObject::tr(
"Mesh" );
724QString QgsMeshRasterizeAlgorithm::groupId()
const
729QString QgsMeshRasterizeAlgorithm::shortHelpString()
const
732 "This algorithm creates a raster layer from a mesh dataset.\n"
733 "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 "
735 "1D meshes are not supported."
739QString QgsMeshRasterizeAlgorithm::shortDescription()
const
741 return QObject::tr(
"Creates a raster layer from a mesh dataset." );
746 return new QgsMeshRasterizeAlgorithm();
749void QgsMeshRasterizeAlgorithm::initAlgorithm(
const QVariantMap &configuration )
751 Q_UNUSED( configuration );
761 addParameter(
new QgsProcessingParameterCrs( u
"CRS_OUTPUT"_s, QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
765 auto createOptsParam = std::make_unique<QgsProcessingParameterString>( u
"CREATE_OPTIONS"_s, QObject::tr(
"Creation options" ), QVariant(),
false,
true );
766 createOptsParam->setMetadata( QVariantMap( { { u
"widget_wrapper"_s, QVariantMap( { { u
"widget_type"_s, u
"rasteroptions"_s } } ) } } ) );
768 addParameter( createOptsParam.release() );
770 auto creationOptsParam = std::make_unique<QgsProcessingParameterString>( u
"CREATION_OPTIONS"_s, QObject::tr(
"Creation options" ), QVariant(),
false,
true );
771 creationOptsParam->setMetadata( QVariantMap( { { u
"widget_wrapper"_s, QVariantMap( { { u
"widget_type"_s, u
"rasteroptions"_s } } ) } } ) );
773 addParameter( creationOptsParam.release() );
780 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
782 if ( !meshLayer || !meshLayer->
isValid() )
787 outputCrs = meshLayer->
crs();
792 mTriangularMesh.update( meshLayer->
nativeMesh(), mTransform );
802 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
803 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
805 extractDatasetValues( datasetGroups, meshLayer, *meshLayer->
nativeMesh(), relativeTime, supportedDataType(), mDataPerGroup, feedback );
817 return QVariantMap();
824 for ( DataGroup &dataGroup : mDataPerGroup )
826 if ( dataGroup.dataset3dStakedValue.isValid() )
827 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
831 const double pixelSize = parameterAsDouble( parameters, u
"PIXEL_SIZE"_s, context );
837 QgsRectangle extent = parameterAsExtent( parameters, u
"EXTENT"_s, context );
839 extent = mTriangularMesh.extent();
841 int width = extent.
width() / pixelSize;
842 int height = extent.
height() / pixelSize;
844 QString creationOptions = parameterAsString( parameters, u
"CREATION_OPTIONS"_s, context ).trimmed();
846 const QString optionsString = parameterAsString( parameters, u
"CREATE_OPTIONS"_s, context );
847 if ( !optionsString.isEmpty() )
848 creationOptions = optionsString;
850 const QString fileName = parameterAsOutputLayer( parameters, u
"OUTPUT"_s, context );
851 const QString outputFormat = parameterAsOutputRasterFormat( parameters, u
"OUTPUT"_s, context );
853 rasterFileWriter.setOutputProviderKey( u
"gdal"_s );
854 if ( !creationOptions.isEmpty() )
856 rasterFileWriter.setCreationOptions( creationOptions.split(
'|' ) );
858 rasterFileWriter.setOutputFormat( outputFormat );
860 std::unique_ptr<QgsRasterDataProvider> rasterDataProvider( rasterFileWriter.createMultiBandRaster(
Qgis::DataType::Float64, width, height, extent, mTransform.destinationCrs(), mDataPerGroup.count() ) );
861 rasterDataProvider->setEditable(
true );
863 const bool hasReportsDuringClose = rasterDataProvider->hasReportsDuringClose();
864 const double maxProgressDuringBlockWriting = hasReportsDuringClose ? 50.0 : 100.0;
866 for (
int i = 0; i < mDataPerGroup.count(); ++i )
868 const DataGroup &dataGroup = mDataPerGroup.at( i );
873 if ( dataGroup.datasetValues.isValid() )
875 std::unique_ptr<QgsRasterBlock> block(
876 QgsMeshUtils::exportRasterBlock( mTriangularMesh, dataGroup.datasetValues, dataGroup.activeFaces, dataGroup.metadata.dataType(), mTransform, pixelSize, extent, &rasterBlockFeedBack )
879 if ( !rasterDataProvider->writeBlock( block.get(), i + 1 ) )
881 throw QgsProcessingException( QObject::tr(
"Could not write raster block: %1" ).arg( rasterDataProvider->error().summary() ) );
883 rasterDataProvider->setNoDataValue( i + 1, block->noDataValue() );
886 rasterDataProvider->setNoDataValue( i + 1, std::numeric_limits<double>::quiet_NaN() );
891 return QVariantMap();
892 feedback->
setProgress( maxProgressDuringBlockWriting * i / mDataPerGroup.count() );
896 rasterDataProvider->setEditable(
false );
899 feedback->
setProgress( maxProgressDuringBlockWriting );
901 if ( feedback && hasReportsDuringClose )
904 if ( !rasterDataProvider->closeWithProgress( scaledFeedback.get() ) )
913 ret[u
"OUTPUT"_s] = fileName;
918QSet<int> QgsMeshRasterizeAlgorithm::supportedDataType()
923QString QgsMeshContoursAlgorithm::name()
const
925 return u
"meshcontours"_s;
928QString QgsMeshContoursAlgorithm::displayName()
const
930 return QObject::tr(
"Export contours" );
933QString QgsMeshContoursAlgorithm::group()
const
935 return QObject::tr(
"Mesh" );
938QString QgsMeshContoursAlgorithm::groupId()
const
943QString QgsMeshContoursAlgorithm::shortHelpString()
const
945 return QObject::tr(
"This algorithm creates contours as a vector layer from a mesh scalar dataset." );
948QString QgsMeshContoursAlgorithm::shortDescription()
const
950 return QObject::tr(
"Creates contours as vector layer from mesh scalar dataset." );
955 return new QgsMeshContoursAlgorithm();
958void QgsMeshContoursAlgorithm::initAlgorithm(
const QVariantMap &configuration )
960 Q_UNUSED( configuration );
973 auto contourLevelList = std::make_unique<QgsProcessingParameterString>( u
"CONTOUR_LEVEL_LIST"_s, QObject::tr(
"List of contours level" ), QVariant(),
false,
true );
974 contourLevelList->setHelp( QObject::tr(
"Comma separated list of values to export. If filled, the increment, minimum and maximum settings are ignored." ) );
975 addParameter( contourLevelList.release() );
977 addParameter(
new QgsProcessingParameterCrs( u
"CRS_OUTPUT"_s, QObject::tr(
"Output coordinate system" ), QVariant(),
true ) );
986 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
988 if ( !meshLayer || !meshLayer->
isValid() )
993 outputCrs = meshLayer->
crs();
998 mTriangularMesh.update( meshLayer->
nativeMesh(), mTransform );
1004 QString levelsString = parameterAsString( parameters, u
"CONTOUR_LEVEL_LIST"_s, context );
1005 if ( !levelsString.isEmpty() )
1007 QStringList levelStringList = levelsString.split(
',' );
1008 if ( !levelStringList.isEmpty() )
1010 for (
const QString &stringVal : levelStringList )
1013 double val = stringVal.toDouble( &ok );
1015 mLevels.append( val );
1017 throw QgsProcessingException( QObject::tr(
"Invalid format for level values, must be numbers separated with comma" ) );
1019 if ( mLevels.count() >= 2 )
1020 if ( mLevels.last() <= mLevels.at( mLevels.count() - 2 ) )
1021 throw QgsProcessingException( QObject::tr(
"Invalid format for level values, must be different numbers and in increasing order" ) );
1026 if ( mLevels.isEmpty() )
1028 double minimum = parameterAsDouble( parameters, u
"MINIMUM"_s, context );
1029 double maximum = parameterAsDouble( parameters, u
"MAXIMUM"_s, context );
1030 double interval = parameterAsDouble( parameters, u
"INCREMENT"_s, context );
1032 if ( interval <= 0 )
1035 if ( minimum >= maximum )
1036 throw QgsProcessingException( QObject::tr(
"Invalid minimum and maximum values, minimum must be lesser than maximum" ) );
1038 if ( interval > ( maximum - minimum ) )
1039 throw QgsProcessingException( QObject::tr(
"Invalid minimum, maximum and interval values, difference between minimum and maximum must be greater or equal than interval" ) );
1041 int intervalCount = ( maximum - minimum ) / interval;
1043 mLevels.reserve( intervalCount );
1044 for (
int i = 0; i < intervalCount; ++i )
1046 mLevels.append( minimum + i * interval );
1059 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
1060 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
1064 extractDatasetValues( datasetGroups, meshLayer, mNativeMesh, relativeTime, supportedDataType(), mDataPerGroup, feedback );
1075 for ( DataGroup &dataGroup : mDataPerGroup )
1077 if ( dataGroup.dataset3dStakedValue.isValid() )
1078 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
1084 polygonFields.
append(
QgsField( QObject::tr(
"group" ), QMetaType::Type::QString ) );
1085 polygonFields.
append(
QgsField( QObject::tr(
"time" ), QMetaType::Type::QString ) );
1086 polygonFields.
append(
QgsField( QObject::tr(
"min_value" ), QMetaType::Type::Double ) );
1087 polygonFields.
append(
QgsField( QObject::tr(
"max_value" ), QMetaType::Type::Double ) );
1088 lineFields.
append(
QgsField( QObject::tr(
"group" ), QMetaType::Type::QString ) );
1089 lineFields.
append(
QgsField( QObject::tr(
"time" ), QMetaType::Type::QString ) );
1090 lineFields.
append(
QgsField( QObject::tr(
"value" ), QMetaType::Type::Double ) );
1094 QString lineIdentifier;
1095 QString polygonIdentifier;
1096 std::unique_ptr<QgsFeatureSink> sinkPolygons( parameterAsSink( parameters, u
"OUTPUT_POLYGONS"_s, context, polygonIdentifier, polygonFields,
Qgis::WkbType::PolygonZ, outputCrs ) );
1097 std::unique_ptr<QgsFeatureSink> sinkLines( parameterAsSink( parameters, u
"OUTPUT_LINES"_s, context, lineIdentifier, lineFields,
Qgis::WkbType::LineStringZ, outputCrs ) );
1099 if ( !sinkLines || !sinkPolygons )
1100 return QVariantMap();
1103 for (
int i = 0; i < mDataPerGroup.count(); ++i )
1105 DataGroup dataGroup = mDataPerGroup.at( i );
1107 int count = scalarDataOnVertices ? mNativeMesh.vertices.count() : mNativeMesh.faces.count();
1109 QVector<double> values;
1110 if ( dataGroup.datasetValues.isValid() )
1113 values = QgsMeshLayerUtils::calculateMagnitudes( dataGroup.datasetValues );
1117 values = QVector<double>( count, std::numeric_limits<double>::quiet_NaN() );
1120 if ( ( !scalarDataOnVertices ) )
1125 QgsMeshContours contoursExported( mTriangularMesh, mNativeMesh, values, dataGroup.activeFaces );
1128 firstAttributes.append( dataGroup.metadata.name() );
1129 firstAttributes.append( mDateTimeString );
1131 for (
double level : std::as_const( mLevels ) )
1133 QgsGeometry line = contoursExported.exportLines( level, feedback );
1135 return QVariantMap();
1139 lineAttributes.append( level );
1149 for (
int l = 0; l < mLevels.count() - 1; ++l )
1151 QgsGeometry polygon = contoursExported.exportPolygons( mLevels.at( l ), mLevels.at( l + 1 ), feedback );
1153 return QVariantMap();
1158 polygonAttributes.append( mLevels.at( l ) );
1159 polygonAttributes.append( mLevels.at( l + 1 ) );
1164 sinkPolygons->addFeature( polygonFeature );
1169 feedback->
setProgress( 100 * i / mDataPerGroup.count() );
1174 sinkPolygons->finalize();
1176 sinkLines->finalize();
1179 ret[u
"OUTPUT_LINES"_s] = lineIdentifier;
1180 ret[u
"OUTPUT_POLYGONS"_s] = polygonIdentifier;
1185QString QgsMeshExportCrossSection::name()
const
1187 return u
"meshexportcrosssection"_s;
1190QString QgsMeshExportCrossSection::displayName()
const
1192 return QObject::tr(
"Export cross section dataset values on lines from mesh" );
1195QString QgsMeshExportCrossSection::group()
const
1197 return QObject::tr(
"Mesh" );
1200QString QgsMeshExportCrossSection::groupId()
const
1205QString QgsMeshExportCrossSection::shortHelpString()
const
1208 "This algorithm extracts mesh's dataset values from line contained in a vector layer.\n"
1209 "Each line is discretized with a resolution distance parameter for extraction of values on its vertices."
1213QString QgsMeshExportCrossSection::shortDescription()
const
1215 return QObject::tr(
"Extracts a mesh dataset's values from lines contained in a vector layer." );
1220 return new QgsMeshExportCrossSection();
1223void QgsMeshExportCrossSection::initAlgorithm(
const QVariantMap &configuration )
1225 Q_UNUSED( configuration );
1233 QList<int> datatype;
1237 addParameter(
new QgsProcessingParameterDistance( u
"RESOLUTION"_s, QObject::tr(
"Line segmentation resolution" ), 10.0, u
"INPUT_LINES"_s,
false, 0 ) );
1248 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
1250 if ( !meshLayer || !meshLayer->
isValid() )
1253 mMeshLayerCrs = meshLayer->
crs();
1254 mTriangularMesh.update( meshLayer->
nativeMesh() );
1263 QVariant parameterTimeVariant = parameters.value( u
"DATASET_TIME"_s );
1264 QgsInterval relativeTime = datasetRelativetime( parameterTimeVariant, meshLayer, context );
1266 extractDatasetValues( datasetGroups, meshLayer, *meshLayer->
nativeMesh(), relativeTime, supportedDataType(), mDataPerGroup, feedback );
1279 for ( DataGroup &dataGroup : mDataPerGroup )
1281 if ( dataGroup.dataset3dStakedValue.isValid() )
1282 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
1284 double resolution = parameterAsDouble( parameters, u
"RESOLUTION"_s, context );
1285 int datasetDigits = parameterAsInt( parameters, u
"DATASET_DIGITS"_s, context );
1286 int coordDigits = parameterAsInt( parameters, u
"COORDINATES_DIGITS"_s, context );
1288 std::unique_ptr<QgsProcessingFeatureSource> featureSource( parameterAsSource( parameters, u
"INPUT_LINES"_s, context ) );
1289 if ( !featureSource )
1294 QString outputFileName = parameterAsFileOutput( parameters, u
"OUTPUT"_s, context );
1295 QFile file( outputFileName );
1296 if ( !file.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
1299 QTextStream textStream( &file );
1301 header << u
"fid"_s << u
"x"_s << u
"y"_s << QObject::tr(
"offset" );
1302 for (
const DataGroup &datagroup : std::as_const( mDataPerGroup ) )
1303 header << datagroup.metadata.name();
1304 textStream << header.join(
',' ) << u
"\n"_s;
1306 long long featCount = featureSource->featureCount();
1307 long long featCounter = 0;
1321 feedback->
reportError( QObject::tr(
"Could not transform line to mesh CRS" ) );
1327 while ( offset <= line.
length() )
1330 return QVariantMap();
1332 QStringList textLine;
1334 int triangularFaceIndex = mTriangularMesh.faceIndexForPoint_v2( point );
1335 textLine << QString::number( fid ) << QString::number( point.
x(),
'f', coordDigits ) << QString::number( point.
y(),
'f', coordDigits ) << QString::number( offset,
'f', coordDigits );
1336 if ( triangularFaceIndex >= 0 )
1340 int nativeFaceIndex = mTriangularMesh.trianglesToNativeFaces().at( triangularFaceIndex );
1341 for (
int i = 0; i < mDataPerGroup.count(); ++i )
1343 const DataGroup &dataGroup = mDataPerGroup.at( i );
1344 bool faceActive = dataGroup.activeFaces.active( nativeFaceIndex );
1347 QgsMeshDatasetValue value = extractDatasetValue( point, nativeFaceIndex, triangularFaceIndex, mTriangularMesh, dataGroup.activeFaces, dataGroup.datasetValues, dataGroup.metadata );
1349 if ( abs( value.
x() ) == std::numeric_limits<double>::quiet_NaN() )
1350 textLine << QString(
' ' );
1352 textLine << QString::number( value.
scalar(),
'f', datasetDigits );
1356 for (
int i = 0; i < mDataPerGroup.count(); ++i )
1357 textLine << QString(
' ' );
1359 textStream << textLine.join(
',' ) << u
"\n"_s;
1361 offset += resolution;
1366 feedback->
setProgress( 100.0 * featCounter / featCount );
1368 return QVariantMap();
1375 ret[u
"OUTPUT"_s] = outputFileName;
1379QString QgsMeshExportTimeSeries::name()
const
1381 return u
"meshexporttimeseries"_s;
1384QString QgsMeshExportTimeSeries::displayName()
const
1386 return QObject::tr(
"Export time series values from points of a mesh dataset" );
1389QString QgsMeshExportTimeSeries::group()
const
1391 return QObject::tr(
"Mesh" );
1394QString QgsMeshExportTimeSeries::groupId()
const
1399QString QgsMeshExportTimeSeries::shortHelpString()
const
1402 "This algorithm extracts mesh's dataset time series values from points contained in a vector layer.\n"
1403 "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."
1407QString QgsMeshExportTimeSeries::shortDescription()
const
1409 return QObject::tr(
"Extracts a mesh dataset's time series values from points contained in a vector layer." );
1414 return new QgsMeshExportTimeSeries();
1417void QgsMeshExportTimeSeries::initAlgorithm(
const QVariantMap &configuration )
1419 Q_UNUSED( configuration );
1431 QList<int> datatype;
1444 QgsMeshLayer *meshLayer = parameterAsMeshLayer( parameters, u
"INPUT"_s, context );
1446 if ( !meshLayer || !meshLayer->
isValid() )
1449 mMeshLayerCrs = meshLayer->
crs();
1450 mTriangularMesh.update( meshLayer->
nativeMesh() );
1460 QVariant parameterStartTimeVariant = parameters.value( u
"STARTING_TIME"_s );
1461 QgsInterval relativeStartTime = datasetRelativetime( parameterStartTimeVariant, meshLayer, context );
1463 QVariant parameterEndTimeVariant = parameters.value( u
"FINISHING_TIME"_s );
1464 QgsInterval relativeEndTime = datasetRelativetime( parameterEndTimeVariant, meshLayer, context );
1467 qint64 timeStepInterval = parameterAsDouble( parameters, u
"TIME_STEP"_s, context ) * 1000 * 3600;
1468 if ( timeStepInterval == 0 )
1471 for (
int groupIndex : datasetGroups )
1484 mRelativeTimeSteps.clear();
1485 mTimeStepString.clear();
1486 if ( timeStepInterval != 0 )
1488 mRelativeTimeSteps.append( relativeStartTime.
seconds() * 1000 );
1489 while ( mRelativeTimeSteps.last() < relativeEndTime.
seconds() * 1000 )
1490 mRelativeTimeSteps.append( mRelativeTimeSteps.last() + timeStepInterval );
1492 for ( qint64 relativeTimeStep : std::as_const( mRelativeTimeSteps ) )
1494 mTimeStepString.append( meshLayer->
formatTime( relativeTimeStep / 3600.0 / 1000.0 ) );
1499 for (
int i = 0; i < datasetGroups.count(); ++i )
1501 int groupIndex = datasetGroups.at( i );
1503 if ( supportedDataType().contains( meta.
dataType() ) )
1505 mGroupIndexes.append( groupIndex );
1506 mGroupsMetadata[groupIndex] = meta;
1509 if ( !mRelativeTimeSteps.isEmpty() )
1513 for ( qint64 relativeTimeStep : std::as_const( mRelativeTimeSteps ) )
1515 QMap<int, int> &groupIndexToData = mRelativeTimeToData[relativeTimeStep];
1516 QgsInterval timeStepInterval( relativeTimeStep / 1000.0 );
1518 if ( !datasetIndex.
isValid() )
1520 if ( datasetIndex != lastDatasetIndex )
1522 DataGroup dataGroup;
1523 dataGroup.metadata = meta;
1524 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, valueCount );
1528 dataGroup.dataset3dStakedValue = meshLayer->
dataset3dValues( datasetIndex, 0, valueCount );
1530 mDatasets.append( dataGroup );
1531 lastDatasetIndex = datasetIndex;
1533 groupIndexToData[groupIndex] = mDatasets.count() - 1;
1539 QMap<int, int> &groupIndexToData = mRelativeTimeToData[0];
1541 DataGroup dataGroup;
1542 dataGroup.metadata = meta;
1543 dataGroup.datasetValues = meshLayer->
datasetValues( datasetIndex, 0, valueCount );
1547 dataGroup.dataset3dStakedValue = meshLayer->
dataset3dValues( datasetIndex, 0, valueCount );
1549 mDatasets.append( dataGroup );
1550 groupIndexToData[groupIndex] = mDatasets.
count() - 1;
1555 feedback->
setProgress( 100 * i / datasetGroups.count() );
1571 for ( DataGroup &dataGroup : mDatasets )
1573 if ( dataGroup.dataset3dStakedValue.isValid() )
1574 dataGroup.datasetValues = avgMethod->
calculate( dataGroup.dataset3dStakedValue );
1577 int datasetDigits = parameterAsInt( parameters, u
"DATASET_DIGITS"_s, context );
1578 int coordDigits = parameterAsInt( parameters, u
"COORDINATES_DIGITS"_s, context );
1580 std::unique_ptr<QgsProcessingFeatureSource> featureSource( parameterAsSource( parameters, u
"INPUT_POINTS"_s, context ) );
1581 if ( !featureSource )
1586 QString outputFileName = parameterAsFileOutput( parameters, u
"OUTPUT"_s, context );
1587 QFile file( outputFileName );
1588 if ( !file.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
1591 QTextStream textStream( &file );
1593 header << u
"fid"_s << u
"x"_s << u
"y"_s << QObject::tr(
"time" );
1595 for (
int gi : std::as_const( mGroupIndexes ) )
1596 header << mGroupsMetadata.value( gi ).name();
1598 textStream << header.join(
',' ) << u
"\n"_s;
1600 long long featCount = featureSource->featureCount();
1601 long long featCounter = 0;
1615 feedback->
reportError( QObject::tr(
"Could not transform line to mesh CRS" ) );
1622 int triangularFaceIndex = mTriangularMesh.faceIndexForPoint_v2( point );
1624 if ( triangularFaceIndex >= 0 )
1626 int nativeFaceIndex = mTriangularMesh.trianglesToNativeFaces().at( triangularFaceIndex );
1627 if ( !mRelativeTimeSteps.isEmpty() )
1629 for (
int timeIndex = 0; timeIndex < mRelativeTimeSteps.count(); ++timeIndex )
1631 qint64 timeStep = mRelativeTimeSteps.at( timeIndex );
1632 QStringList textLine;
1633 textLine << QString::number( fid ) << QString::number( point.
x(),
'f', coordDigits ) << QString::number( point.
y(),
'f', coordDigits ) << mTimeStepString.at( timeIndex );
1635 if ( mRelativeTimeToData.contains( timeStep ) )
1637 const QMap<int, int> &groupToData = mRelativeTimeToData.value( timeStep );
1638 for (
int groupIndex : std::as_const( mGroupIndexes ) )
1640 if ( !groupToData.contains( groupIndex ) )
1642 int dataIndex = groupToData.value( groupIndex );
1643 if ( dataIndex < 0 || dataIndex > mDatasets.count() - 1 )
1646 const DataGroup &dataGroup = mDatasets.at( dataIndex );
1647 QgsMeshDatasetValue value = extractDatasetValue( point, nativeFaceIndex, triangularFaceIndex, mTriangularMesh, dataGroup.activeFaces, dataGroup.datasetValues, dataGroup.metadata );
1648 if ( abs( value.
x() ) == std::numeric_limits<double>::quiet_NaN() )
1649 textLine << QString(
' ' );
1651 textLine << QString::number( value.
scalar(),
'f', datasetDigits );
1654 textStream << textLine.join(
',' ) << u
"\n"_s;
1659 QStringList textLine;
1660 textLine << QString::number( fid ) << QString::number( point.
x(),
'f', coordDigits ) << QString::number( point.
y(),
'f', coordDigits ) << QObject::tr(
"static dataset" );
1661 const QMap<int, int> &groupToData = mRelativeTimeToData.value( 0 );
1662 for (
int groupIndex : std::as_const( mGroupIndexes ) )
1664 if ( !groupToData.contains( groupIndex ) )
1666 int dataIndex = groupToData.value( groupIndex );
1667 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 );
1676 textStream << textLine.join(
',' ) << u
"\n"_s;
1682 feedback->
setProgress( 100.0 * featCounter / featCount );
1684 return QVariantMap();
1691 ret[u
"OUTPUT"_s] = outputFileName;
@ VectorPoint
Vector point layers.
@ VectorPolygon
Vector polygon layers.
@ VectorLine
Vector line layers.
@ Float64
Sixty four bit floating point (double).
@ LineStringZ
LineStringZ.
@ Hidden
Parameter is hidden and should not be shown to users.
@ Advanced
Parameter is an advanced parameter which should be hidden from users by default.
@ Double
Double/float values.
Represents a coordinate reference system (CRS).
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
Custom exception class for Coordinate Reference System related exceptions.
Wrapper for iterator of features from vector data provider or vector layer.
bool nextFeature(QgsFeature &f)
Fetch next feature and stores in f, returns true on success.
@ FastInsert
Use faster inserts, at the cost of updating the passed features to reflect changes made at the provid...
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
void setAttributes(const QgsAttributes &attrs)
Sets the feature's attributes.
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
bool isCanceled() const
Tells whether the operation has been canceled already.
void canceled()
Internal routines can connect to this signal if they use event loop.
void cancel()
Tells the internal routines that the current operation should be canceled. This should be run by the ...
void setProgress(double progress)
Sets the current progress for the feedback object.
static std::unique_ptr< QgsFeedback > createScaledFeedback(QgsFeedback *parentFeedback, double startPercentage, double endPercentage)
Returns a feedback object whose [0, 100] progression range will be mapped to parentFeedback [startPer...
Encapsulate a field in an attribute table or data source.
Container of fields for a vector layer.
bool append(const QgsField &field, Qgis::FieldOrigin origin=Qgis::FieldOrigin::Provider, int originIndex=-1)
Appends a field.
A geometry is the spatial representation of a feature.
double length() const
Returns the planar, 2-dimensional length of geometry.
Qgis::GeometryOperationResult transform(const QgsCoordinateTransform &ct, Qgis::TransformDirection direction=Qgis::TransformDirection::Forward, bool transformZ=false)
Transforms this geometry as described by the coordinate transform ct.
QgsGeometry interpolate(double distance) const
Returns an interpolated point on the geometry at the specified distance.
QgsPointXY asPoint() const
Returns the contents of the geometry as a 2-dimensional point.
bool isEmpty() const
Returns true if the geometry is empty (eg a linestring with no vertices, or a collection with no geom...
A representation of the interval between two datetime values.
double seconds() const
Returns the interval duration in seconds.
double hours() const
Returns the interval duration in hours.
Line string geometry type, with support for z-dimension and m-values.
QgsCoordinateReferenceSystem crs
Abstract class for interpolating 3d stacked mesh data to 2d data.
QgsMeshDataBlock calculate(const QgsMesh3DDataBlock &block3d, QgsFeedback *feedback=nullptr) const
Calculated 2d block values from 3d stacked mesh values.
Exporter of contours lines or polygons from a mesh layer.
A block of integers/doubles from a mesh dataset.
QgsMeshDatasetValue value(int index) const
Returns a value represented by the index For active flag the behavior is undefined.
bool active(int index) const
Returns a value for active flag by the index For scalar and vector 2d the behavior is undefined.
int count() const
Number of items stored in the block.
An index that identifies the dataset group (e.g.
bool isValid() const
Returns whether index is valid, ie at least groups is set.
Represents a single mesh dataset value.
double y() const
Returns y value.
double scalar() const
Returns magnitude of vector for vector data or scalar value for scalar data.
double x() const
Returns x value.
Implementation of map layer temporal properties for mesh layers.
QDateTime referenceTime() const
Returns the reference time.
Represents a mesh layer supporting display of data on structured or unstructured meshes.
int datasetCount(const QgsMeshDatasetIndex &index) const
Returns the dataset count in the dataset groups.
QgsMeshRendererSettings rendererSettings() const
Returns renderer settings.
void updateTriangularMesh(const QgsCoordinateTransform &transform=QgsCoordinateTransform())
Gets native mesh and updates (creates if it doesn't exist) the base triangular mesh.
QgsMesh * nativeMesh()
Returns native mesh (nullptr before rendering or calling to updateMesh).
QgsMeshDatasetIndex datasetIndexAtRelativeTime(const QgsInterval &relativeTime, int datasetGroupIndex) const
Returns dataset index from datasets group depending on the relative time from the layer reference tim...
QgsMeshDataBlock datasetValues(const QgsMeshDatasetIndex &index, int valueIndex, int count) const
Returns N vector/scalar values from the index from the dataset.
bool isEditable() const override
Returns true if the layer can be edited.
QgsMeshDataBlock areFacesActive(const QgsMeshDatasetIndex &index, int faceIndex, int count) const
Returns whether the faces are active for particular dataset.
QgsInterval datasetRelativeTime(const QgsMeshDatasetIndex &index)
Returns the relative time of the dataset from the reference time of its group.
QgsMapLayerTemporalProperties * temporalProperties() override
Returns the layer's temporal properties.
qint64 datasetRelativeTimeInMilliseconds(const QgsMeshDatasetIndex &index)
Returns the relative time (in milliseconds) of the dataset from the reference time of its group.
QgsMesh3DDataBlock dataset3dValues(const QgsMeshDatasetIndex &index, int faceIndex, int count) const
Returns N vector/scalar values from the face index from the dataset for 3d stacked meshes.
QString formatTime(double hours)
Returns (date) time in hours formatted to human readable form.
QgsMeshDatasetGroupMetadata datasetGroupMetadata(const QgsMeshDatasetIndex &index) const
Returns the dataset groups metadata.
@ NeighbourAverage
Does a simple average of values defined for all surrounding faces/vertices.
static QgsRasterBlock * exportRasterBlock(const QgsMeshLayer &layer, const QgsMeshDatasetIndex &datasetIndex, const QgsCoordinateReferenceSystem &destinationCrs, const QgsCoordinateTransformContext &transformContext, double mapUnitsPerPixel, const QgsRectangle &extent, QgsRasterBlockFeedback *feedback=nullptr)
Exports mesh layer's dataset values as raster block.
Point geometry type, with support for z-dimension and m-values.
Abstract base class for processing algorithms.
Contains information about the context in which a processing algorithm is executed.
QgsDateTimeRange currentTimeRange() const
Returns the current time range to use for temporal operations.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context.
Custom exception class for processing related exceptions.
Base class for providing feedback from a processing algorithm.
virtual void reportError(const QString &error, bool fatalError=false)
Reports that the algorithm encountered an error while executing.
virtual void setProgressText(const QString &text)
Sets a progress report text string.
A coordinate reference system parameter for processing algorithms.
A double numeric parameter for distance values.
An enum based parameter for processing algorithms, allowing for selection from predefined values.
A rectangular map extent parameter for processing algorithms.
A feature sink output for processing algorithms.
An input feature source (such as vector layers) parameter for processing algorithms.
A generic file based destination parameter, for specifying the destination path for a file (non-map l...
A parameter for processing algorithms that need a list of mesh dataset groups.
static QList< int > valueAsDatasetGroup(const QVariant &value)
Returns the value as a list if dataset group indexes.
A parameter for processing algorithms that need a list of mesh dataset index from time parameter.
static QString valueAsTimeType(const QVariant &value)
Returns the dataset value time type as a string : current-context-time : the time is store in the pro...
static QgsMeshDatasetIndex timeValueAsDatasetIndex(const QVariant &value)
Returns the value as a QgsMeshDatasetIndex if the value has "dataset-time-step" type.
static QDateTime timeValueAsDefinedDateTime(const QVariant &value)
Returns the value as a QDateTime if the value has "defined-date-time" type.
A mesh layer parameter for processing algorithms.
A numeric parameter for processing algorithms.
A raster layer destination parameter, for specifying the destination path for a raster layer created ...
Feedback object tailored for raster block reading.
The raster file writer which allows you to save a raster to a new file.
A rectangle specified with double values.
T begin() const
Returns the beginning of the range.
A triangular/derived mesh with vertices in map coordinates.
const QVector< QgsMeshFace > & triangles() const
Returns triangles.
const QVector< QgsMeshVertex > & vertices() const
Returns vertices in map coordinate system.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference).
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
QVector< int > QgsMeshFace
List of vertex indexes.
QPair< int, int > QgsMeshEdge
Edge is a straight line seqment between 2 points.
Mesh - vertices, edges and faces.
QVector< QgsMeshVertex > vertices
void clear()
Remove all vertices, edges and faces.
int faceCount() const
Returns number of faces.