QGIS API Documentation 3.99.0-Master (a8882ad4560)
Loading...
Searching...
No Matches
qgscurve.h
Go to the documentation of this file.
1/***************************************************************************
2 qgscurve.h
3 ------------
4 begin : September 2014
5 copyright : (C) 2014 by Marco Hugentobler
6 email : marco at sourcepole dot ch
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
18#ifndef QGSCURVE_H
19#define QGSCURVE_H
20
21#include "qgis_core.h"
22#include "qgis_sip.h"
23#include "qgsabstractgeometry.h"
24#include "qgsbox3d.h"
25
26#include <QPainterPath>
27
28class QgsLineString;
29
35class CORE_EXPORT QgsCurve: public QgsAbstractGeometry SIP_ABSTRACT
36{
37 public:
38
39 QgsCurve() = default;
40
44 virtual bool equals( const QgsCurve &other ) const = 0;
45
46 bool operator==( const QgsAbstractGeometry &other ) const override;
47 bool operator!=( const QgsAbstractGeometry &other ) const override;
48
49 QgsCurve *clone() const override = 0 SIP_FACTORY;
50
55 virtual QgsPoint startPoint() const = 0;
56
61 virtual QgsPoint endPoint() const = 0;
62
68 virtual bool isClosed() const SIP_HOLDGIL;
69
79 virtual bool isClosed2D() const SIP_HOLDGIL;
80
84 virtual bool isRing() const SIP_HOLDGIL;
85
95 virtual QgsLineString *curveToLine( double tolerance = M_PI_2 / 90, SegmentationToleranceType toleranceType = MaximumAngle ) const = 0 SIP_FACTORY;
96
100 virtual void addToPainterPath( QPainterPath &path ) const = 0;
101 QPainterPath asQPainterPath() const override;
102
107 virtual void drawAsPolygon( QPainter &p ) const = 0;
108
112 virtual void points( QgsPointSequence &pt SIP_OUT ) const = 0;
113
117 virtual int numPoints() const = 0;
118
119#ifdef SIP_RUN
120 int __len__() const;
121 % Docstring
122 Returns the number of points in the curve.
123 % End
124 % MethodCode
125 sipRes = sipCpp->numPoints();
126 % End
127
129 int __bool__() const;
130 % MethodCode
131 sipRes = true;
132 % End
133#endif
134
138 virtual void sumUpArea( double &sum SIP_OUT ) const = 0;
139
145 virtual void sumUpArea3D( double &sum SIP_OUT ) const = 0;
146
148 bool nextVertex( QgsVertexId &id, QgsPoint &vertex SIP_OUT ) const override;
149 void adjacentVertices( QgsVertexId vertex, QgsVertexId &previousVertex SIP_OUT, QgsVertexId &nextVertex SIP_OUT ) const override;
150 int vertexNumberFromVertexId( QgsVertexId id ) const override;
151
159 virtual bool pointAt( int node, QgsPoint &point SIP_OUT, Qgis::VertexType &type SIP_OUT ) const = 0;
160
171 virtual int indexOf( const QgsPoint &point ) const = 0;
172
176 virtual QgsCurve *reversed() const = 0 SIP_FACTORY;
177
178 QgsAbstractGeometry *boundary() const override SIP_FACTORY;
179
180 QString asKml( int precision = 17 ) const override;
181
187 QgsCurve *segmentize( double tolerance = M_PI_2 / 90, SegmentationToleranceType toleranceType = MaximumAngle ) const override SIP_FACTORY;
188
189 int vertexCount( int part = 0, int ring = 0 ) const override;
190 int ringCount( int part = 0 ) const override;
191 int partCount() const override;
192 QgsPoint vertexAt( QgsVertexId id ) const override;
193 QgsCurve *toCurveType() const override SIP_FACTORY;
194 void normalize() final SIP_HOLDGIL;
195
196 QgsBox3D boundingBox3D() const override;
197 bool isValid( QString &error SIP_OUT, Qgis::GeometryValidityFlags flags = Qgis::GeometryValidityFlags() ) const override;
198
204 virtual double xAt( int index ) const = 0;
205
211 virtual double yAt( int index ) const = 0;
212
219 virtual double zAt( int index ) const = 0;
220
227 virtual double mAt( int index ) const = 0;
228
232 virtual QPolygonF asQPolygonF() const;
233
245 virtual QgsPoint *interpolatePoint( double distance ) const = 0 SIP_FACTORY;
246
259 virtual QgsCurve *curveSubstring( double startDistance, double endDistance ) const = 0 SIP_FACTORY;
260
268 double straightDistance2d() const;
269
279 double sinuosity() const;
280
288 Qgis::AngularDirection orientation() const;
289
301 virtual void scroll( int firstVertexIndex ) = 0;
302
317 virtual double distanceBetweenVertices( QgsVertexId fromVertex, QgsVertexId toVertex ) const = 0;
318
319#ifndef SIP_RUN
320
329 inline static const QgsCurve *cast( const QgsAbstractGeometry *geom )
330 {
331 if ( !geom )
332 return nullptr;
333
334 const Qgis::WkbType type = geom->wkbType();
336 {
337 return static_cast<const QgsCurve *>( geom );
338 }
339 return nullptr;
340 }
341
350 inline static QgsCurve *cast( QgsAbstractGeometry *geom )
351 {
352 if ( !geom )
353 return nullptr;
354
355 const Qgis::WkbType type = geom->wkbType();
357 {
358 return static_cast<QgsCurve *>( geom );
359 }
360 return nullptr;
361 }
362
373 virtual std::tuple< std::unique_ptr< QgsCurve >, std::unique_ptr< QgsCurve > > splitCurveAtVertex( int index ) const = 0;
374
375#endif
376
377
378 protected:
379
380 void clearCache() const override;
381
382 int childCount() const override;
383 QgsPoint childPoint( int index ) const override;
384#ifndef SIP_RUN
385
390 bool snapToGridPrivate( double hSpacing, double vSpacing, double dSpacing, double mSpacing,
391 const QVector<double> &srcX, const QVector<double> &srcY, const QVector<double> &srcZ, const QVector<double> &srcM,
392 QVector<double> &outX, QVector<double> &outY, QVector<double> &outZ, QVector<double> &outM,
393 bool removeRedundantPoints ) const;
394#endif
395
400
401 mutable bool mHasCachedSummedUpArea = false;
402 mutable double mSummedUpArea = 0;
403 mutable bool mHasCachedSummedUpArea3D = false;
404 mutable double mSummedUpArea3D = 0;
405
406 private:
407
408 mutable bool mHasCachedValidity = false;
409 mutable QString mValidityFailureReason;
410
411 friend class TestQgsGeometry;
412};
413
414#endif // QGSCURVE_H
Provides global constants and enumerations for use throughout the application.
Definition qgis.h:59
VertexType
Types of vertex.
Definition qgis.h:3112
@ Line
Lines.
Definition qgis.h:367
WkbType
The WKB type describes the number of dimensions a geometry has.
Definition qgis.h:280
virtual QgsPoint childPoint(int index) const
Returns point at index (for geometries without child geometries - i.e.
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).
virtual int vertexNumberFromVertexId(QgsVertexId id) const =0
Returns the vertex number corresponding to a vertex id.
virtual QgsAbstractGeometry * boundary() const =0
Returns the closure of the combinatorial boundary of the geometry (ie the topological boundary of the...
virtual int childCount() const
Returns number of child geometries (for geometries with child geometries) or child points (for geomet...
virtual void adjacentVertices(QgsVertexId vertex, QgsVertexId &previousVertex, QgsVertexId &nextVertex) const =0
Returns the vertices adjacent to a specified vertex within a geometry.
virtual void clearCache() const
Clears any cached parameters associated with the geometry, e.g., bounding boxes.
Qgis::WkbType wkbType() const
Returns the WKB type of the geometry.
virtual bool operator!=(const QgsAbstractGeometry &other) const =0
virtual QgsCoordinateSequence coordinateSequence() const =0
Retrieves the sequence of geometries, rings and nodes.
virtual bool operator==(const QgsAbstractGeometry &other) const =0
QgsAbstractGeometry()=default
virtual bool nextVertex(QgsVertexId &id, QgsPoint &vertex) const =0
Returns next vertex id and coordinates.
A 3-dimensional box composed of x, y, z coordinates.
Definition qgsbox3d.h:42
virtual bool equals(const QgsCurve &other) const =0
Checks whether this curve exactly equals another curve.
Qgis::AngularDirection orientation() const
Returns the curve's orientation, e.g.
Definition qgscurve.cpp:287
virtual int numPoints() const =0
Returns the number of points in the curve.
double mSummedUpArea3D
Definition qgscurve.h:404
double sinuosity() const
Returns the curve sinuosity, which is the ratio of the curve length() to curve straightDistance2d().
Definition qgscurve.cpp:278
bool mHasCachedSummedUpArea
Definition qgscurve.h:401
void normalize() final
Reorganizes the geometry into a normalized form (or "canonical" form).
Definition qgscurve.cpp:212
QPainterPath asQPainterPath() const override
Returns the geometry represented as a QPainterPath.
Definition qgscurve.cpp:71
virtual void scroll(int firstVertexIndex)=0
Scrolls the curve vertices so that they start with the vertex at the given index.
int partCount() const override
Returns count of parts contained in the geometry.
Definition qgscurve.cpp:194
QgsCurve * segmentize(double tolerance=M_PI_2/90, SegmentationToleranceType toleranceType=MaximumAngle) const override
Returns a geometry without curves.
Definition qgscurve.cpp:176
virtual bool isRing() const
Returns true if the curve is a ring.
Definition qgscurve.cpp:66
virtual bool pointAt(int node, QgsPoint &point, Qgis::VertexType &type) const =0
Returns the point and vertex id of a point within the curve.
QgsBox3D boundingBox3D() const override
Returns the 3D bounding box for the geometry.
Definition qgscurve.cpp:239
virtual QgsCurve * curveSubstring(double startDistance, double endDistance) const =0
Returns a new curve representing a substring of this curve.
bool mHasCachedSummedUpArea3D
Definition qgscurve.h:403
virtual bool isClosed() const
Returns true if the curve is closed.
Definition qgscurve.cpp:54
static const QgsCurve * cast(const QgsAbstractGeometry *geom)
Cast the geom to a QgsCurve.
Definition qgscurve.h:329
bool isValid(QString &error, Qgis::GeometryValidityFlags flags=Qgis::GeometryValidityFlags()) const override
Checks validity of the geometry, and returns true if the geometry is valid.
Definition qgscurve.cpp:248
virtual bool isClosed2D() const
Returns true if the curve is closed.
Definition qgscurve.cpp:42
int vertexCount(int part=0, int ring=0) const override
Returns the number of vertices of which this geometry is built.
Definition qgscurve.cpp:181
QgsPoint vertexAt(QgsVertexId id) const override
Returns the point corresponding to a specified vertex id.
Definition qgscurve.cpp:199
virtual QPolygonF asQPolygonF() const
Returns a QPolygonF representing the points.
Definition qgscurve.cpp:267
virtual void addToPainterPath(QPainterPath &path) const =0
Adds a curve to a painter path.
virtual int indexOf(const QgsPoint &point) const =0
Returns the index of the first vertex matching the given point, or -1 if a matching vertex is not fou...
friend class TestQgsGeometry
Definition qgscurve.h:411
QgsCurve * toCurveType() const override
Returns the geometry converted to the more generic curve type.
Definition qgscurve.cpp:207
virtual void sumUpArea(double &sum) const =0
Sums up the area of the curve by iterating over the vertices (shoelace formula).
bool snapToGridPrivate(double hSpacing, double vSpacing, double dSpacing, double mSpacing, const QVector< double > &srcX, const QVector< double > &srcY, const QVector< double > &srcZ, const QVector< double > &srcM, QVector< double > &outX, QVector< double > &outY, QVector< double > &outZ, QVector< double > &outM, bool removeRedundantPoints) const
Helper function for QgsCurve subclasses to snap to grids.
Definition qgscurve.cpp:319
QString asKml(int precision=17) const override
Returns a KML representation of the geometry.
Definition qgscurve.cpp:165
QgsBox3D mBoundingBox
Cached bounding box.
Definition qgscurve.h:399
virtual QgsPoint * interpolatePoint(double distance) const =0
Returns an interpolated point on the curve at the specified distance.
QgsCurve * clone() const override=0
Clones the geometry by performing a deep copy.
virtual double distanceBetweenVertices(QgsVertexId fromVertex, QgsVertexId toVertex) const =0
Returns the distance along the curve between two vertices.
virtual double xAt(int index) const =0
Returns the x-coordinate of the specified node in the line string.
int ringCount(int part=0) const override
Returns the number of rings of which this geometry is built.
Definition qgscurve.cpp:188
virtual QgsPoint startPoint() const =0
Returns the starting point of the curve.
static QgsCurve * cast(QgsAbstractGeometry *geom)
Cast the geom to a QgsCurve.
Definition qgscurve.h:350
double straightDistance2d() const
Returns the straight distance of the curve, i.e.
Definition qgscurve.cpp:273
virtual std::tuple< std::unique_ptr< QgsCurve >, std::unique_ptr< QgsCurve > > splitCurveAtVertex(int index) const =0
Splits the curve at the specified vertex index, returning two curves which represent the portion of t...
bool nextVertex(QgsVertexId &id, QgsPoint &vertex) const override
Returns next vertex id and coordinates.
Definition qgscurve.cpp:88
virtual double zAt(int index) const =0
Returns the z-coordinate of the specified node in the line string.
virtual QgsCurve * reversed() const =0
Returns a reversed copy of the curve, where the direction of the curve has been flipped.
virtual void drawAsPolygon(QPainter &p) const =0
Draws the curve as a polygon on the specified QPainter.
virtual double mAt(int index) const =0
Returns the m-coordinate of the specified node in the line string.
virtual QgsPoint endPoint() const =0
Returns the end point of the curve.
virtual double yAt(int index) const =0
Returns the y-coordinate of the specified node in the line string.
virtual void points(QgsPointSequence &pt) const =0
Returns a list of points within the curve.
virtual QgsLineString * curveToLine(double tolerance=M_PI_2/90, SegmentationToleranceType toleranceType=MaximumAngle) const =0
Returns a new line string geometry corresponding to a segmentized approximation of the curve.
double mSummedUpArea
Definition qgscurve.h:402
virtual void sumUpArea3D(double &sum) const =0
Sums up the 3d area of the curve by iterating over the vertices (shoelace formula).
QgsCurve()=default
Line string geometry type, with support for z-dimension and m-values.
Point geometry type, with support for z-dimension and m-values.
Definition qgspoint.h:49
static Qgis::GeometryType geometryType(Qgis::WkbType type)
Returns the geometry type for a WKB type, e.g., both MultiPolygon and CurvePolygon would have a Polyg...
static Q_INVOKABLE bool isSingleType(Qgis::WkbType type)
Returns true if the WKB type is a single type.
#define SIP_OUT
Definition qgis_sip.h:58
#define SIP_ABSTRACT
Definition qgis_sip.h:221
#define SIP_HOLDGIL
Definition qgis_sip.h:179
#define SIP_FACTORY
Definition qgis_sip.h:84
QVector< QgsRingSequence > QgsCoordinateSequence
QVector< QgsPoint > QgsPointSequence
Utility class for identifying a unique vertex within a geometry.
Definition qgsvertexid.h:30