QGIS API Documentation 3.28.14-Firenze (exported)
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 "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 QgsWkbTypes::Type 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( QgsWkbTypes::Type 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, QgsWkbTypes::Type 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:72
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.
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 const WKB pointer.
Definition qgswkbptr.h:137
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: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.
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.
Handles storage of information regarding WKB types and their properties.
Definition qgswkbtypes.h:42
Type
The WKB type describes the number of dimensions a geometry has.
Definition qgswkbtypes.h:70
static bool hasZ(Type type)
Tests whether a WKB type contains the z-dimension.
static bool hasM(Type type)
Tests whether a WKB type contains m values.
#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