QGIS API Documentation 4.1.0-Master (31622b25bb0)
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 QgsCurve() = default;
39
43 virtual bool equals( const QgsCurve &other ) const = 0;
44
45 bool operator==( const QgsAbstractGeometry &other ) const override;
46 bool operator!=( const QgsAbstractGeometry &other ) const override;
47
48 QgsCurve *clone() const override = 0 SIP_FACTORY;
49
54 virtual QgsPoint startPoint() const = 0;
55
60 virtual QgsPoint endPoint() const = 0;
61
62 // clang-format off
68 virtual bool isClosed() const SIP_HOLDGIL;
69 // clang-format on
70
80 virtual bool isClosed2D() const SIP_HOLDGIL;
81
85 virtual bool isRing() const SIP_HOLDGIL;
86
96 virtual QgsLineString *curveToLine( double tolerance = M_PI_2 / 90, SegmentationToleranceType toleranceType = MaximumAngle ) const = 0 SIP_FACTORY;
97
101 virtual void addToPainterPath( QPainterPath &path ) const = 0;
102 QPainterPath asQPainterPath() const override;
103
108 virtual void drawAsPolygon( QPainter &p ) const = 0;
109
113 virtual void points( QgsPointSequence &pt SIP_OUT ) const = 0;
114
118 virtual int numPoints() const = 0;
119
120#ifdef SIP_RUN
121// clang-format off
122 int __len__() const;
123 % Docstring
124 Returns the number of points in the curve.
125 % End
126 % MethodCode
127 sipRes = sipCpp->numPoints();
128 % End
129
131 int __bool__() const;
132 % MethodCode
133 sipRes = true;
134 % End
135// clang-format on
136#endif
137
141 virtual void sumUpArea( double &sum SIP_OUT ) const = 0;
142
148 virtual void sumUpArea3D( double &sum SIP_OUT ) const = 0;
149
151 bool nextVertex( QgsVertexId &id, QgsPoint &vertex SIP_OUT ) const override;
152 void adjacentVertices( QgsVertexId vertex, QgsVertexId &previousVertex SIP_OUT, QgsVertexId &nextVertex SIP_OUT ) const override;
153 int vertexNumberFromVertexId( QgsVertexId id ) const override;
154
162 virtual bool pointAt( int node, QgsPoint &point SIP_OUT, Qgis::VertexType &type SIP_OUT ) const = 0;
163
174 virtual int indexOf( const QgsPoint &point ) const = 0;
175
179 virtual QgsCurve *reversed() const = 0 SIP_FACTORY;
180
181 QgsAbstractGeometry *boundary() const override SIP_FACTORY;
182
183 QString asKml( int precision = 17 ) const override;
184
190 QgsCurve *segmentize( double tolerance = M_PI_2 / 90, SegmentationToleranceType toleranceType = MaximumAngle ) const override SIP_FACTORY;
191
192 int vertexCount( int part = 0, int ring = 0 ) const override;
193 int ringCount( int part = 0 ) const override;
194 int partCount() const override;
195 QgsPoint vertexAt( QgsVertexId id ) const override;
196 bool hasVertex( QgsVertexId position ) const override;
197 QgsCurve *toCurveType() const override SIP_FACTORY;
198 void normalize() final SIP_HOLDGIL;
199
200 QgsBox3D boundingBox3D() const override;
201 bool isValid( QString &error SIP_OUT, Qgis::GeometryValidityFlags flags = Qgis::GeometryValidityFlags() ) const override;
202
208 virtual double xAt( int index ) const = 0;
209
215 virtual double yAt( int index ) const = 0;
216
223 virtual double zAt( int index ) const = 0;
224
231 virtual double mAt( int index ) const = 0;
232
236 virtual QPolygonF asQPolygonF() const;
237
249 virtual QgsPoint *interpolatePoint( double distance ) const = 0 SIP_FACTORY;
250
263 virtual QgsCurve *curveSubstring( double startDistance, double endDistance ) const = 0 SIP_FACTORY;
264
272 double straightDistance2d() const;
273
283 double sinuosity() const;
284
292 Qgis::AngularDirection orientation() const;
293
305 virtual void scroll( int firstVertexIndex ) = 0;
306
321 virtual double distanceBetweenVertices( QgsVertexId fromVertex, QgsVertexId toVertex ) const = 0;
322
323#ifndef SIP_RUN
324
333 inline static const QgsCurve *cast( const QgsAbstractGeometry *geom )
334 {
335 if ( !geom )
336 return nullptr;
337
338 const Qgis::WkbType type = geom->wkbType();
340 {
341 return static_cast<const QgsCurve *>( geom );
342 }
343 return nullptr;
344 }
345
354 inline static QgsCurve *cast( QgsAbstractGeometry *geom )
355 {
356 if ( !geom )
357 return nullptr;
358
359 const Qgis::WkbType type = geom->wkbType();
361 {
362 return static_cast<QgsCurve *>( geom );
363 }
364 return nullptr;
365 }
366
377 virtual std::tuple< std::unique_ptr< QgsCurve >, std::unique_ptr< QgsCurve > > splitCurveAtVertex( int index ) const = 0;
378
379#endif
380
381
382 protected:
383
384 void clearCache() const override;
385
386 int childCount() const override;
387 QgsPoint childPoint( int index ) const override;
388#ifndef SIP_RUN
389
394 bool snapToGridPrivate( double hSpacing, double vSpacing, double dSpacing, double mSpacing,
395 const QVector<double> &srcX, const QVector<double> &srcY, const QVector<double> &srcZ, const QVector<double> &srcM,
396 QVector<double> &outX, QVector<double> &outY, QVector<double> &outZ, QVector<double> &outM,
397 bool removeRedundantPoints ) const;
398#endif
399
404
405 mutable bool mHasCachedSummedUpArea = false;
406 mutable double mSummedUpArea = 0;
407 mutable bool mHasCachedSummedUpArea3D = false;
408 mutable double mSummedUpArea3D = 0;
409
410 private:
411
412 mutable bool mHasCachedValidity = false;
413 mutable QString mValidityFailureReason;
414
415 friend class TestQgsGeometry;
416};
417
418#endif // QGSCURVE_H
Provides global constants and enumerations for use throughout the application.
Definition qgis.h:62
VertexType
Types of vertex.
Definition qgis.h:3246
@ Line
Lines.
Definition qgis.h:381
WkbType
The WKB type describes the number of dimensions a geometry has.
Definition qgis.h:294
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:45
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:291
virtual int numPoints() const =0
Returns the number of points in the curve.
double mSummedUpArea3D
Definition qgscurve.h:408
double sinuosity() const
Returns the curve sinuosity, which is the ratio of the curve length() to curve straightDistance2d().
Definition qgscurve.cpp:282
bool mHasCachedSummedUpArea
Definition qgscurve.h:405
void normalize() final
Reorganizes the geometry into a normalized form (or "canonical" form).
Definition qgscurve.cpp:211
QPainterPath asQPainterPath() const override
Returns the geometry represented as a QPainterPath.
Definition qgscurve.cpp:70
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:193
QgsCurve * segmentize(double tolerance=M_PI_2/90, SegmentationToleranceType toleranceType=MaximumAngle) const override
Returns a geometry without curves.
Definition qgscurve.cpp:175
virtual bool isRing() const
Returns true if the curve is a ring.
Definition qgscurve.cpp:65
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:238
virtual QgsCurve * curveSubstring(double startDistance, double endDistance) const =0
Returns a new curve representing a substring of this curve.
bool mHasCachedSummedUpArea3D
Definition qgscurve.h:407
virtual bool isClosed() const
Returns true if the curve is closed.
Definition qgscurve.cpp:53
static const QgsCurve * cast(const QgsAbstractGeometry *geom)
Cast the geom to a QgsCurve.
Definition qgscurve.h:333
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:247
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:180
QgsPoint vertexAt(QgsVertexId id) const override
Returns the point corresponding to a specified vertex id.
Definition qgscurve.cpp:198
virtual QPolygonF asQPolygonF() const
Returns a QPolygonF representing the points.
Definition qgscurve.cpp:271
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:415
QgsCurve * toCurveType() const override
Returns the geometry converted to the more generic curve type.
Definition qgscurve.cpp:206
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:323
QString asKml(int precision=17) const override
Returns a KML representation of the geometry.
Definition qgscurve.cpp:164
QgsBox3D mBoundingBox
Cached bounding box.
Definition qgscurve.h:403
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:187
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:354
double straightDistance2d() const
Returns the straight distance of the curve, i.e.
Definition qgscurve.cpp:277
bool hasVertex(QgsVertexId position) const override
Returns true if the geometry contains a vertex matching the given position.
Definition qgscurve.cpp:266
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:87
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:406
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:53
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:57
#define SIP_ABSTRACT
Definition qgis_sip.h:220
#define SIP_HOLDGIL
Definition qgis_sip.h:178
#define SIP_FACTORY
Definition qgis_sip.h:83
QVector< QgsRingSequence > QgsCoordinateSequence
QVector< QgsPoint > QgsPointSequence
Utility class for identifying a unique vertex within a geometry.
Definition qgsvertexid.h:35