QGIS API Documentation 3.30.0-'s-Hertogenbosch (f186b8efe0)
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;
53
54typedef QVector< QgsPoint > QgsPointSequence;
55#ifndef SIP_RUN
56typedef QVector< QgsPointSequence > QgsRingSequence;
57typedef QVector< QgsRingSequence > QgsCoordinateSequence;
58#else
59typedef QVector< QVector< QgsPoint > > QgsRingSequence;
60typedef QVector< QVector< QVector< QgsPoint > > > QgsCoordinateSequence;
61#endif
62
63
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
167 virtual QgsAbstractGeometry *clone() const = 0 SIP_FACTORY;
168
174 virtual int compareTo( const QgsAbstractGeometry *other ) const;
175
179 virtual void clear() = 0;
180
184 virtual QgsRectangle boundingBox() const = 0;
185
186 //mm-sql interface
187
192 virtual int dimension() const = 0;
193
199 virtual QString geometryType() const = 0;
200
206 inline Qgis::WkbType wkbType() const SIP_HOLDGIL { return mWkbType; }
207
213 QString wktTypeStr() const;
214
219 bool is3D() const SIP_HOLDGIL
220 {
221 return QgsWkbTypes::hasZ( mWkbType );
222 }
223
229 {
230 return QgsWkbTypes::hasM( mWkbType );
231 }
232
240
250 virtual void normalize() = 0;
251
252 //import
253
259 virtual bool fromWkb( QgsConstWkbPtr &wkb ) = 0;
260
265 virtual bool fromWkt( const QString &wkt ) = 0;
266
267 //export
268
274 {
275 FlagExportTrianglesAsPolygons = 1 << 0,
276 FlagExportNanAsDoubleMin = 1 << 1,
277 };
278 Q_DECLARE_FLAGS( WkbFlags, WkbFlag )
279
280
287 virtual int wkbSize( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const = 0;
288
300 virtual QByteArray asWkb( WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const = 0;
301
310 virtual QString asWkt( int precision = 17 ) const = 0;
311
323 virtual QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const = 0;
324
336 virtual QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const = 0;
337
347 QString asJson( int precision = 17 );
348
359 virtual json asJsonObject( int precision = 17 ) SIP_SKIP const;
360
365 virtual QString asKml( int precision = 17 ) const = 0;
366
367
368 //render pipeline
369
380 virtual void transform( const QgsCoordinateTransform &ct, Qgis::TransformDirection d = Qgis::TransformDirection::Forward, bool transformZ = false ) SIP_THROW( QgsCsException ) = 0;
381
388 virtual void transform( const QTransform &t, double zTranslate = 0.0, double zScale = 1.0,
389 double mTranslate = 0.0, double mScale = 1.0 ) = 0;
390
395 virtual void draw( QPainter &p ) const = 0;
396
405 virtual QPainterPath asQPainterPath() const = 0;
406
417 virtual int vertexNumberFromVertexId( QgsVertexId id ) const = 0;
418
426 virtual bool nextVertex( QgsVertexId &id, QgsPoint &vertex SIP_OUT ) const = 0;
427
432 virtual void adjacentVertices( QgsVertexId vertex, QgsVertexId &previousVertex SIP_OUT, QgsVertexId &nextVertex SIP_OUT ) const = 0;
433
438 virtual QgsCoordinateSequence coordinateSequence() const = 0;
439
443 virtual int nCoordinates() const;
444
448 virtual QgsPoint vertexAt( QgsVertexId id ) const = 0;
449
462 virtual double closestSegment( const QgsPoint &pt, QgsPoint &segmentPt SIP_OUT,
463 QgsVertexId &vertexAfter SIP_OUT,
464 int *leftOf SIP_OUT = nullptr, double epsilon = 4 * std::numeric_limits<double>::epsilon() ) const = 0;
465
466 //low-level editing
467
476 virtual bool insertVertex( QgsVertexId position, const QgsPoint &vertex ) = 0;
477
486 virtual bool moveVertex( QgsVertexId position, const QgsPoint &newPos ) = 0;
487
495 virtual bool deleteVertex( QgsVertexId position ) = 0;
496
509 virtual double length() const;
510
523 virtual double perimeter() const;
524
537 virtual double area() const;
538
547 virtual double segmentLength( QgsVertexId startVertex ) const = 0;
548
550 virtual QgsPoint centroid() const;
551
555 virtual bool isEmpty() const;
556
560 virtual bool hasCurvedSegments() const;
561
570 virtual bool boundingBoxIntersects( const QgsRectangle &rectangle ) const SIP_HOLDGIL;
571
578 virtual QgsAbstractGeometry *segmentize( double tolerance = M_PI / 180., SegmentationToleranceType toleranceType = MaximumAngle ) const SIP_FACTORY;
579
586 virtual QgsAbstractGeometry *toCurveType() const = 0 SIP_FACTORY;
587
610 virtual QgsAbstractGeometry *snappedToGrid( double hSpacing, double vSpacing, double dSpacing = 0, double mSpacing = 0 ) const = 0 SIP_FACTORY;
611
632 virtual bool removeDuplicateNodes( double epsilon = 4 * std::numeric_limits<double>::epsilon(), bool useZValues = false ) = 0;
633
641 virtual double vertexAngle( QgsVertexId vertex ) const = 0;
642
646 virtual int vertexCount( int part = 0, int ring = 0 ) const = 0;
647
651 virtual int ringCount( int part = 0 ) const = 0;
652
658 virtual int partCount() const = 0;
659
668 virtual bool addZValue( double zValue = 0 ) = 0;
669
678 virtual bool addMValue( double mValue = 0 ) = 0;
679
687 virtual bool dropZValue() = 0;
688
696 virtual bool dropMValue() = 0;
697
704 virtual void swapXy() = 0;
705
711 virtual bool convertTo( Qgis::WkbType type );
712
731 virtual const QgsAbstractGeometry *simplifiedTypeRef() const SIP_HOLDGIL;
732
744 virtual bool isValid( QString &error SIP_OUT, Qgis::GeometryValidityFlags flags = Qgis::GeometryValidityFlags() ) const = 0;
745
759 virtual bool transform( QgsAbstractGeometryTransformer *transformer, QgsFeedback *feedback = nullptr ) = 0;
760
761#ifndef SIP_RUN
762
772 virtual void filterVertices( const std::function< bool( const QgsPoint & ) > &filter );
773
788 virtual void transformVertices( const std::function< QgsPoint( const QgsPoint & ) > &transform );
789
795 class CORE_EXPORT part_iterator
796 {
797 private:
798
799 int mIndex = 0;
800 QgsAbstractGeometry *mGeometry = nullptr;
801
802 public:
804 part_iterator() = default;
805
807 part_iterator( QgsAbstractGeometry *g, int index );
808
813 part_iterator &operator++();
814
816 part_iterator operator++( int );
817
820
822 int partNumber() const;
823
824 bool operator==( part_iterator other ) const;
825 bool operator!=( part_iterator other ) const { return !( *this == other ); }
826 };
827
837 {
838 return part_iterator( this, 0 );
839 }
840
849 part_iterator parts_end();
850
858 QgsGeometryConstPartIterator parts() const;
859
865 class CORE_EXPORT const_part_iterator
866 {
867 private:
868
869 int mIndex = 0;
870 const QgsAbstractGeometry *mGeometry = nullptr;
871
872 public:
875
877 const_part_iterator( const QgsAbstractGeometry *g, int index );
878
883 const_part_iterator &operator++();
884
886 const_part_iterator operator++( int );
887
889 const QgsAbstractGeometry *operator*() const;
890
892 int partNumber() const;
893
894 bool operator==( const_part_iterator other ) const;
895 bool operator!=( const_part_iterator other ) const { return !( *this == other ); }
896 };
897
906 {
907 return const_part_iterator( this, 0 );
908 }
909
917 const_part_iterator const_parts_end() const;
918
919
925 class CORE_EXPORT vertex_iterator
926 {
927 private:
928
934 struct Level
935 {
936 const QgsAbstractGeometry *g = nullptr;
937 int index = 0;
938
939 bool operator==( const Level &other ) const;
940 };
941
942 std::array<Level, 3> levels;
943 int depth = -1;
944
945 void digDown();
946
947 public:
949 vertex_iterator() = default;
950
952 vertex_iterator( const QgsAbstractGeometry *g, int index );
953
958 vertex_iterator &operator++();
959
961 vertex_iterator operator++( int );
962
964 QgsPoint operator*() const;
965
967 QgsVertexId vertexId() const;
968
969 bool operator==( const vertex_iterator &other ) const;
970 bool operator!=( const vertex_iterator &other ) const { return !( *this == other ); }
971 };
972
982 {
983 return vertex_iterator( this, 0 );
984 }
985
995 {
996 return vertex_iterator( this, childCount() );
997 }
998#endif
999
1034
1035
1059 QgsVertexIterator vertices() const;
1060
1068
1069 protected:
1070
1077 int sortIndex() const;
1078
1089 virtual int compareToSameClass( const QgsAbstractGeometry *other ) const = 0;
1090
1096 virtual bool hasChildGeometries() const;
1097
1103 virtual int childCount() const { return 0; }
1104
1110 virtual QgsAbstractGeometry *childGeometry( int index ) const { Q_UNUSED( index ) return nullptr; }
1111
1117 virtual QgsPoint childPoint( int index ) const;
1118
1119 protected:
1121
1125 void setZMTypeFromSubGeometry( const QgsAbstractGeometry *subggeom, Qgis::WkbType baseGeomType );
1126
1131 virtual QgsRectangle calculateBoundingBox() const;
1132
1136 virtual void clearCache() const;
1137
1138 friend class TestQgsGeometry;
1139};
1140
1141
1142#ifndef SIP_RUN
1143
1144template <class T>
1146{
1147 return const_cast<T>( std::remove_pointer<T>::type::cast( geom ) );
1148}
1149
1150#endif
1151
1152// clazy:excludeall=qstring-allocations
1153
1159class CORE_EXPORT QgsVertexIterator
1160{
1161 public:
1164
1167 : g( geometry )
1168 , i( g->vertices_begin() )
1169 , n( g->vertices_end() )
1170 {
1171 }
1172
1174 bool hasNext() const
1175 {
1176 return g && g->vertices_end() != i;
1177 }
1178
1180 QgsPoint next();
1181
1182#ifdef SIP_RUN
1183 QgsVertexIterator *__iter__();
1184 % MethodCode
1185 sipRes = sipCpp;
1186 % End
1187
1188 SIP_PYOBJECT __next__() SIP_TYPEHINT( QgsPoint );
1189 % MethodCode
1190 if ( sipCpp->hasNext() )
1191 sipRes = sipConvertFromType( new QgsPoint( sipCpp->next() ), sipType_QgsPoint, Py_None );
1192 else
1193 PyErr_SetString( PyExc_StopIteration, "" );
1194 % End
1195#endif
1196
1197 private:
1198 const QgsAbstractGeometry *g = nullptr;
1200
1201};
1202
1209{
1210 public:
1213
1216 : g( geometry )
1217 , i( g->parts_begin() )
1218 , n( g->parts_end() )
1219 {
1220 }
1221
1224 {
1225 return g && g->parts_end() != i;
1226 }
1227
1229 QgsAbstractGeometry *next();
1230
1231#ifdef SIP_RUN
1232 QgsGeometryPartIterator *__iter__();
1233 % MethodCode
1234 sipRes = sipCpp;
1235 % End
1236
1237 SIP_PYOBJECT __next__() SIP_TYPEHINT( QgsAbstractGeometry );
1238 % MethodCode
1239 if ( sipCpp->hasNext() )
1240 sipRes = sipConvertFromType( sipCpp->next(), sipType_QgsAbstractGeometry, NULL );
1241 else
1242 PyErr_SetString( PyExc_StopIteration, "" );
1243 % End
1244#endif
1245
1246 private:
1247 QgsAbstractGeometry *g = nullptr;
1249
1250};
1251
1252
1259{
1260 public:
1263
1266 : g( geometry )
1267 , i( g->const_parts_begin() )
1268 , n( g->const_parts_end() )
1269 {
1270 }
1271
1274 {
1275 return g && g->const_parts_end() != i;
1276 }
1277
1279 const QgsAbstractGeometry *next();
1280
1281#ifdef SIP_RUN
1282 QgsGeometryConstPartIterator *__iter__();
1283 % MethodCode
1284 sipRes = sipCpp;
1285 % End
1286
1287 SIP_PYOBJECT __next__() SIP_TYPEHINT( QgsAbstractGeometry );
1288 % MethodCode
1289 if ( sipCpp->hasNext() )
1290 sipRes = sipConvertFromType( const_cast< QgsAbstractGeometry * >( sipCpp->next() ), sipType_QgsAbstractGeometry, NULL );
1291 else
1292 PyErr_SetString( PyExc_StopIteration, "" );
1293 % End
1294#endif
1295
1296 private:
1297 const QgsAbstractGeometry *g = nullptr;
1299
1300};
1301
1302Q_DECLARE_OPERATORS_FOR_FLAGS( QgsAbstractGeometry::WkbFlags )
1303
1304#endif //QGSABSTRACTGEOMETRYV2
The Qgis class provides global constants for use throughout the application.
Definition: qgis.h:55
WkbType
The WKB type describes the number of dimensions a geometry has.
Definition: qgis.h:155
@ 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 is3D() const SIP_HOLDGIL
Returns true if the geometry is 3D and contains a z-value.
virtual int childCount() const
Returns number of child geometries (for geometries with child geometries) or child points (for geomet...
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.
bool isMeasure() const SIP_HOLDGIL
Returns true if the geometry contains m values.
A const WKB pointer.
Definition: qgswkbptr.h:141
Class for doing transforms between two map coordinate systems.
Custom exception class for Coordinate Reference System related exceptions.
Definition: qgsexception.h:66
Abstract base class for curved geometry type.
Definition: qgscurve.h:36
Base class for feedback objects to be used for cancellation of something running in a worker thread.
Definition: qgsfeedback.h:45
Java-style iterator for const traversal of parts of a geometry.
QgsGeometryConstPartIterator(const QgsAbstractGeometry *geometry)
Constructs iterator for the given geometry.
QgsGeometryConstPartIterator()=default
Constructor for QgsGeometryConstPartIterator.
bool hasNext() const SIP_HOLDGIL
Find out whether there are more parts.
Java-style iterator for traversal of parts of a geometry.
QgsGeometryPartIterator()=default
Constructor for QgsGeometryPartIterator.
bool hasNext() const SIP_HOLDGIL
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:30
Multi point geometry collection.
Definition: qgsmultipoint.h:30
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) SIP_HOLDGIL
Tests whether a WKB type contains the z-dimension.
Definition: qgswkbtypes.h:977
static bool hasM(Qgis::WkbType type) SIP_HOLDGIL
Tests whether a WKB type contains m values.
Definition: qgswkbtypes.h:1027
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:292
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:227
#define SIP_CONVERT_TO_SUBCLASS_CODE(code)
Definition: qgis_sip.h:186
#define SIP_SKIP
Definition: qgis_sip.h:126
#define SIP_OUT
Definition: qgis_sip.h:58
#define SIP_HOLDGIL
Definition: qgis_sip.h:166
#define SIP_FACTORY
Definition: qgis_sip.h:76
#define SIP_THROW(name,...)
Definition: qgis_sip.h:198
#define SIP_END
Definition: qgis_sip.h:203
T qgsgeometry_cast(const QgsAbstractGeometry *geom)
QVector< QgsRingSequence > QgsCoordinateSequence
QVector< QgsPointSequence > QgsRingSequence
QVector< QgsPoint > QgsPointSequence
bool operator==(const QgsFeatureIterator &fi1, const QgsFeatureIterator &fi2)
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.
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:242
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:31