QGIS API Documentation 4.1.0-Master (60fea48833c)
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 QgsCurve *toCurveType() const override SIP_FACTORY;
197 void normalize() final SIP_HOLDGIL;
198
199 QgsBox3D boundingBox3D() const override;
200 bool isValid( QString &error SIP_OUT, Qgis::GeometryValidityFlags flags = Qgis::GeometryValidityFlags() ) const override;
201
207 virtual double xAt( int index ) const = 0;
208
214 virtual double yAt( int index ) const = 0;
215
222 virtual double zAt( int index ) const = 0;
223
230 virtual double mAt( int index ) const = 0;
231
235 virtual QPolygonF asQPolygonF() const;
236
248 virtual QgsPoint *interpolatePoint( double distance ) const = 0 SIP_FACTORY;
249
262 virtual QgsCurve *curveSubstring( double startDistance, double endDistance ) const = 0 SIP_FACTORY;
263
271 double straightDistance2d() const;
272
282 double sinuosity() const;
283
291 Qgis::AngularDirection orientation() const;
292
304 virtual void scroll( int firstVertexIndex ) = 0;
305
320 virtual double distanceBetweenVertices( QgsVertexId fromVertex, QgsVertexId toVertex ) const = 0;
321
322#ifndef SIP_RUN
323
332 inline static const QgsCurve *cast( const QgsAbstractGeometry *geom )
333 {
334 if ( !geom )
335 return nullptr;
336
337 const Qgis::WkbType type = geom->wkbType();
339 {
340 return static_cast<const QgsCurve *>( geom );
341 }
342 return nullptr;
343 }
344
353 inline static QgsCurve *cast( QgsAbstractGeometry *geom )
354 {
355 if ( !geom )
356 return nullptr;
357
358 const Qgis::WkbType type = geom->wkbType();
360 {
361 return static_cast<QgsCurve *>( geom );
362 }
363 return nullptr;
364 }
365
376 virtual std::tuple< std::unique_ptr< QgsCurve >, std::unique_ptr< QgsCurve > > splitCurveAtVertex( int index ) const = 0;
377
378#endif
379
380
381 protected:
382
383 void clearCache() const override;
384
385 int childCount() const override;
386 QgsPoint childPoint( int index ) const override;
387#ifndef SIP_RUN
388
393 bool snapToGridPrivate( double hSpacing, double vSpacing, double dSpacing, double mSpacing,
394 const QVector<double> &srcX, const QVector<double> &srcY, const QVector<double> &srcZ, const QVector<double> &srcM,
395 QVector<double> &outX, QVector<double> &outY, QVector<double> &outZ, QVector<double> &outM,
396 bool removeRedundantPoints ) const;
397#endif
398
403
404 mutable bool mHasCachedSummedUpArea = false;
405 mutable double mSummedUpArea = 0;
406 mutable bool mHasCachedSummedUpArea3D = false;
407 mutable double mSummedUpArea3D = 0;
408
409 private:
410
411 mutable bool mHasCachedValidity = false;
412 mutable QString mValidityFailureReason;
413
414 friend class TestQgsGeometry;
415};
416
417#endif // QGSCURVE_H
Provides global constants and enumerations for use throughout the application.
Definition qgis.h:62
VertexType
Types of vertex.
Definition qgis.h:3179
@ 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:286
virtual int numPoints() const =0
Returns the number of points in the curve.
double mSummedUpArea3D
Definition qgscurve.h:407
double sinuosity() const
Returns the curve sinuosity, which is the ratio of the curve length() to curve straightDistance2d().
Definition qgscurve.cpp:277
bool mHasCachedSummedUpArea
Definition qgscurve.h:404
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:406
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:332
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:266
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:414
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:318
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:402
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:353
double straightDistance2d() const
Returns the straight distance of the curve, i.e.
Definition qgscurve.cpp:272
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:405
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:34