QGIS API Documentation 4.3.0-Master (bf28115e945)
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
23#include "qgis.h"
24#include "qgis_core.h"
25#include "qgswkbptr.h"
26#include "qgswkbtypes.h"
27
28#include <QSet>
29#include <QString>
30
31#ifndef SIP_RUN
32#include <nlohmann/json_fwd.hpp>
33using namespace nlohmann;
34#endif
35
36class QgsMapToPixel;
37class QgsCurve;
38class QgsMultiCurve;
39class QgsMultiPoint;
40
41struct QgsVertexId;
43class QPainter;
44class QDomDocument;
45class QDomElement;
48class QgsConstWkbPtr;
49class QPainterPath;
51class QgsFeedback;
53class QgsPoint;
54class QgsRectangle;
55class QgsBox3D;
56
57typedef QVector< QgsPoint > QgsPointSequence;
58#ifndef SIP_RUN
59typedef QVector< QgsPointSequence > QgsRingSequence;
60typedef QVector< QgsRingSequence > QgsCoordinateSequence;
61#else
62typedef QVector< QVector< QgsPoint > > QgsRingSequence;
63typedef QVector< QVector< QVector< QgsPoint > > > QgsCoordinateSequence;
64#endif
65
66
81class CORE_EXPORT QgsAbstractGeometry
82{
83 // clang-format off
84
85#ifdef SIP_RUN
87 if ( qgsgeometry_cast<QgsPoint *>( sipCpp ) != nullptr )
88 sipType = sipType_QgsPoint;
89 else if ( qgsgeometry_cast<QgsLineString *>( sipCpp ) != nullptr )
90 sipType = sipType_QgsLineString;
91 else if ( qgsgeometry_cast<QgsCircularString *>( sipCpp ) != nullptr )
92 sipType = sipType_QgsCircularString;
93 else if ( qgsgeometry_cast<QgsCompoundCurve *>( sipCpp ) != nullptr )
94 sipType = sipType_QgsCompoundCurve;
95 else if ( qgsgeometry_cast<QgsNurbsCurve *>( sipCpp ) != nullptr )
96 sipType = sipType_QgsNurbsCurve;
97 else if ( qgsgeometry_cast<QgsTriangle *>( sipCpp ) != nullptr )
98 sipType = sipType_QgsTriangle;
99 else if ( qgsgeometry_cast<QgsPolygon *>( sipCpp ) != nullptr )
100 sipType = sipType_QgsPolygon;
101 else if ( qgsgeometry_cast<QgsCurvePolygon *>( sipCpp ) != nullptr )
102 sipType = sipType_QgsCurvePolygon;
103 else if ( qgsgeometry_cast<QgsTriangulatedSurface *>( sipCpp ) != nullptr )
104 sipType = sipType_QgsTriangulatedSurface;
105 else if ( qgsgeometry_cast<QgsPolyhedralSurface *>( sipCpp ) != nullptr )
106 sipType = sipType_QgsPolyhedralSurface;
107 else if ( qgsgeometry_cast<QgsSurface *>( sipCpp ) != nullptr )
108 sipType = sipType_QgsSurface;
109 else if ( qgsgeometry_cast<QgsMultiPoint *>( sipCpp ) != nullptr )
110 sipType = sipType_QgsMultiPoint;
111 else if ( qgsgeometry_cast<QgsMultiLineString *>( sipCpp ) != nullptr )
112 sipType = sipType_QgsMultiLineString;
113 else if ( qgsgeometry_cast<QgsMultiPolygon *>( sipCpp ) != nullptr )
114 sipType = sipType_QgsMultiPolygon;
115 else if ( qgsgeometry_cast<QgsMultiSurface *>( sipCpp ) != nullptr )
116 sipType = sipType_QgsMultiSurface;
117 else if ( qgsgeometry_cast<QgsMultiCurve *>( sipCpp ) != nullptr )
118 sipType = sipType_QgsMultiCurve;
119 else if ( qgsgeometry_cast<QgsGeometryCollection *>( sipCpp ) != nullptr )
120 sipType = sipType_QgsGeometryCollection;
121 else
122 sipType = 0;
123 SIP_END
124#endif
125
126 Q_GADGET
127
128 public:
129
146 Q_ENUM( SegmentationToleranceType )
147
148
150 {
151
155 XY = 0,
156
161 };
163
164 // clang-format on
165
167 virtual ~QgsAbstractGeometry() = default;
169 QgsAbstractGeometry &operator=( const QgsAbstractGeometry &geom );
170
171 // === WARNING ===
172 // implementation of `QgsAbstractGeometry::operator==` are mainly delegated to `fuzzyEquals` functions if the default tolerance/epsilon value is changed, documentation must be updaded accordingly and also changed in expression helper files (resources/function_help/json)
173 virtual bool operator==( const QgsAbstractGeometry &other ) const = 0;
174 virtual bool operator!=( const QgsAbstractGeometry &other ) const = 0;
175
186 virtual bool fuzzyEqual( const QgsAbstractGeometry &other, double epsilon = 1e-8 ) const = 0;
187
201 virtual bool fuzzyDistanceEqual( const QgsAbstractGeometry &other, double epsilon = 1e-8 ) const = 0;
202
207
213 virtual int compareTo( const QgsAbstractGeometry *other ) const;
214
218 virtual void clear() = 0;
219
223 virtual QgsRectangle boundingBox() const;
224
230 virtual QgsBox3D boundingBox3D() const = 0;
231
232 //mm-sql interface
233
238 virtual int dimension() const = 0;
239
245 virtual QString geometryType() const = 0;
246
247 // clang-format off
253 inline Qgis::WkbType wkbType() const SIP_HOLDGIL { return mWkbType; }
254 // clang-format on
255
261 QString wktTypeStr() const;
262
267 bool is3D() const SIP_HOLDGIL
268 {
269 return QgsWkbTypes::hasZ( mWkbType );
270 }
271
277 {
278 return QgsWkbTypes::hasM( mWkbType );
279 }
280
287
297 virtual void normalize() = 0;
298
299 //import
300
306 virtual bool fromWkb( QgsConstWkbPtr &wkb ) = 0;
307
312 virtual bool fromWkt( const QString &wkt ) = 0;
313
314 //export
315
325 Q_DECLARE_FLAGS( WkbFlags, WkbFlag )
326
327
335
346 virtual QByteArray asWkb( WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const = 0;
347
356 virtual QString asWkt( int precision = 17 ) const = 0;
357
369 virtual QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const = 0;
370
382 virtual QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const = 0;
383
393 QString asJson( int precision = 17 );
394
400 QString asGeoJson(int precision = 17, Qgis::GeoJsonProfile profile = Qgis::GeoJsonProfile::Legacy );
401
412 virtual json asJsonObject( int precision = 17, Qgis::GeoJsonProfile profile = Qgis::GeoJsonProfile::Legacy ) SIP_SKIP const;
413
418 virtual QString asKml( int precision = 17 ) const = 0;
419
420
421 //render pipeline
422
433 virtual void transform( const QgsCoordinateTransform &ct, Qgis::TransformDirection d = Qgis::TransformDirection::Forward, bool transformZ = false ) SIP_THROW( QgsCsException ) = 0;
434
441 virtual void transform( const QTransform &t, double zTranslate = 0.0, double zScale = 1.0,
442 double mTranslate = 0.0, double mScale = 1.0 ) = 0;
443
448 virtual void draw( QPainter &p ) const = 0;
449
458 virtual QPainterPath asQPainterPath() const = 0;
459
469 virtual int vertexNumberFromVertexId( QgsVertexId id ) const = 0;
470
478 virtual bool nextVertex( QgsVertexId &id, QgsPoint &vertex SIP_OUT ) const = 0;
479
483 virtual void adjacentVertices( QgsVertexId vertex, QgsVertexId &previousVertex SIP_OUT, QgsVertexId &nextVertex SIP_OUT ) const = 0;
484
490
494 virtual int nCoordinates() const;
495
499 virtual QgsPoint vertexAt( QgsVertexId id ) const = 0;
500
513 virtual double closestSegment( const QgsPoint &pt, QgsPoint &segmentPt SIP_OUT,
514 QgsVertexId &vertexAfter SIP_OUT,
515 int *leftOf SIP_OUT = nullptr, double epsilon = 4 * std::numeric_limits<double>::epsilon() ) const = 0;
516
517 //low-level editing
518
527 virtual bool insertVertex( QgsVertexId position, const QgsPoint &vertex ) = 0;
528
537 virtual bool moveVertex( QgsVertexId position, const QgsPoint &newPos ) = 0;
538
546 virtual bool deleteVertex( QgsVertexId position ) = 0;
547
557 virtual bool deleteVertices( const QSet<QgsVertexId> &positions ) = 0;
558
563 virtual bool hasVertex( QgsVertexId position ) const = 0;
564
577 virtual double length() const;
578
591 virtual double perimeter() const;
592
606 virtual double area() const;
607
618 virtual double area3D() const;
619
627 virtual double segmentLength( QgsVertexId startVertex ) const = 0;
628
630 virtual QgsPoint centroid() const;
631
635 virtual bool isEmpty() const;
636
640 virtual bool hasCurvedSegments() const;
641
650 virtual bool boundingBoxIntersects( const QgsRectangle &rectangle ) const SIP_HOLDGIL;
651
660 virtual bool boundingBoxIntersects( const QgsBox3D &box3d ) const SIP_HOLDGIL;
661
668 virtual QgsAbstractGeometry *segmentize( double tolerance = M_PI / 180., SegmentationToleranceType toleranceType = MaximumAngle ) const SIP_FACTORY;
669
677
700 virtual QgsAbstractGeometry *snappedToGrid( double hSpacing, double vSpacing, double dSpacing = 0, double mSpacing = 0, bool removeRedundantPoints = false ) const = 0 SIP_FACTORY;
701
714 virtual QgsAbstractGeometry *simplifyByDistance( double tolerance ) const = 0 SIP_FACTORY;
715
735 virtual bool removeDuplicateNodes( double epsilon = 4 * std::numeric_limits<double>::epsilon(), bool useZValues = false ) = 0;
736
744 virtual double vertexAngle( QgsVertexId vertex ) const = 0;
745
749 virtual int vertexCount( int part = 0, int ring = 0 ) const = 0;
750
754 virtual int ringCount( int part = 0 ) const = 0;
755
761 virtual int partCount() const = 0;
762
770 virtual bool addZValue( double zValue = 0 ) = 0;
771
779 virtual bool addMValue( double mValue = 0 ) = 0;
780
787 virtual bool dropZValue() = 0;
788
795 virtual bool dropMValue() = 0;
796
803 virtual void swapXy() = 0;
804
809 virtual bool convertTo( Qgis::WkbType type );
810
830
842 virtual bool isValid( QString &error SIP_OUT, Qgis::GeometryValidityFlags flags = Qgis::GeometryValidityFlags() ) const = 0;
843
857 virtual bool transform( QgsAbstractGeometryTransformer *transformer, QgsFeedback *feedback = nullptr ) = 0;
858
859#ifndef SIP_RUN
860
870 virtual void filterVertices( const std::function< bool( const QgsPoint & ) > &filter );
871
886 virtual void transformVertices( const std::function< QgsPoint( const QgsPoint & ) > &transform );
887
893 class CORE_EXPORT part_iterator
894 {
895 private:
896
897 int mIndex = 0;
898 QgsAbstractGeometry *mGeometry = nullptr;
899
900 public:
902 part_iterator() = default;
903
905 part_iterator( QgsAbstractGeometry *g, int index );
906
912
915
918
920 int partNumber() const;
921
922 bool operator==( part_iterator other ) const;
923 bool operator!=( part_iterator other ) const { return !( *this == other ); }
924 };
925
935 {
936 return part_iterator( this, 0 );
937 }
938
947 part_iterator parts_end();
948
956 QgsGeometryConstPartIterator parts() const;
957
963 class CORE_EXPORT const_part_iterator
964 {
965 private:
966
967 int mIndex = 0;
968 const QgsAbstractGeometry *mGeometry = nullptr;
969
970 public:
973
975 const_part_iterator( const QgsAbstractGeometry *g, int index );
976
982
985
987 const QgsAbstractGeometry *operator*() const;
988
990 int partNumber() const;
991
992 bool operator==( const_part_iterator other ) const;
993 bool operator!=( const_part_iterator other ) const { return !( *this == other ); }
994 };
995
1004 {
1005 return const_part_iterator( this, 0 );
1006 }
1007
1015 const_part_iterator const_parts_end() const;
1016
1017
1022 class CORE_EXPORT vertex_iterator
1023 {
1024 private:
1025
1031 struct Level
1032 {
1033 const QgsAbstractGeometry *g = nullptr;
1034 int index = 0;
1035
1036 bool operator==( const Level &other ) const;
1037 };
1038
1039 std::array<Level, 3> levels;
1040 int depth = -1;
1041
1042 void digDown();
1043
1044 public:
1046 vertex_iterator() = default;
1047
1049 vertex_iterator( const QgsAbstractGeometry *g, int index );
1050
1056
1059
1061 QgsPoint operator*() const;
1062
1064 QgsVertexId vertexId() const;
1065
1066 bool operator==( const vertex_iterator &other ) const;
1067 bool operator!=( const vertex_iterator &other ) const { return !( *this == other ); }
1068 };
1069
1078 {
1079 return vertex_iterator( this, 0 );
1080 }
1081
1090 {
1091 return vertex_iterator( this, childCount() );
1092 }
1093#endif
1094
1129
1130
1153 QgsVertexIterator vertices() const;
1154
1161
1162 protected:
1163
1170 int sortIndex() const;
1171
1182 virtual int compareToSameClass( const QgsAbstractGeometry *other ) const = 0;
1183
1188 virtual bool hasChildGeometries() const;
1189
1194 virtual int childCount() const { return 0; }
1195
1200 virtual QgsAbstractGeometry *childGeometry( int index ) const { Q_UNUSED( index ) return nullptr; }
1201
1206 virtual QgsPoint childPoint( int index ) const;
1207
1208 protected:
1210
1214 void setZMTypeFromSubGeometry( const QgsAbstractGeometry *subggeom, Qgis::WkbType baseGeomType );
1215
1220 virtual QgsRectangle calculateBoundingBox() const;
1221
1228 virtual QgsBox3D calculateBoundingBox3D() const;
1229
1233 virtual void clearCache() const;
1234
1235 friend class TestQgsGeometry;
1236};
1237
1238
1239#ifndef SIP_RUN
1240
1241template <class T>
1243{
1244 return std::remove_pointer<T>::type::cast( geom );
1245}
1246
1247template <class T>
1249{
1250 return std::remove_pointer<T>::type::cast( geom );
1251}
1252
1253#endif
1254
1255// clazy:excludeall=qstring-allocations
1256
1261class CORE_EXPORT QgsVertexIterator
1262{
1263 public:
1264
1266
1269 : g( geometry )
1270 , i( g->vertices_begin() )
1271 , n( g->vertices_end() )
1272 {
1273 }
1274
1276 bool hasNext() const
1277 {
1278 return g && g->vertices_end() != i;
1279 }
1280
1282 QgsPoint next();
1283
1284#ifdef SIP_RUN
1285// clang-format off
1286 QgsVertexIterator *__iter__();
1287 % MethodCode
1288 sipRes = sipCpp;
1289 % End
1290
1291 SIP_PYOBJECT __next__() SIP_TYPEHINT( QgsPoint );
1292 % MethodCode
1293 if ( sipCpp->hasNext() )
1294 sipRes = sipConvertFromType( new QgsPoint( sipCpp->next() ), sipType_QgsPoint, Py_None );
1295 else
1296 PyErr_SetString( PyExc_StopIteration, "" );
1297 % End
1298// clang-format on
1299#endif
1300
1301 private:
1302 const QgsAbstractGeometry *g = nullptr;
1304
1305};
1306
1313{
1314 public:
1315
1317
1320 : g( geometry )
1321 , i( g->parts_begin() )
1322 , n( g->parts_end() )
1323 {
1324 }
1325
1328 {
1329 return g && g->parts_end() != i;
1330 }
1331
1333 QgsAbstractGeometry *next();
1334
1335#ifdef SIP_RUN
1336// clang-format off
1337 QgsGeometryPartIterator *__iter__();
1338 % MethodCode
1339 sipRes = sipCpp;
1340 % End
1341
1342 SIP_PYOBJECT __next__() SIP_TYPEHINT( QgsAbstractGeometry );
1343 % MethodCode
1344 if ( sipCpp->hasNext() )
1345 sipRes = sipConvertFromType( sipCpp->next(), sipType_QgsAbstractGeometry, NULL );
1346 else
1347 PyErr_SetString( PyExc_StopIteration, "" );
1348 % End
1349// clang-format on
1350#endif
1351
1352 private:
1353 QgsAbstractGeometry *g = nullptr;
1355
1356};
1357
1358
1365{
1366 public:
1367
1369
1372 : g( geometry )
1373 , i( g->const_parts_begin() )
1374 , n( g->const_parts_end() )
1375 {
1376 }
1377
1380 {
1381 return g && g->const_parts_end() != i;
1382 }
1383
1385 const QgsAbstractGeometry *next();
1386
1387#ifdef SIP_RUN
1388// clang-format off
1389 QgsGeometryConstPartIterator *__iter__();
1390 % MethodCode
1391 sipRes = sipCpp;
1392 % End
1393
1394 SIP_PYOBJECT __next__() SIP_TYPEHINT( QgsAbstractGeometry );
1395 % MethodCode
1396 if ( sipCpp->hasNext() )
1397 sipRes = sipConvertFromType( const_cast< QgsAbstractGeometry * >( sipCpp->next() ), sipType_QgsAbstractGeometry, NULL );
1398 else
1399 PyErr_SetString( PyExc_StopIteration, "" );
1400 % End
1401// clang-format on
1402#endif
1403
1404 private:
1405 const QgsAbstractGeometry *g = nullptr;
1407
1408};
1409
1411
1412#endif //QGSABSTRACTGEOMETRYV2
Provides global constants and enumerations for use throughout the application.
Definition qgis.h:62
WkbType
The WKB type describes the number of dimensions a geometry has.
Definition qgis.h:294
@ Unknown
Unknown.
Definition qgis.h:295
An abstract base class for classes which transform geometries by transforming input points to output ...
The part_iterator class provides an STL-style iterator for const references to geometry parts.
const_part_iterator & operator++()
The prefix ++ operator (++it) advances the iterator to the next part and returns an iterator to the n...
bool operator!=(const_part_iterator other) const
const_part_iterator()=default
Create invalid iterator.
int partNumber() const
Returns the part number of the current item.
The part_iterator class provides an STL-style iterator for geometry parts.
part_iterator & operator++()
The prefix ++ operator (++it) advances the iterator to the next part and returns an iterator to the n...
part_iterator()=default
Create invalid iterator.
bool operator!=(part_iterator other) const
int partNumber() const
Returns the part number of the current item.
The vertex_iterator class provides an STL-style iterator for vertices.
vertex_iterator()=default
Create invalid iterator.
bool operator!=(const vertex_iterator &other) const
vertex_iterator & operator++()
The prefix ++ operator (++it) advances the iterator to the next vertex and returns an iterator to the...
QgsVertexId vertexId() const
Returns vertex ID of the current item.
Abstract base class for all geometries.
virtual int ringCount(int part=0) const =0
Returns the number of rings of which this geometry is built.
virtual QgsAbstractGeometry * snappedToGrid(double hSpacing, double vSpacing, double dSpacing=0, double mSpacing=0, bool removeRedundantPoints=false) const =0
Makes a new geometry with all the points or vertices snapped to the closest point of the grid.
virtual bool addZValue(double zValue=0)=0
Adds a z-dimension to the geometry, initialized to a preset value.
virtual bool fromWkb(QgsConstWkbPtr &wkb)=0
Sets the geometry from a WKB string.
virtual bool moveVertex(QgsVertexId position, const QgsPoint &newPos)=0
Moves a vertex within the geometry.
SegmentationToleranceType
Segmentation tolerance as maximum angle or maximum difference between approximation and circle.
@ MaximumDifference
Maximum distance between an arbitrary point on the original curve and closest point on its approximat...
@ 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 bool convertTo(Qgis::WkbType type)
Converts the geometry to a specified type.
virtual QgsAbstractGeometry * boundary() const =0
Returns the closure of the combinatorial boundary of the geometry (ie the topological boundary of the...
virtual double vertexAngle(QgsVertexId vertex) const =0
Returns approximate angle at a vertex.
virtual bool dropMValue()=0
Drops any measure values which exist in the geometry.
vertex_iterator vertices_end() const
Returns STL-style iterator pointing to the imaginary vertex after the last vertex of the geometry.
virtual QgsBox3D calculateBoundingBox3D() const
Calculates the minimal 3D bounding box for the geometry.
virtual void draw(QPainter &p) const =0
Draws the geometry using the specified QPainter.
virtual const QgsAbstractGeometry * simplifiedTypeRef() const
Returns a reference to the simplest lossless representation of this geometry, e.g.
virtual QgsAbstractGeometry * segmentize(double tolerance=M_PI/180., SegmentationToleranceType toleranceType=MaximumAngle) const
Returns a version of the geometry without curves.
virtual int vertexCount(int part=0, int ring=0) const =0
Returns the number of vertices of which this geometry is built.
bool isMeasure() const
Returns true if the geometry contains m values.
QFlags< WkbFlag > WkbFlags
virtual QgsAbstractGeometry * simplifyByDistance(double tolerance) const =0
Simplifies the geometry by applying the Douglas Peucker simplification by distance algorithm.
virtual QgsRectangle calculateBoundingBox() const
Default calculator for the minimal bounding box for the geometry.
virtual int childCount() const
Returns number of child geometries (for geometries with child geometries) or child points (for geomet...
virtual QgsRectangle boundingBox() const
Returns the minimal bounding box for the geometry.
virtual void transformVertices(const std::function< QgsPoint(const QgsPoint &) > &transform)
Transforms the vertices from the geometry in place, applying the transform function to every vertex.
QString asGeoJson(int precision=17, Qgis::GeoJsonProfile profile=Qgis::GeoJsonProfile::Legacy)
Export the geometry to a GeoJSON string, with the given precision and following the specified GeoJSON...
virtual bool isValid(QString &error, Qgis::GeometryValidityFlags flags=Qgis::GeometryValidityFlags()) const =0
Checks validity of the geometry, and returns true if the geometry is valid.
virtual bool hasVertex(QgsVertexId position) const =0
Returns true if the geometry contains a vertex matching the given position.
bool is3D() const
Returns true if the geometry is 3D and contains a z-value.
AxisOrder
Axis order for GML generation.
@ XY
X comes before Y (or lon before lat).
@ YX
Y comes before X (or lat before lon).
virtual QgsBox3D boundingBox3D() const =0
Returns the 3D bounding box for the geometry.
virtual QString geometryType() const =0
Returns a unique string representing the geometry type.
int sortIndex() const
Returns the sort index for the geometry, used in the compareTo() method to compare geometries of diff...
virtual QgsAbstractGeometry * createEmptyWithSameType() const =0
Creates a new geometry with the same class and same WKB type as the original and transfers ownership.
virtual double perimeter() const
Returns the planar, 2-dimensional perimeter of the geometry.
virtual int nCoordinates() const
Returns the number of nodes contained in the geometry.
virtual QByteArray asWkb(WkbFlags flags=QgsAbstractGeometry::WkbFlags()) const =0
Returns a WKB representation of the geometry.
virtual double area3D() const
Returns the 3-dimensional surface area of the geometry.
virtual QgsPoint vertexAt(QgsVertexId id) const =0
Returns the point corresponding to a specified vertex id.
virtual QgsAbstractGeometry * toCurveType() const =0
Returns the geometry converted to the more generic curve type.
virtual bool deleteVertices(const QSet< QgsVertexId > &positions)=0
Deletes vertices within the geometry.
virtual void adjacentVertices(QgsVertexId vertex, QgsVertexId &previousVertex, QgsVertexId &nextVertex) const =0
Returns the vertices adjacent to a specified vertex within a geometry.
virtual QDomElement asGml2(QDomDocument &doc, int precision=17, const QString &ns="gml", AxisOrder axisOrder=QgsAbstractGeometry::AxisOrder::XY) const =0
Returns a GML2 representation of the geometry.
virtual void clearCache() const
Clears any cached parameters associated with the geometry, e.g., bounding boxes.
virtual bool addMValue(double mValue=0)=0
Adds a measure to the geometry, initialized to a preset value.
Qgis::WkbType wkbType() const
Returns the WKB type of the geometry.
virtual bool insertVertex(QgsVertexId position, const QgsPoint &vertex)=0
Inserts a vertex into the geometry.
virtual void swapXy()=0
Swaps the x and y coordinates from the geometry.
QString asJson(int precision=17)
Returns a GeoJSON representation of the geometry as a QString.
void setZMTypeFromSubGeometry(const QgsAbstractGeometry *subggeom, Qgis::WkbType baseGeomType)
Updates the geometry type based on whether sub geometries contain z or m values.
virtual double length() const
Returns the planar, 2-dimensional length of the geometry.
virtual QString asWkt(int precision=17) const =0
Returns a WKT representation of the geometry.
virtual bool fuzzyEqual(const QgsAbstractGeometry &other, double epsilon=1e-8) const =0
Performs fuzzy comparison between this geometry and other using an epsilon.
virtual bool isEmpty() const
Returns true if the geometry is empty.
virtual bool fuzzyDistanceEqual(const QgsAbstractGeometry &other, double epsilon=1e-8) const =0
Performs fuzzy distance comparison between this geometry and other using an epsilon.
virtual QDomElement asGml3(QDomDocument &doc, int precision=17, const QString &ns="gml", AxisOrder axisOrder=QgsAbstractGeometry::AxisOrder::XY) const =0
Returns a GML3 representation of the geometry.
virtual QgsCoordinateSequence coordinateSequence() const =0
Retrieves the sequence of geometries, rings and nodes.
virtual bool fromWkt(const QString &wkt)=0
Sets the geometry from a WKT string.
virtual int partCount() const =0
Returns count of parts contained in the geometry.
virtual bool hasChildGeometries() const
Returns whether the geometry has any child geometries (false for point / curve, true otherwise).
virtual QPainterPath asQPainterPath() const =0
Returns the geometry represented as a QPainterPath.
virtual void transform(const QgsCoordinateTransform &ct, Qgis::TransformDirection d=Qgis::TransformDirection::Forward, bool transformZ=false)=0
Transforms the geometry using a coordinate transform.
virtual bool boundingBoxIntersects(const QgsRectangle &rectangle) const
Returns true if the bounding box of this geometry intersects with a rectangle.
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 bool deleteVertex(QgsVertexId position)=0
Deletes a vertex within the geometry.
virtual bool hasCurvedSegments() const
Returns true if the geometry contains curved segments.
virtual void clear()=0
Clears the geometry, ie reset it to a null geometry.
virtual void filterVertices(const std::function< bool(const QgsPoint &) > &filter)
Filters the vertices from the geometry in place, removing any which do not return true for the filter...
virtual bool dropZValue()=0
Drops any z-dimensions which exist in the geometry.
@ FlagExportTrianglesAsPolygons
Triangles should be exported as polygon geometries.
@ FlagExportNanAsDoubleMin
Use -DOUBLE_MAX to represent NaN.
virtual json asJsonObject(int precision=17, Qgis::GeoJsonProfile profile=Qgis::GeoJsonProfile::Legacy) const
Returns a json object representation of the geometry with the given precision and profile.
virtual QgsPoint centroid() const
Returns the centroid of the geometry.
virtual QgsAbstractGeometry * childGeometry(int index) const
Returns pointer to child geometry (for geometries with child geometries - i.e.
virtual int dimension() const =0
Returns the inherent dimension of the geometry.
virtual double segmentLength(QgsVertexId startVertex) const =0
Returns the length of the segment of the geometry which begins at startVertex.
virtual int compareTo(const QgsAbstractGeometry *other) const
Comparator for sorting of geometry.
virtual QString asKml(int precision=17) const =0
Returns a KML representation of the geometry.
virtual bool removeDuplicateNodes(double epsilon=4 *std::numeric_limits< double >::epsilon(), bool useZValues=false)=0
Removes duplicate nodes from the geometry, wherever removing the nodes does not result in a degenerat...
virtual int wkbSize(QgsAbstractGeometry::WkbFlags flags=QgsAbstractGeometry::WkbFlags()) const =0
Returns the length of the QByteArray returned by asWkb().
const_part_iterator const_parts_begin() const
Returns STL-style iterator pointing to the const first part of the geometry.
QgsAbstractGeometry()=default
virtual double area() const
Returns the planar, 2-dimensional area 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.
virtual bool nextVertex(QgsVertexId &id, QgsPoint &vertex) const =0
Returns next vertex id and coordinates.
virtual QgsAbstractGeometry * clone() const =0
Clones the geometry by performing a deep copy.
virtual double closestSegment(const QgsPoint &pt, QgsPoint &segmentPt, QgsVertexId &vertexAfter, int *leftOf=nullptr, double epsilon=4 *std::numeric_limits< double >::epsilon()) const =0
Searches for the closest segment of the geometry to a given point.
A 3-dimensional box composed of x, y, z coordinates.
Definition qgsbox3d.h:45
A const WKB pointer.
Definition qgswkbptr.h:211
Handles coordinate transforms between two 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: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.
Java-style iterator for traversal of parts of a geometry.
QgsGeometryPartIterator()=default
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:53
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
QgsVertexIterator(const QgsAbstractGeometry *geometry)
Constructs iterator for the given geometry.
static Q_INVOKABLE bool hasZ(Qgis::WkbType type)
Tests whether a WKB type contains the z-dimension.
static Q_INVOKABLE bool hasM(Qgis::WkbType type)
Tests whether a WKB type contains m values.
#define SIP_TYPEHINT(type)
Definition qgis_sip.h:237
#define SIP_CONVERT_TO_SUBCLASS_CODE(code)
Definition qgis_sip.h:198
#define SIP_ENUM_BASETYPE(type)
Definition qgis_sip.h:272
#define SIP_SKIP
Definition qgis_sip.h:133
#define SIP_OUT
Definition qgis_sip.h:57
#define SIP_HOLDGIL
Definition qgis_sip.h:178
#define SIP_FACTORY
Definition qgis_sip.h:83
#define SIP_THROW(name,...)
Definition qgis_sip.h:210
#define SIP_END
Definition qgis_sip.h:215
T qgsgeometry_cast(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:245
Q_DECLARE_OPERATORS_FOR_FLAGS(QgsProjectionSelectionWidget::CrsOptions)
Utility class for identifying a unique vertex within a geometry.
Definition qgsvertexid.h:35