QGIS API Documentation 3.39.0-Master (52f98f8c831)
Loading...
Searching...
No Matches
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 <nlohmann/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
649 virtual QgsAbstractGeometry *snappedToGrid( double hSpacing, double vSpacing, double dSpacing = 0, double mSpacing = 0, bool removeRedundantPoints = false ) const = 0 SIP_FACTORY;
650
663 virtual QgsAbstractGeometry *simplifyByDistance( double tolerance ) const = 0 SIP_FACTORY;
664
684 virtual bool removeDuplicateNodes( double epsilon = 4 * std::numeric_limits<double>::epsilon(), bool useZValues = false ) = 0;
685
693 virtual double vertexAngle( QgsVertexId vertex ) const = 0;
694
698 virtual int vertexCount( int part = 0, int ring = 0 ) const = 0;
699
703 virtual int ringCount( int part = 0 ) const = 0;
704
710 virtual int partCount() const = 0;
711
719 virtual bool addZValue( double zValue = 0 ) = 0;
720
728 virtual bool addMValue( double mValue = 0 ) = 0;
729
736 virtual bool dropZValue() = 0;
737
744 virtual bool dropMValue() = 0;
745
752 virtual void swapXy() = 0;
753
758 virtual bool convertTo( Qgis::WkbType type );
759
778 virtual const QgsAbstractGeometry *simplifiedTypeRef() const SIP_HOLDGIL;
779
791 virtual bool isValid( QString &error SIP_OUT, Qgis::GeometryValidityFlags flags = Qgis::GeometryValidityFlags() ) const = 0;
792
806 virtual bool transform( QgsAbstractGeometryTransformer *transformer, QgsFeedback *feedback = nullptr ) = 0;
807
808#ifndef SIP_RUN
809
819 virtual void filterVertices( const std::function< bool( const QgsPoint & ) > &filter );
820
835 virtual void transformVertices( const std::function< QgsPoint( const QgsPoint & ) > &transform );
836
842 class CORE_EXPORT part_iterator
843 {
844 private:
845
846 int mIndex = 0;
847 QgsAbstractGeometry *mGeometry = nullptr;
848
849 public:
851 part_iterator() = default;
852
854 part_iterator( QgsAbstractGeometry *g, int index );
855
860 part_iterator &operator++();
861
863 part_iterator operator++( int );
864
867
869 int partNumber() const;
870
871 bool operator==( part_iterator other ) const;
872 bool operator!=( part_iterator other ) const { return !( *this == other ); }
873 };
874
884 {
885 return part_iterator( this, 0 );
886 }
887
896 part_iterator parts_end();
897
905 QgsGeometryConstPartIterator parts() const;
906
912 class CORE_EXPORT const_part_iterator
913 {
914 private:
915
916 int mIndex = 0;
917 const QgsAbstractGeometry *mGeometry = nullptr;
918
919 public:
922
924 const_part_iterator( const QgsAbstractGeometry *g, int index );
925
930 const_part_iterator &operator++();
931
933 const_part_iterator operator++( int );
934
936 const QgsAbstractGeometry *operator*() const;
937
939 int partNumber() const;
940
941 bool operator==( const_part_iterator other ) const;
942 bool operator!=( const_part_iterator other ) const { return !( *this == other ); }
943 };
944
953 {
954 return const_part_iterator( this, 0 );
955 }
956
964 const_part_iterator const_parts_end() const;
965
966
971 class CORE_EXPORT vertex_iterator
972 {
973 private:
974
980 struct Level
981 {
982 const QgsAbstractGeometry *g = nullptr;
983 int index = 0;
984
985 bool operator==( const Level &other ) const;
986 };
987
988 std::array<Level, 3> levels;
989 int depth = -1;
990
991 void digDown();
992
993 public:
995 vertex_iterator() = default;
996
998 vertex_iterator( const QgsAbstractGeometry *g, int index );
999
1004 vertex_iterator &operator++();
1005
1007 vertex_iterator operator++( int );
1008
1010 QgsPoint operator*() const;
1011
1013 QgsVertexId vertexId() const;
1014
1015 bool operator==( const vertex_iterator &other ) const;
1016 bool operator!=( const vertex_iterator &other ) const { return !( *this == other ); }
1017 };
1018
1027 {
1028 return vertex_iterator( this, 0 );
1029 }
1030
1039 {
1040 return vertex_iterator( this, childCount() );
1041 }
1042#endif
1043
1078
1079
1102 QgsVertexIterator vertices() const;
1103
1110
1111 protected:
1112
1119 int sortIndex() const;
1120
1131 virtual int compareToSameClass( const QgsAbstractGeometry *other ) const = 0;
1132
1137 virtual bool hasChildGeometries() const;
1138
1143 virtual int childCount() const { return 0; }
1144
1149 virtual QgsAbstractGeometry *childGeometry( int index ) const { Q_UNUSED( index ) return nullptr; }
1150
1155 virtual QgsPoint childPoint( int index ) const;
1156
1157 protected:
1159
1163 void setZMTypeFromSubGeometry( const QgsAbstractGeometry *subggeom, Qgis::WkbType baseGeomType );
1164
1169 virtual QgsRectangle calculateBoundingBox() const;
1170
1177 virtual QgsBox3D calculateBoundingBox3D() const;
1178
1182 virtual void clearCache() const;
1183
1184 friend class TestQgsGeometry;
1185};
1186
1187
1188#ifndef SIP_RUN
1189
1190template <class T>
1192{
1193 return const_cast<T>( std::remove_pointer<T>::type::cast( geom ) );
1194}
1195
1196#endif
1197
1198// clazy:excludeall=qstring-allocations
1199
1204class CORE_EXPORT QgsVertexIterator
1205{
1206 public:
1209
1212 : g( geometry )
1213 , i( g->vertices_begin() )
1214 , n( g->vertices_end() )
1215 {
1216 }
1217
1219 bool hasNext() const
1220 {
1221 return g && g->vertices_end() != i;
1222 }
1223
1225 QgsPoint next();
1226
1227#ifdef SIP_RUN
1228 QgsVertexIterator *__iter__();
1229 % MethodCode
1230 sipRes = sipCpp;
1231 % End
1232
1233 SIP_PYOBJECT __next__() SIP_TYPEHINT( QgsPoint );
1234 % MethodCode
1235 if ( sipCpp->hasNext() )
1236 sipRes = sipConvertFromType( new QgsPoint( sipCpp->next() ), sipType_QgsPoint, Py_None );
1237 else
1238 PyErr_SetString( PyExc_StopIteration, "" );
1239 % End
1240#endif
1241
1242 private:
1243 const QgsAbstractGeometry *g = nullptr;
1245
1246};
1247
1254{
1255 public:
1258
1261 : g( geometry )
1262 , i( g->parts_begin() )
1263 , n( g->parts_end() )
1264 {
1265 }
1266
1269 {
1270 return g && g->parts_end() != i;
1271 }
1272
1274 QgsAbstractGeometry *next();
1275
1276#ifdef SIP_RUN
1277 QgsGeometryPartIterator *__iter__();
1278 % MethodCode
1279 sipRes = sipCpp;
1280 % End
1281
1282 SIP_PYOBJECT __next__() SIP_TYPEHINT( QgsAbstractGeometry );
1283 % MethodCode
1284 if ( sipCpp->hasNext() )
1285 sipRes = sipConvertFromType( sipCpp->next(), sipType_QgsAbstractGeometry, NULL );
1286 else
1287 PyErr_SetString( PyExc_StopIteration, "" );
1288 % End
1289#endif
1290
1291 private:
1292 QgsAbstractGeometry *g = nullptr;
1294
1295};
1296
1297
1304{
1305 public:
1308
1311 : g( geometry )
1312 , i( g->const_parts_begin() )
1313 , n( g->const_parts_end() )
1314 {
1315 }
1316
1319 {
1320 return g && g->const_parts_end() != i;
1321 }
1322
1324 const QgsAbstractGeometry *next();
1325
1326#ifdef SIP_RUN
1327 QgsGeometryConstPartIterator *__iter__();
1328 % MethodCode
1329 sipRes = sipCpp;
1330 % End
1331
1332 SIP_PYOBJECT __next__() SIP_TYPEHINT( QgsAbstractGeometry );
1333 % MethodCode
1334 if ( sipCpp->hasNext() )
1335 sipRes = sipConvertFromType( const_cast< QgsAbstractGeometry * >( sipCpp->next() ), sipType_QgsAbstractGeometry, NULL );
1336 else
1337 PyErr_SetString( PyExc_StopIteration, "" );
1338 % End
1339#endif
1340
1341 private:
1342 const QgsAbstractGeometry *g = nullptr;
1344
1345};
1346
1348
1349#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:201
@ 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.
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.
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.
Multi curve geometry collection.
Multi point geometry collection.
Point geometry type, with support for z-dimension and m-values.
Definition qgspoint.h:49
A rectangle specified with double values.
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.
static bool hasM(Qgis::WkbType type)
Tests whether a WKB type contains m values.
#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