QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
qgsabstractgeometry.h
Go to the documentation of this file.
1/***************************************************************************
2 qgsabstractgeometry.h
3 -------------------------------------------------------------------
4Date : 04 Sept 2014
5Copyright : (C) 2014 by Marco Hugentobler
6email : marco.hugentobler at sourcepole dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
16#ifndef QGSABSTRACTGEOMETRYV2
17#define QGSABSTRACTGEOMETRYV2
18
19#include <array>
20#include <functional>
21#include <type_traits>
22#include <QString>
23
24#include "qgis_core.h"
25#include "qgis.h"
26#include "qgswkbtypes.h"
27#include "qgswkbptr.h"
28
29#ifndef SIP_RUN
30#include "json_fwd.hpp"
31using namespace nlohmann;
32#endif
33
34class QgsMapToPixel;
35class QgsCurve;
36class QgsMultiCurve;
37class QgsMultiPoint;
38
39struct QgsVertexId;
41class QPainter;
42class QDomDocument;
43class QDomElement;
46class QgsConstWkbPtr;
47class QPainterPath;
49class QgsFeedback;
51class QgsPoint;
52class QgsRectangle;
53class QgsBox3D;
54
55typedef QVector< QgsPoint > QgsPointSequence;
56#ifndef SIP_RUN
57typedef QVector< QgsPointSequence > QgsRingSequence;
58typedef QVector< QgsRingSequence > QgsCoordinateSequence;
59#else
60typedef QVector< QVector< QgsPoint > > QgsRingSequence;
61typedef QVector< QVector< QVector< QgsPoint > > > QgsCoordinateSequence;
62#endif
63
64
79class CORE_EXPORT QgsAbstractGeometry
80{
81
82#ifdef SIP_RUN
84 if ( qgsgeometry_cast<QgsPoint *>( sipCpp ) != nullptr )
85 sipType = sipType_QgsPoint;
86 else if ( qgsgeometry_cast<QgsLineString *>( sipCpp ) != nullptr )
87 sipType = sipType_QgsLineString;
88 else if ( qgsgeometry_cast<QgsCircularString *>( sipCpp ) != nullptr )
89 sipType = sipType_QgsCircularString;
90 else if ( qgsgeometry_cast<QgsCompoundCurve *>( sipCpp ) != nullptr )
91 sipType = sipType_QgsCompoundCurve;
92 else if ( qgsgeometry_cast<QgsTriangle *>( sipCpp ) != nullptr )
93 sipType = sipType_QgsTriangle;
94 else if ( qgsgeometry_cast<QgsPolygon *>( sipCpp ) != nullptr )
95 sipType = sipType_QgsPolygon;
96 else if ( qgsgeometry_cast<QgsCurvePolygon *>( sipCpp ) != nullptr )
97 sipType = sipType_QgsCurvePolygon;
98 else if ( qgsgeometry_cast<QgsMultiPoint *>( sipCpp ) != nullptr )
99 sipType = sipType_QgsMultiPoint;
100 else if ( qgsgeometry_cast<QgsMultiLineString *>( sipCpp ) != nullptr )
101 sipType = sipType_QgsMultiLineString;
102 else if ( qgsgeometry_cast<QgsMultiPolygon *>( sipCpp ) != nullptr )
103 sipType = sipType_QgsMultiPolygon;
104 else if ( qgsgeometry_cast<QgsMultiSurface *>( sipCpp ) != nullptr )
105 sipType = sipType_QgsMultiSurface;
106 else if ( qgsgeometry_cast<QgsMultiCurve *>( sipCpp ) != nullptr )
107 sipType = sipType_QgsMultiCurve;
108 else if ( qgsgeometry_cast<QgsGeometryCollection *>( sipCpp ) != nullptr )
109 sipType = sipType_QgsGeometryCollection;
110 else
111 sipType = 0;
112 SIP_END
113#endif
114
115 Q_GADGET
116
117 public:
118
121 {
122
127 MaximumAngle = 0,
128
133 MaximumDifference
134 };
135 Q_ENUM( SegmentationToleranceType )
136
137
139 {
140
144 XY = 0,
145
149 YX
150 };
152
153
157 virtual ~QgsAbstractGeometry() = default;
159 QgsAbstractGeometry &operator=( const QgsAbstractGeometry &geom );
160
161 virtual bool operator==( const QgsAbstractGeometry &other ) const = 0;
162 virtual bool operator!=( const QgsAbstractGeometry &other ) const = 0;
163
174 virtual bool fuzzyEqual( const QgsAbstractGeometry &other, double epsilon = 1e-8 ) const = 0;
175
189 virtual bool fuzzyDistanceEqual( const QgsAbstractGeometry &other, double epsilon = 1e-8 ) const = 0;
190
194 virtual QgsAbstractGeometry *clone() const = 0 SIP_FACTORY;
195
201 virtual int compareTo( const QgsAbstractGeometry *other ) const;
202
206 virtual void clear() = 0;
207
211 virtual QgsRectangle boundingBox() const;
212
218 virtual QgsBox3D boundingBox3D() const = 0;
219
220 //mm-sql interface
221
226 virtual int dimension() const = 0;
227
233 virtual QString geometryType() const = 0;
234
240 inline Qgis::WkbType wkbType() const SIP_HOLDGIL { return mWkbType; }
241
247 QString wktTypeStr() const;
248
253 bool is3D() const SIP_HOLDGIL
254 {
255 return QgsWkbTypes::hasZ( mWkbType );
256 }
257
263 {
264 return QgsWkbTypes::hasM( mWkbType );
265 }
266
273
283 virtual void normalize() = 0;
284
285 //import
286
292 virtual bool fromWkb( QgsConstWkbPtr &wkb ) = 0;
293
298 virtual bool fromWkt( const QString &wkt ) = 0;
299
300 //export
301
307 {
308 FlagExportTrianglesAsPolygons = 1 << 0,
309 FlagExportNanAsDoubleMin = 1 << 1,
310 };
311 Q_DECLARE_FLAGS( WkbFlags, WkbFlag )
312
313
320 virtual int wkbSize( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const = 0;
321
332 virtual QByteArray asWkb( WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const = 0;
333
342 virtual QString asWkt( int precision = 17 ) const = 0;
343
355 virtual QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const = 0;
356
368 virtual QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const = 0;
369
379 QString asJson( int precision = 17 );
380
391 virtual json asJsonObject( int precision = 17 ) SIP_SKIP const;
392
397 virtual QString asKml( int precision = 17 ) const = 0;
398
399
400 //render pipeline
401
412 virtual void transform( const QgsCoordinateTransform &ct, Qgis::TransformDirection d = Qgis::TransformDirection::Forward, bool transformZ = false ) SIP_THROW( QgsCsException ) = 0;
413
420 virtual void transform( const QTransform &t, double zTranslate = 0.0, double zScale = 1.0,
421 double mTranslate = 0.0, double mScale = 1.0 ) = 0;
422
427 virtual void draw( QPainter &p ) const = 0;
428
437 virtual QPainterPath asQPainterPath() const = 0;
438
448 virtual int vertexNumberFromVertexId( QgsVertexId id ) const = 0;
449
457 virtual bool nextVertex( QgsVertexId &id, QgsPoint &vertex SIP_OUT ) const = 0;
458
462 virtual void adjacentVertices( QgsVertexId vertex, QgsVertexId &previousVertex SIP_OUT, QgsVertexId &nextVertex SIP_OUT ) const = 0;
463
468 virtual QgsCoordinateSequence coordinateSequence() const = 0;
469
473 virtual int nCoordinates() const;
474
478 virtual QgsPoint vertexAt( QgsVertexId id ) const = 0;
479
492 virtual double closestSegment( const QgsPoint &pt, QgsPoint &segmentPt SIP_OUT,
493 QgsVertexId &vertexAfter SIP_OUT,
494 int *leftOf SIP_OUT = nullptr, double epsilon = 4 * std::numeric_limits<double>::epsilon() ) const = 0;
495
496 //low-level editing
497
506 virtual bool insertVertex( QgsVertexId position, const QgsPoint &vertex ) = 0;
507
516 virtual bool moveVertex( QgsVertexId position, const QgsPoint &newPos ) = 0;
517
525 virtual bool deleteVertex( QgsVertexId position ) = 0;
526
539 virtual double length() const;
540
553 virtual double perimeter() const;
554
567 virtual double area() const;
568
576 virtual double segmentLength( QgsVertexId startVertex ) const = 0;
577
579 virtual QgsPoint centroid() const;
580
584 virtual bool isEmpty() const;
585
589 virtual bool hasCurvedSegments() const;
590
599 virtual bool boundingBoxIntersects( const QgsRectangle &rectangle ) const SIP_HOLDGIL;
600
609 virtual bool boundingBoxIntersects( const QgsBox3D &box3d ) const SIP_HOLDGIL;
610
617 virtual QgsAbstractGeometry *segmentize( double tolerance = M_PI / 180., SegmentationToleranceType toleranceType = MaximumAngle ) const SIP_FACTORY;
618
625 virtual QgsAbstractGeometry *toCurveType() const = 0 SIP_FACTORY;
626
648 virtual QgsAbstractGeometry *snappedToGrid( double hSpacing, double vSpacing, double dSpacing = 0, double mSpacing = 0 ) const = 0 SIP_FACTORY;
649
669 virtual bool removeDuplicateNodes( double epsilon = 4 * std::numeric_limits<double>::epsilon(), bool useZValues = false ) = 0;
670
678 virtual double vertexAngle( QgsVertexId vertex ) const = 0;
679
683 virtual int vertexCount( int part = 0, int ring = 0 ) const = 0;
684
688 virtual int ringCount( int part = 0 ) const = 0;
689
695 virtual int partCount() const = 0;
696
704 virtual bool addZValue( double zValue = 0 ) = 0;
705
713 virtual bool addMValue( double mValue = 0 ) = 0;
714
721 virtual bool dropZValue() = 0;
722
729 virtual bool dropMValue() = 0;
730
737 virtual void swapXy() = 0;
738
743 virtual bool convertTo( Qgis::WkbType type );
744
763 virtual const QgsAbstractGeometry *simplifiedTypeRef() const SIP_HOLDGIL;
764
776 virtual bool isValid( QString &error SIP_OUT, Qgis::GeometryValidityFlags flags = Qgis::GeometryValidityFlags() ) const = 0;
777
791 virtual bool transform( QgsAbstractGeometryTransformer *transformer, QgsFeedback *feedback = nullptr ) = 0;
792
793#ifndef SIP_RUN
794
804 virtual void filterVertices( const std::function< bool( const QgsPoint & ) > &filter );
805
820 virtual void transformVertices( const std::function< QgsPoint( const QgsPoint & ) > &transform );
821
827 class CORE_EXPORT part_iterator
828 {
829 private:
830
831 int mIndex = 0;
832 QgsAbstractGeometry *mGeometry = nullptr;
833
834 public:
836 part_iterator() = default;
837
839 part_iterator( QgsAbstractGeometry *g, int index );
840
845 part_iterator &operator++();
846
848 part_iterator operator++( int );
849
852
854 int partNumber() const;
855
856 bool operator==( part_iterator other ) const;
857 bool operator!=( part_iterator other ) const { return !( *this == other ); }
858 };
859
869 {
870 return part_iterator( this, 0 );
871 }
872
881 part_iterator parts_end();
882
890 QgsGeometryConstPartIterator parts() const;
891
897 class CORE_EXPORT const_part_iterator
898 {
899 private:
900
901 int mIndex = 0;
902 const QgsAbstractGeometry *mGeometry = nullptr;
903
904 public:
907
909 const_part_iterator( const QgsAbstractGeometry *g, int index );
910
915 const_part_iterator &operator++();
916
918 const_part_iterator operator++( int );
919
921 const QgsAbstractGeometry *operator*() const;
922
924 int partNumber() const;
925
926 bool operator==( const_part_iterator other ) const;
927 bool operator!=( const_part_iterator other ) const { return !( *this == other ); }
928 };
929
938 {
939 return const_part_iterator( this, 0 );
940 }
941
949 const_part_iterator const_parts_end() const;
950
951
956 class CORE_EXPORT vertex_iterator
957 {
958 private:
959
965 struct Level
966 {
967 const QgsAbstractGeometry *g = nullptr;
968 int index = 0;
969
970 bool operator==( const Level &other ) const;
971 };
972
973 std::array<Level, 3> levels;
974 int depth = -1;
975
976 void digDown();
977
978 public:
980 vertex_iterator() = default;
981
983 vertex_iterator( const QgsAbstractGeometry *g, int index );
984
989 vertex_iterator &operator++();
990
992 vertex_iterator operator++( int );
993
995 QgsPoint operator*() const;
996
998 QgsVertexId vertexId() const;
999
1000 bool operator==( const vertex_iterator &other ) const;
1001 bool operator!=( const vertex_iterator &other ) const { return !( *this == other ); }
1002 };
1003
1012 {
1013 return vertex_iterator( this, 0 );
1014 }
1015
1024 {
1025 return vertex_iterator( this, childCount() );
1026 }
1027#endif
1028
1063
1064
1087 QgsVertexIterator vertices() const;
1088
1095
1096 protected:
1097
1104 int sortIndex() const;
1105
1116 virtual int compareToSameClass( const QgsAbstractGeometry *other ) const = 0;
1117
1122 virtual bool hasChildGeometries() const;
1123
1128 virtual int childCount() const { return 0; }
1129
1134 virtual QgsAbstractGeometry *childGeometry( int index ) const { Q_UNUSED( index ) return nullptr; }
1135
1140 virtual QgsPoint childPoint( int index ) const;
1141
1142 protected:
1144
1148 void setZMTypeFromSubGeometry( const QgsAbstractGeometry *subggeom, Qgis::WkbType baseGeomType );
1149
1154 virtual QgsRectangle calculateBoundingBox() const;
1155
1162 virtual QgsBox3D calculateBoundingBox3D() const;
1163
1167 virtual void clearCache() const;
1168
1169 friend class TestQgsGeometry;
1170};
1171
1172
1173#ifndef SIP_RUN
1174
1175template <class T>
1177{
1178 return const_cast<T>( std::remove_pointer<T>::type::cast( geom ) );
1179}
1180
1181#endif
1182
1183// clazy:excludeall=qstring-allocations
1184
1189class CORE_EXPORT QgsVertexIterator
1190{
1191 public:
1194
1197 : g( geometry )
1198 , i( g->vertices_begin() )
1199 , n( g->vertices_end() )
1200 {
1201 }
1202
1204 bool hasNext() const
1205 {
1206 return g && g->vertices_end() != i;
1207 }
1208
1210 QgsPoint next();
1211
1212#ifdef SIP_RUN
1213 QgsVertexIterator *__iter__();
1214 % MethodCode
1215 sipRes = sipCpp;
1216 % End
1217
1218 SIP_PYOBJECT __next__() SIP_TYPEHINT( QgsPoint );
1219 % MethodCode
1220 if ( sipCpp->hasNext() )
1221 sipRes = sipConvertFromType( new QgsPoint( sipCpp->next() ), sipType_QgsPoint, Py_None );
1222 else
1223 PyErr_SetString( PyExc_StopIteration, "" );
1224 % End
1225#endif
1226
1227 private:
1228 const QgsAbstractGeometry *g = nullptr;
1230
1231};
1232
1239{
1240 public:
1243
1246 : g( geometry )
1247 , i( g->parts_begin() )
1248 , n( g->parts_end() )
1249 {
1250 }
1251
1254 {
1255 return g && g->parts_end() != i;
1256 }
1257
1259 QgsAbstractGeometry *next();
1260
1261#ifdef SIP_RUN
1262 QgsGeometryPartIterator *__iter__();
1263 % MethodCode
1264 sipRes = sipCpp;
1265 % End
1266
1267 SIP_PYOBJECT __next__() SIP_TYPEHINT( QgsAbstractGeometry );
1268 % MethodCode
1269 if ( sipCpp->hasNext() )
1270 sipRes = sipConvertFromType( sipCpp->next(), sipType_QgsAbstractGeometry, NULL );
1271 else
1272 PyErr_SetString( PyExc_StopIteration, "" );
1273 % End
1274#endif
1275
1276 private:
1277 QgsAbstractGeometry *g = nullptr;
1279
1280};
1281
1282
1289{
1290 public:
1293
1296 : g( geometry )
1297 , i( g->const_parts_begin() )
1298 , n( g->const_parts_end() )
1299 {
1300 }
1301
1304 {
1305 return g && g->const_parts_end() != i;
1306 }
1307
1309 const QgsAbstractGeometry *next();
1310
1311#ifdef SIP_RUN
1312 QgsGeometryConstPartIterator *__iter__();
1313 % MethodCode
1314 sipRes = sipCpp;
1315 % End
1316
1317 SIP_PYOBJECT __next__() SIP_TYPEHINT( QgsAbstractGeometry );
1318 % MethodCode
1319 if ( sipCpp->hasNext() )
1320 sipRes = sipConvertFromType( const_cast< QgsAbstractGeometry * >( sipCpp->next() ), sipType_QgsAbstractGeometry, NULL );
1321 else
1322 PyErr_SetString( PyExc_StopIteration, "" );
1323 % End
1324#endif
1325
1326 private:
1327 const QgsAbstractGeometry *g = nullptr;
1329
1330};
1331
1333
1334#endif //QGSABSTRACTGEOMETRYV2
The Qgis class provides global constants for use throughout the application.
Definition: qgis.h:54
WkbType
The WKB type describes the number of dimensions a geometry has.
Definition: qgis.h:182
@ Unknown
Unknown.
An abstract base class for classes which transform geometries by transforming input points to output ...
The part_iterator class provides STL-style iterator for const references to geometry parts.
bool operator!=(const_part_iterator other) const
const_part_iterator()=default
Create invalid iterator.
The part_iterator class provides STL-style iterator for geometry parts.
part_iterator()=default
Create invalid iterator.
bool operator!=(part_iterator other) const
The vertex_iterator class provides STL-style iterator for vertices.
vertex_iterator()=default
Create invalid iterator.
bool operator!=(const vertex_iterator &other) const
Abstract base class for all geometries.
virtual bool fromWkb(QgsConstWkbPtr &wkb)=0
Sets the geometry from a WKB string.
SegmentationToleranceType
Segmentation tolerance as maximum angle or maximum difference between approximation and circle.
virtual QgsAbstractGeometry * boundary() const =0
Returns the closure of the combinatorial boundary of the geometry (ie the topological boundary of the...
vertex_iterator vertices_end() const
Returns STL-style iterator pointing to the imaginary vertex after the last vertex of the geometry.
bool isMeasure() const
Returns true if the geometry contains m values.
QFlags< WkbFlag > WkbFlags
virtual int childCount() const
Returns number of child geometries (for geometries with child geometries) or child points (for geomet...
bool is3D() const
Returns true if the geometry is 3D and contains a z-value.
AxisOrder
Axis order for GML generation.
virtual QgsAbstractGeometry * createEmptyWithSameType() const =0
Creates a new geometry with the same class and same WKB type as the original and transfers ownership.
virtual bool fromWkt(const QString &wkt)=0
Sets the geometry from a WKT string.
virtual void normalize()=0
Reorganizes the geometry into a normalized form (or "canonical" form).
vertex_iterator vertices_begin() const
Returns STL-style iterator pointing to the first vertex of the geometry.
WkbFlag
WKB export flags.
virtual QgsAbstractGeometry * childGeometry(int index) const
Returns pointer to child geometry (for geometries with child geometries - i.e.
const_part_iterator const_parts_begin() const
Returns STL-style iterator pointing to the const first part of the geometry.
virtual int compareToSameClass(const QgsAbstractGeometry *other) const =0
Compares to an other geometry of the same class, and returns a integer for sorting of the two geometr...
part_iterator parts_begin()
Returns STL-style iterator pointing to the first part of the geometry.
A 3-dimensional box composed of x, y, z coordinates.
Definition: qgsbox3d.h:43
A const WKB pointer.
Definition: qgswkbptr.h:138
Class for doing transforms between two map coordinate systems.
Custom exception class for Coordinate Reference System related exceptions.
Definition: qgsexception.h:67
Abstract base class for curved geometry type.
Definition: qgscurve.h:35
Base class for feedback objects to be used for cancellation of something running in a worker thread.
Definition: qgsfeedback.h:44
Java-style iterator for const traversal of parts of a geometry.
QgsGeometryConstPartIterator(const QgsAbstractGeometry *geometry)
Constructs iterator for the given geometry.
bool hasNext() const
Find out whether there are more parts.
QgsGeometryConstPartIterator()=default
Constructor for QgsGeometryConstPartIterator.
Java-style iterator for traversal of parts of a geometry.
QgsGeometryPartIterator()=default
Constructor for QgsGeometryPartIterator.
bool hasNext() const
Find out whether there are more parts.
QgsGeometryPartIterator(QgsAbstractGeometry *geometry)
Constructs iterator for the given geometry.
Perform transforms between map coordinates and device coordinates.
Definition: qgsmaptopixel.h:39
Multi curve geometry collection.
Definition: qgsmulticurve.h:29
Multi point geometry collection.
Definition: qgsmultipoint.h:29
Point geometry type, with support for z-dimension and m-values.
Definition: qgspoint.h:49
A rectangle specified with double values.
Definition: qgsrectangle.h:42
Java-style iterator for traversal of vertices of a geometry.
bool hasNext() const
Find out whether there are more vertices.
QgsVertexIterator()=default
Constructor for QgsVertexIterator.
QgsVertexIterator(const QgsAbstractGeometry *geometry)
Constructs iterator for the given geometry.
static bool hasZ(Qgis::WkbType type)
Tests whether a WKB type contains the z-dimension.
Definition: qgswkbtypes.h:973
static bool hasM(Qgis::WkbType type)
Tests whether a WKB type contains m values.
Definition: qgswkbtypes.h:1023
double ANALYSIS_EXPORT leftOf(const QgsPoint &thepoint, const QgsPoint *p1, const QgsPoint *p2)
Returns whether 'thepoint' is left or right of the line from 'p1' to 'p2'. Negative values mean left ...
Definition: MathUtils.cpp:222
CORE_EXPORT QgsMeshVertex centroid(const QgsMeshFace &face, const QVector< QgsMeshVertex > &vertices)
Returns the centroid of the face.
#define SIP_TYPEHINT(type)
Definition: qgis_sip.h:232
#define SIP_CONVERT_TO_SUBCLASS_CODE(code)
Definition: qgis_sip.h:191
#define SIP_ENUM_BASETYPE(type)
Definition: qgis_sip.h:278
#define SIP_SKIP
Definition: qgis_sip.h:126
#define SIP_OUT
Definition: qgis_sip.h:58
#define SIP_HOLDGIL
Definition: qgis_sip.h:171
#define SIP_FACTORY
Definition: qgis_sip.h:76
#define SIP_THROW(name,...)
Definition: qgis_sip.h:203
#define SIP_END
Definition: qgis_sip.h:208
T qgsgeometry_cast(const QgsAbstractGeometry *geom)
QVector< QgsRingSequence > QgsCoordinateSequence
QVector< QgsPointSequence > QgsRingSequence
QVector< QgsPoint > QgsPointSequence
bool operator==(const QgsFeatureIterator &fi1, const QgsFeatureIterator &fi2)
QgsMargins operator*(const QgsMargins &margins, double factor)
Returns a QgsMargins object that is formed by multiplying each component of the given margins by fact...
Definition: qgsmargins.h:241
Q_DECLARE_OPERATORS_FOR_FLAGS(QgsTextRendererUtils::CurvedTextFlags)
double closestSegment(const QgsPolylineXY &pl, const QgsPointXY &pt, int &vertexAfter, double epsilon)
Definition: qgstracer.cpp:69
int precision
Utility class for identifying a unique vertex within a geometry.
Definition: qgsvertexid.h:30