21 #include <QDomDocument>
22 #include <QJsonObject>
31 #include "qgis_core.h"
40 #include "json_fwd.hpp"
41 using namespace nlohmann;
126 Q_PROPERTY(
bool isNull READ isNull )
138 NothingHappened = 1000,
156 Q_ENUM( OperationResult )
293 static
QgsGeometry createWedgeBuffer( const
QgsPoint ¢er,
double azimuth,
double angularWidth,
294 double outerRadius,
double innerRadius = 0 );
301 void fromWkb(
unsigned char *wkb,
int length )
SIP_SKIP;
307 void fromWkb( const QByteArray &wkb );
327 bool isEmpty() const;
369 FlagAllowSelfTouchingHoles = 1 << 0,
371 Q_DECLARE_FLAGS( ValidityFlags, ValidityFlag )
380 bool isGeosValid( QgsGeometry::ValidityFlags flags = QgsGeometry::ValidityFlags() )
const;
390 bool isSimple()
const;
405 bool isAxisParallelRectangle(
double maximumDeviation,
bool simpleRectanglesOnly =
false )
const;
433 double length()
const;
620 double hausdorffDistance(
const QgsGeometry &geom )
const;
640 double hausdorffDistanceDensify(
const QgsGeometry &geom,
double densifyFraction )
const;
704 double distanceToVertex(
int vertex )
const;
713 double angleAtVertex(
int vertex )
const;
727 void adjacentVertices(
int atVertex,
int &beforeVertex
SIP_OUT,
int &afterVertex
SIP_OUT )
const;
741 bool insertVertex(
double x,
double y,
int beforeVertex );
755 bool insertVertex(
const QgsPoint &point,
int beforeVertex );
764 bool moveVertex(
double x,
double y,
int atVertex );
773 bool moveVertex(
const QgsPoint &p,
int atVertex );
786 bool deleteVertex(
int atVertex );
793 QgsPoint vertexAt(
int atVertex )
const;
827 double closestVertexWithContext(
const QgsPointXY &point,
int &atVertex
SIP_OUT )
const;
847 OperationResult addRing(
const QVector<QgsPointXY> &ring );
893 QgsGeometry removeInteriorRings(
double minimumAllowedArea = -1 )
const;
899 OperationResult translate(
double dx,
double dy,
double dz = 0.0,
double dm = 0.0 );
925 OperationResult transform( const QTransform &t,
double zTranslate = 0.0,
double zScale = 1.0,
double mTranslate = 0.0,
double mScale = 1.0 );
933 OperationResult rotate(
double rotation, const
QgsPointXY ¢er );
988 OperationResult reshapeGeometry( const
QgsLineString &reshapeLineString );
1061 QgsGeometry orthogonalize(
double tolerance = 1.0E-8,
int maxIterations = 1000,
double angleThreshold = 15.0 ) const;
1075 QgsGeometry snappedToGrid(
double hSpacing,
double vSpacing,
double dSpacing = 0,
double mSpacing = 0 ) const;
1097 bool removeDuplicateNodes(
double epsilon = 4 * std::numeric_limits<
double>::epsilon(),
bool useZValues = false );
1108 bool intersects( const
QgsRectangle &rectangle ) const;
1124 bool intersects( const
QgsGeometry &geometry ) const;
1135 bool boundingBoxIntersects( const
QgsRectangle &rectangle ) const;
1146 bool boundingBoxIntersects( const
QgsGeometry &geometry ) const;
1163 bool contains( const
QgsGeometry &geometry ) const;
1175 bool disjoint( const
QgsGeometry &geometry ) const;
1187 bool touches( const
QgsGeometry &geometry ) const;
1199 bool overlaps( const
QgsGeometry &geometry ) const;
1223 bool crosses( const
QgsGeometry &geometry ) const;
1231 Q_ENUM( BufferSide )
1240 Q_ENUM( EndCapStyle )
1258 QgsGeometry buffer(
double distance,
int segments )
const;
1272 QgsGeometry buffer(
double distance,
int segments, EndCapStyle endCapStyle, JoinStyle joinStyle,
double miterLimit )
const;
1282 QgsGeometry offsetCurve(
double distance,
int segments, JoinStyle joinStyle,
double miterLimit )
const;
1299 QgsGeometry singleSidedBuffer(
double distance,
int segments, BufferSide side,
1300 JoinStyle joinStyle = JoinStyleRound,
1301 double miterLimit = 2.0 )
const;
1320 QgsGeometry taperedBuffer(
double startWidth,
double endWidth,
int segments )
const;
1336 QgsGeometry variableWidthBufferByM(
int segments )
const;
1344 QgsGeometry extendLine(
double startDistance,
double endDistance )
const;
1358 QgsGeometry densifyByCount(
int extraNodesPerSegment )
const;
1374 QgsGeometry densifyByDistance(
double distance )
const;
1391 QgsGeometry convertToCurves(
double distanceTolerance = 1e-8,
double angleTolerance = 1e-8 )
const;
1550 QgsGeometry delaunayTriangulation(
double tolerance = 0.0,
bool edgesOnly = false ) const;
1599 QgsGeometry subdivide(
int maxNodes = 256 ) const;
1629 double lineLocatePoint( const
QgsGeometry &point ) const;
1640 double interpolateAngle(
double distance ) const;
1764 const
QgsWkbTypes::GeometryType type = sipCpp->type();
1765 if ( sipCpp->isNull() )
1767 PyErr_SetString( PyExc_ValueError, QStringLiteral(
"Cannot generate points inside a null geometry." ).toUtf8().constData() );
1772 PyErr_SetString( PyExc_TypeError, QStringLiteral(
"Cannot generate points inside a %1 geometry. Only Polygon types are permitted." ).arg(
QgsWkbTypes::displayString( sipCpp->wkbType() ) ).toUtf8().constData() );
1777 const sipTypeDef *qvector_type = sipFindType(
"QVector<QgsPointXY>" );
1778 sipRes = sipConvertFromNewType(
new QVector< QgsPointXY >( sipCpp->randomPointsInPolygon( a0, a1 ) ), qvector_type, Py_None );
1793 int wkbSize( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() )
const;
1802 QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() )
const;
1809 QString asWkt(
int precision = 17 )
const;
1812 SIP_PYOBJECT __repr__();
1815 if ( sipCpp->isNull() )
1816 str = QStringLiteral(
"<QgsGeometry: null>" );
1819 QString wkt = sipCpp->asWkt();
1820 if ( wkt.length() > 1000 )
1821 wkt = wkt.left( 1000 ) + QStringLiteral(
"..." );
1822 str = QStringLiteral(
"<QgsGeometry: %1>" ).arg( wkt );
1824 sipRes = PyUnicode_FromString(
str.toUtf8().constData() );
1831 QString asJson(
int precision = 17 )
const;
1905 if ( sipCpp->isNull() )
1907 PyErr_SetString( PyExc_ValueError, QStringLiteral(
"Null geometry cannot be converted to a point." ).toUtf8().constData() );
1912 PyErr_SetString( PyExc_TypeError, QStringLiteral(
"%1 geometry cannot be converted to a point. Only Point types are permitted." ).arg(
QgsWkbTypes::displayString( type ) ).toUtf8().constData() );
1917 sipRes = sipConvertFromNewType(
new QgsPointXY( sipCpp->asPoint() ), sipType_QgsPointXY, Py_None );
1949 if ( sipCpp->isNull() )
1951 PyErr_SetString( PyExc_ValueError, QStringLiteral(
"Null geometry cannot be converted to a polyline." ).toUtf8().constData() );
1956 PyErr_SetString( PyExc_TypeError, QStringLiteral(
"%1 geometry cannot be converted to a polyline. Only single line or curve types are permitted." ).arg(
QgsWkbTypes::displayString( type ) ).toUtf8().constData() );
1961 const sipTypeDef *qvector_type = sipFindType(
"QVector< QgsPointXY >" );
1962 sipRes = sipConvertFromNewType(
new QgsPolylineXY( sipCpp->asPolyline() ), qvector_type, Py_None );
1994 if ( sipCpp->isNull() )
1996 PyErr_SetString( PyExc_ValueError, QStringLiteral(
"Null geometry cannot be converted to a polygon." ).toUtf8().constData() );
2001 PyErr_SetString( PyExc_TypeError, QStringLiteral(
"%1 geometry cannot be converted to a polygon. Only single polygon or curve polygon types are permitted." ).arg(
QgsWkbTypes::displayString( type ) ).toUtf8().constData() );
2006 const sipTypeDef *qvector_type = sipFindType(
"QVector<QVector<QgsPointXY>>" );
2007 sipRes = sipConvertFromNewType(
new QgsPolygonXY( sipCpp->asPolygon() ), qvector_type, Py_None );
2037 if ( sipCpp->isNull() )
2039 PyErr_SetString( PyExc_ValueError, QStringLiteral(
"Null geometry cannot be converted to a multipoint." ).toUtf8().constData() );
2044 PyErr_SetString( PyExc_TypeError, QStringLiteral(
"%1 geometry cannot be converted to a multipoint. Only multipoint types are permitted." ).arg(
QgsWkbTypes::displayString( type ) ).toUtf8().constData() );
2049 const sipTypeDef *qvector_type = sipFindType(
"QVector< QgsPointXY >" );
2050 sipRes = sipConvertFromNewType(
new QgsPolylineXY( sipCpp->asMultiPoint() ), qvector_type, Py_None );
2082 if ( sipCpp->isNull() )
2084 PyErr_SetString( PyExc_ValueError, QStringLiteral(
"Null geometry cannot be converted to a multilinestring." ).toUtf8().constData() );
2089 PyErr_SetString( PyExc_TypeError, QStringLiteral(
"%1 geometry cannot be converted to a multilinestring. Only multi linestring or curves are permitted." ).arg(
QgsWkbTypes::displayString( type ) ).toUtf8().constData() );
2094 const sipTypeDef *qvector_type = sipFindType(
"QVector<QVector<QgsPointXY>>" );
2095 sipRes = sipConvertFromNewType(
new QgsMultiPolylineXY( sipCpp->asMultiPolyline() ), qvector_type, Py_None );
2127 if ( sipCpp->isNull() )
2129 PyErr_SetString( PyExc_ValueError, QStringLiteral(
"Null geometry cannot be converted to a multipolygon." ).toUtf8().constData() );
2134 PyErr_SetString( PyExc_TypeError, QStringLiteral(
"%1 geometry cannot be converted to a multipolygon. Only multi polygon or curves are permitted." ).arg(
QgsWkbTypes::displayString( type ) ).toUtf8().constData() );
2139 const sipTypeDef *qvector_type = sipFindType(
"QVector<QVector<QVector<QgsPointXY>>>" );
2140 sipRes = sipConvertFromNewType(
new QgsMultiPolygonXY( sipCpp->asMultiPolygon() ), qvector_type, Py_None );
2149 QVector<QgsGeometry> asGeometryCollection()
const;
2178 bool deleteRing(
int ringNum,
int partNum = 0 );
2185 bool deletePart(
int partNum );
2195 bool convertToMultiType();
2206 bool convertToSingleType();
2217 bool convertGeometryCollectionToSubclass(
QgsWkbTypes::GeometryType geomType );
2229 int avoidIntersections( const QList<
QgsVectorLayer *> &avoidIntersectionsLayers,
2271 : mMessage( QStringLiteral(
"none" ) )
2281 , mHasLocation( true ) {}
2286 QString what()
const;
2296 bool hasWhere()
const;
2299 SIP_PYOBJECT __repr__();
2301 QString
str = QStringLiteral(
"<QgsGeometry.Error: %1>" ).arg( sipCpp->what() );
2302 sipRes = PyUnicode_FromString(
str.toUtf8().data() );
2308 return other.mMessage == mMessage && other.mHasLocation == mHasLocation && other.mLocation == mLocation;
2314 bool mHasLocation =
false;
2335 void validateGeometry( QVector<QgsGeometry::Error> &errors
SIP_OUT, ValidationMethod method = ValidatorQgisInternal, QgsGeometry::ValidityFlags flags = QgsGeometry::ValidityFlags() )
const;
2353 static QgsGeometry unaryUnion(
const QVector<QgsGeometry> &geometries );
2363 static QgsGeometry polygonize(
const QVector<QgsGeometry> &geometries );
2380 bool requiresConversionToStraightSegments()
const;
2394 void draw( QPainter &p )
const;
2439 void filterVertices( const std::function<
bool( const
QgsPoint & ) > &filter )
SIP_SKIP;
2471 static
QgsGeometry fromQPolygonF( const QPolygonF &polygon );
2503 double epsilon = 4 * std::numeric_limits<double>::epsilon() );
2515 double epsilon = 4 * std::numeric_limits<double>::epsilon() );
2528 double epsilon = 4 * std::numeric_limits<double>::epsilon() );
2550 static bool compare( PyObject *obj1, PyObject *obj2,
double epsilon = 4 * std::numeric_limits<double>::epsilon() );
2558 if ( PyList_Check( a0 ) && PyList_Check( a1 ) &&
2559 PyList_GET_SIZE( a0 ) && PyList_GET_SIZE( a1 ) )
2561 PyObject *o0 = PyList_GetItem( a0, 0 );
2562 PyObject *o1 = PyList_GetItem( a1, 0 );
2566 if ( sipCanConvertToType( o0, sipType_QgsPointXY, SIP_NOT_NONE ) &&
2567 sipCanConvertToType( o1, sipType_QgsPointXY, SIP_NOT_NONE ) &&
2568 sipCanConvertToType( a0, sipType_QVector_0100QgsPointXY, SIP_NOT_NONE ) &&
2569 sipCanConvertToType( a1, sipType_QVector_0100QgsPointXY, SIP_NOT_NONE ) )
2573 p0 =
reinterpret_cast<QgsPolylineXY *
>( sipConvertToType( a0, sipType_QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state0, &sipIsErr ) );
2574 p1 =
reinterpret_cast<QgsPolylineXY *
>( sipConvertToType( a1, sipType_QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state1, &sipIsErr ) );
2577 sipReleaseType( p0, sipType_QVector_0100QgsPointXY, state0 );
2578 sipReleaseType( p1, sipType_QVector_0100QgsPointXY, state1 );
2585 else if ( PyList_Check( o0 ) && PyList_Check( o1 ) &&
2586 PyList_GET_SIZE( o0 ) && PyList_GET_SIZE( o1 ) )
2588 PyObject *oo0 = PyList_GetItem( o0, 0 );
2589 PyObject *oo1 = PyList_GetItem( o1, 0 );
2593 if ( sipCanConvertToType( oo0, sipType_QgsPointXY, SIP_NOT_NONE ) &&
2594 sipCanConvertToType( oo1, sipType_QgsPointXY, SIP_NOT_NONE ) &&
2595 sipCanConvertToType( a0, sipType_QVector_0600QVector_0100QgsPointXY, SIP_NOT_NONE ) &&
2596 sipCanConvertToType( a1, sipType_QVector_0600QVector_0100QgsPointXY, SIP_NOT_NONE ) )
2600 p0 =
reinterpret_cast<QgsPolygonXY *
>( sipConvertToType( a0, sipType_QVector_0600QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state0, &sipIsErr ) );
2601 p1 =
reinterpret_cast<QgsPolygonXY *
>( sipConvertToType( a1, sipType_QVector_0600QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state1, &sipIsErr ) );
2604 sipReleaseType( p0, sipType_QVector_0600QVector_0100QgsPointXY, state0 );
2605 sipReleaseType( p1, sipType_QVector_0600QVector_0100QgsPointXY, state1 );
2612 else if ( PyList_Check( oo0 ) && PyList_Check( oo1 ) &&
2613 PyList_GET_SIZE( oo0 ) && PyList_GET_SIZE( oo1 ) )
2615 PyObject *ooo0 = PyList_GetItem( oo0, 0 );
2616 PyObject *ooo1 = PyList_GetItem( oo1, 0 );
2620 if ( sipCanConvertToType( ooo0, sipType_QgsPointXY, SIP_NOT_NONE ) &&
2621 sipCanConvertToType( ooo1, sipType_QgsPointXY, SIP_NOT_NONE ) &&
2622 sipCanConvertToType( a0, sipType_QVector_0600QVector_0600QVector_0100QgsPointXY, SIP_NOT_NONE ) &&
2623 sipCanConvertToType( a1, sipType_QVector_0600QVector_0600QVector_0100QgsPointXY, SIP_NOT_NONE ) )
2627 p0 =
reinterpret_cast<QgsMultiPolygonXY *
>( sipConvertToType( a0, sipType_QVector_0600QVector_0600QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state0, &sipIsErr ) );
2628 p1 =
reinterpret_cast<QgsMultiPolygonXY *
>( sipConvertToType( a1, sipType_QVector_0600QVector_0600QVector_0100QgsPointXY, 0, SIP_NOT_NONE, &state1, &sipIsErr ) );
2631 sipReleaseType( p0, sipType_QVector_0600QVector_0600QVector_0100QgsPointXY, state0 );
2632 sipReleaseType( p1, sipType_QVector_0600QVector_0600QVector_0100QgsPointXY, state1 );
2665 QgsGeometry smooth(
unsigned int iterations = 1,
double offset = 0.25,
2666 double minimumDistance = -1.0,
double maxAngle = 180.0 )
const;
2712 static void convertPointList(
const QVector<QgsPointXY> &input,
QgsPointSequence &output );
2719 static void convertPointList(
const QgsPointSequence &input, QVector<QgsPointXY> &output );
2722 operator QVariant()
const
2724 return QVariant::fromValue( *
this );
2732 mutable QString mLastError;
2744 void reset( std::unique_ptr< QgsAbstractGeometry > newGeometry );
2749 QgsGeometry convertToPoint(
bool destMultipart )
const;
2751 QgsGeometry convertToLine(
bool destMultipart )
const;
2753 QgsGeometry convertToPolygon(
bool destMultipart )
const;
2766 std::unique_ptr< QgsLineString > smoothLine(
const QgsLineString &line,
unsigned int iterations = 1,
double offset = 0.25,
2767 double minimumDistance = -1,
double maxAngle = 180.0 )
const;
2780 std::unique_ptr< QgsPolygon > smoothPolygon(
const QgsPolygon &polygon,
unsigned int iterations = 1,
double offset = 0.25,
2781 double minimumDistance = -1,
double maxAngle = 180.0 )
const;
The part_iterator class provides STL-style iterator for const references to geometry parts.
The part_iterator class provides STL-style iterator for geometry parts.
The vertex_iterator class provides STL-style iterator for vertices.
Abstract base class for all geometries.
SegmentationToleranceType
Segmentation tolerance as maximum angle or maximum difference between approximation and circle.
@ MaximumAngle
Maximum angle between generating radii (lines from arc center to output vertices)
Custom exception class for Coordinate Reference System related exceptions.
Abstract base class for curved geometry type.
Base class for feedback objects to be used for cancellation of something running in a worker thread.
Java-style iterator for const traversal of parts of a geometry.
A geometry engine is a low-level representation of a QgsAbstractGeometry object, optimised for use wi...
Java-style iterator for traversal of parts of a geometry.
Error(const QString &m, const QgsPointXY &p)
bool operator==(const QgsGeometry::Error &other) const
A geometry is the spatial representation of a feature.
QVector< QgsPointXY > randomPointsInPolygon(int count, const std::function< bool(const QgsPointXY &) > &acceptPoint, unsigned long seed=0, QgsFeedback *feedback=nullptr, int maxTriesPerPoint=0) const
Returns a list of count random points generated inside a (multi)polygon geometry (if acceptPoint is s...
JoinStyle
Join styles for buffers.
@ JoinStyleMiter
Use mitered joins.
@ JoinStyleBevel
Use beveled joins.
QVector< QgsPointXY > randomPointsInPolygon(int count, unsigned long seed=0, QgsFeedback *feedback=nullptr) const
Returns a list of count random points generated inside a (multi)polygon geometry.
static bool compare(const QgsPolylineXY &p1, const QgsPolylineXY &p2, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compares two polylines for equality within a specified tolerance.
BufferSide
Side of line to buffer.
@ SideRight
Buffer to right of line.
EndCapStyle
End cap styles for buffers.
@ CapSquare
Square cap (extends past start/end of line by buffer distance)
@ CapFlat
Flat cap (in line with start/end of line)
OperationResult
Success or failure of a geometry operation.
@ InvalidBaseGeometry
The base geometry on which the operation is done is invalid or empty.
@ SplitCannotSplitPoint
Cannot split points.
@ AddRingNotInExistingFeature
The input ring doesn't have any existing ring to fit into.
@ AddRingNotClosed
The input ring is not closed.
@ AddPartSelectedGeometryNotFound
The selected geometry cannot be found.
@ GeometryEngineError
Geometry engine misses a method implemented or an error occurred in the geometry engine.
@ AddPartNotMultiGeometry
The source geometry is not multi.
@ InvalidInputGeometryType
The input geometry (ring, part, split line, etc.) has not the correct geometry type.
@ SelectionIsEmpty
No features were selected.
@ AddRingCrossesExistingRings
The input ring crosses existing rings (it is not disjoint)
@ SelectionIsGreaterThanOne
More than one features were selected.
@ LayerNotEditable
Cannot edit layer.
@ AddRingNotValid
The input ring is not valid.
ValidityFlag
Validity check flags.
ValidationMethod
Available methods for validating geometries.
@ ValidatorQgisInternal
Use internal QgsGeometryValidator method.
@ ValidatorGeos
Use GEOS validation methods.
This class offers geometry processing methods.
Line string geometry type, with support for z-dimension and m-values.
Perform transforms between map coordinates and device coordinates.
Custom exception class which is raised when an operation is not supported.
A class to represent a 2D point.
Point geometry type, with support for z-dimension and m-values.
A rectangle specified with double values.
Represents a vector layer which manages a vector based data sets.
Java-style iterator for traversal of vertices of a geometry.
Handles storage of information regarding WKB types and their properties.
static GeometryType geometryType(Type type) SIP_HOLDGIL
Returns the geometry type for a WKB type, e.g., both MultiPolygon and CurvePolygon would have a Polyg...
static bool isMultiType(Type type) SIP_HOLDGIL
Returns true if the WKB type is a multi type.
GeometryType
The geometry types are used to group QgsWkbTypes::Type in a coarse way.
static QString displayString(Type type) SIP_HOLDGIL
Returns a non-translated display string type for a WKB type, e.g., the geometry name used in WKT geom...
static Type flatType(Type type) SIP_HOLDGIL
Returns the flat type for a WKB type.
double ANALYSIS_EXPORT angle(QgsPoint *p1, QgsPoint *p2, QgsPoint *p3, QgsPoint *p4)
Calculates the angle between two segments (in 2 dimension, z-values are ignored)
std::unique_ptr< GEOSGeometry, GeosDeleter > unique_ptr
Scoped GEOS pointer.
const double DEFAULT_SEGMENT_EPSILON
Default snapping tolerance for segments.
#define SIP_TYPEHINT(type)
QVector< QgsPoint > QgsPointSequence
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
Q_DECLARE_OPERATORS_FOR_FLAGS(QgsField::ConfigurationFlags) CORE_EXPORT QDataStream &operator<<(QDataStream &out
Writes the field to stream out. QGIS version compatibility is not guaranteed.
QVector< QgsPolylineXY > QgsPolygonXY
Polygon: first item of the list is outer ring, inner rings (if any) start from second item.
QVector< QgsPolylineXY > QgsMultiPolylineXY
A collection of QgsPolylines that share a common collection of attributes.
CORE_EXPORT QDataStream & operator>>(QDataStream &in, QgsGeometry &geometry)
Reads a geometry from stream in into geometry. QGIS version compatibility is not guaranteed.
QVector< QgsPointXY > QgsMultiPointXY
A collection of QgsPoints that share a common collection of attributes.
QVector< QgsPointXY > QgsPolylineXY
Polyline as represented as a vector of two-dimensional points.
CORE_EXPORT QDataStream & operator<<(QDataStream &out, const QgsGeometry &geometry)
Writes the geometry to stream out. QGIS version compatibility is not guaranteed.
QVector< QgsPolygonXY > QgsMultiPolygonXY
A collection of QgsPolygons that share a common collection of attributes.
QgsPointSequence QgsPolyline
Polyline as represented as a vector of points.
Q_DECLARE_METATYPE(QgsMeshTimeSettings)
Utility class for identifying a unique vertex within a geometry.