QGIS API Documentation 3.99.0-Master (a8882ad4560)
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 <QString>
29
30#ifndef SIP_RUN
31#include <nlohmann/json_fwd.hpp>
32using namespace nlohmann;
33#endif
34
35class QgsMapToPixel;
36class QgsCurve;
37class QgsMultiCurve;
38class QgsMultiPoint;
39
40struct QgsVertexId;
42class QPainter;
43class QDomDocument;
44class QDomElement;
47class QgsConstWkbPtr;
48class QPainterPath;
50class QgsFeedback;
52class QgsPoint;
53class QgsRectangle;
54class QgsBox3D;
55
56typedef QVector< QgsPoint > QgsPointSequence;
57#ifndef SIP_RUN
58typedef QVector< QgsPointSequence > QgsRingSequence;
59typedef QVector< QgsRingSequence > QgsCoordinateSequence;
60#else
61typedef QVector< QVector< QgsPoint > > QgsRingSequence;
62typedef QVector< QVector< QVector< QgsPoint > > > QgsCoordinateSequence;
63#endif
64
65
80class CORE_EXPORT QgsAbstractGeometry
81{
82
83#ifdef SIP_RUN
85 if ( qgsgeometry_cast<QgsPoint *>( sipCpp ) != nullptr )
86 sipType = sipType_QgsPoint;
87 else if ( qgsgeometry_cast<QgsLineString *>( sipCpp ) != nullptr )
88 sipType = sipType_QgsLineString;
89 else if ( qgsgeometry_cast<QgsCircularString *>( sipCpp ) != nullptr )
90 sipType = sipType_QgsCircularString;
91 else if ( qgsgeometry_cast<QgsCompoundCurve *>( sipCpp ) != nullptr )
92 sipType = sipType_QgsCompoundCurve;
93 else if ( qgsgeometry_cast<QgsNurbsCurve *>( sipCpp ) != nullptr )
94 sipType = sipType_QgsNurbsCurve;
95 else if ( qgsgeometry_cast<QgsTriangle *>( sipCpp ) != nullptr )
96 sipType = sipType_QgsTriangle;
97 else if ( qgsgeometry_cast<QgsPolygon *>( sipCpp ) != nullptr )
98 sipType = sipType_QgsPolygon;
99 else if ( qgsgeometry_cast<QgsCurvePolygon *>( sipCpp ) != nullptr )
100 sipType = sipType_QgsCurvePolygon;
101 else if ( qgsgeometry_cast<QgsTriangulatedSurface *>( sipCpp ) != nullptr )
102 sipType = sipType_QgsTriangulatedSurface;
103 else if ( qgsgeometry_cast<QgsPolyhedralSurface *>( sipCpp ) != nullptr )
104 sipType = sipType_QgsPolyhedralSurface;
105 else if ( qgsgeometry_cast<QgsSurface *>( sipCpp ) != nullptr )
106 sipType = sipType_QgsSurface;
107 else if ( qgsgeometry_cast<QgsMultiPoint *>( sipCpp ) != nullptr )
108 sipType = sipType_QgsMultiPoint;
109 else if ( qgsgeometry_cast<QgsMultiLineString *>( sipCpp ) != nullptr )
110 sipType = sipType_QgsMultiLineString;
111 else if ( qgsgeometry_cast<QgsMultiPolygon *>( sipCpp ) != nullptr )
112 sipType = sipType_QgsMultiPolygon;
113 else if ( qgsgeometry_cast<QgsMultiSurface *>( sipCpp ) != nullptr )
114 sipType = sipType_QgsMultiSurface;
115 else if ( qgsgeometry_cast<QgsMultiCurve *>( sipCpp ) != nullptr )
116 sipType = sipType_QgsMultiCurve;
117 else if ( qgsgeometry_cast<QgsGeometryCollection *>( sipCpp ) != nullptr )
118 sipType = sipType_QgsGeometryCollection;
119 else
120 sipType = 0;
121 SIP_END
122#endif
123
124 Q_GADGET
125
126 public:
127
144 Q_ENUM( SegmentationToleranceType )
145
146
148 {
149
153 XY = 0,
154
159 };
161
163 virtual ~QgsAbstractGeometry() = default;
165 QgsAbstractGeometry &operator=( const QgsAbstractGeometry &geom );
166
167 virtual bool operator==( const QgsAbstractGeometry &other ) const = 0;
168 virtual bool operator!=( const QgsAbstractGeometry &other ) const = 0;
169
180 virtual bool fuzzyEqual( const QgsAbstractGeometry &other, double epsilon = 1e-8 ) const = 0;
181
195 virtual bool fuzzyDistanceEqual( const QgsAbstractGeometry &other, double epsilon = 1e-8 ) const = 0;
196
201
207 virtual int compareTo( const QgsAbstractGeometry *other ) const;
208
212 virtual void clear() = 0;
213
217 virtual QgsRectangle boundingBox() const;
218
224 virtual QgsBox3D boundingBox3D() const = 0;
225
226 //mm-sql interface
227
232 virtual int dimension() const = 0;
233
239 virtual QString geometryType() const = 0;
240
246 inline Qgis::WkbType wkbType() const SIP_HOLDGIL { return mWkbType; }
247
253 QString wktTypeStr() const;
254
259 bool is3D() const SIP_HOLDGIL
260 {
261 return QgsWkbTypes::hasZ( mWkbType );
262 }
263
269 {
270 return QgsWkbTypes::hasM( mWkbType );
271 }
272
279
289 virtual void normalize() = 0;
290
291 //import
292
298 virtual bool fromWkb( QgsConstWkbPtr &wkb ) = 0;
299
304 virtual bool fromWkt( const QString &wkt ) = 0;
305
306 //export
307
317 Q_DECLARE_FLAGS( WkbFlags, WkbFlag )
318
319
327
338 virtual QByteArray asWkb( WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const = 0;
339
348 virtual QString asWkt( int precision = 17 ) const = 0;
349
361 virtual QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const = 0;
362
374 virtual QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const = 0;
375
385 QString asJson( int precision = 17 );
386
397 virtual json asJsonObject( int precision = 17 ) SIP_SKIP const;
398
403 virtual QString asKml( int precision = 17 ) const = 0;
404
405
406 //render pipeline
407
418 virtual void transform( const QgsCoordinateTransform &ct, Qgis::TransformDirection d = Qgis::TransformDirection::Forward, bool transformZ = false ) SIP_THROW( QgsCsException ) = 0;
419
426 virtual void transform( const QTransform &t, double zTranslate = 0.0, double zScale = 1.0,
427 double mTranslate = 0.0, double mScale = 1.0 ) = 0;
428
433 virtual void draw( QPainter &p ) const = 0;
434
443 virtual QPainterPath asQPainterPath() const = 0;
444
454 virtual int vertexNumberFromVertexId( QgsVertexId id ) const = 0;
455
463 virtual bool nextVertex( QgsVertexId &id, QgsPoint &vertex SIP_OUT ) const = 0;
464
468 virtual void adjacentVertices( QgsVertexId vertex, QgsVertexId &previousVertex SIP_OUT, QgsVertexId &nextVertex SIP_OUT ) const = 0;
469
475
479 virtual int nCoordinates() const;
480
484 virtual QgsPoint vertexAt( QgsVertexId id ) const = 0;
485
498 virtual double closestSegment( const QgsPoint &pt, QgsPoint &segmentPt SIP_OUT,
499 QgsVertexId &vertexAfter SIP_OUT,
500 int *leftOf SIP_OUT = nullptr, double epsilon = 4 * std::numeric_limits<double>::epsilon() ) const = 0;
501
502 //low-level editing
503
512 virtual bool insertVertex( QgsVertexId position, const QgsPoint &vertex ) = 0;
513
522 virtual bool moveVertex( QgsVertexId position, const QgsPoint &newPos ) = 0;
523
531 virtual bool deleteVertex( QgsVertexId position ) = 0;
532
545 virtual double length() const;
546
559 virtual double perimeter() const;
560
574 virtual double area() const;
575
586 virtual double area3D() const;
587
595 virtual double segmentLength( QgsVertexId startVertex ) const = 0;
596
598 virtual QgsPoint centroid() const;
599
603 virtual bool isEmpty() const;
604
608 virtual bool hasCurvedSegments() const;
609
618 virtual bool boundingBoxIntersects( const QgsRectangle &rectangle ) const SIP_HOLDGIL;
619
628 virtual bool boundingBoxIntersects( const QgsBox3D &box3d ) const SIP_HOLDGIL;
629
636 virtual QgsAbstractGeometry *segmentize( double tolerance = M_PI / 180., SegmentationToleranceType toleranceType = MaximumAngle ) const SIP_FACTORY;
637
645
668 virtual QgsAbstractGeometry *snappedToGrid( double hSpacing, double vSpacing, double dSpacing = 0, double mSpacing = 0, bool removeRedundantPoints = false ) const = 0 SIP_FACTORY;
669
682 virtual QgsAbstractGeometry *simplifyByDistance( double tolerance ) const = 0 SIP_FACTORY;
683
703 virtual bool removeDuplicateNodes( double epsilon = 4 * std::numeric_limits<double>::epsilon(), bool useZValues = false ) = 0;
704
712 virtual double vertexAngle( QgsVertexId vertex ) const = 0;
713
717 virtual int vertexCount( int part = 0, int ring = 0 ) const = 0;
718
722 virtual int ringCount( int part = 0 ) const = 0;
723
729 virtual int partCount() const = 0;
730
738 virtual bool addZValue( double zValue = 0 ) = 0;
739
747 virtual bool addMValue( double mValue = 0 ) = 0;
748
755 virtual bool dropZValue() = 0;
756
763 virtual bool dropMValue() = 0;
764
771 virtual void swapXy() = 0;
772
777 virtual bool convertTo( Qgis::WkbType type );
778
798
810 virtual bool isValid( QString &error SIP_OUT, Qgis::GeometryValidityFlags flags = Qgis::GeometryValidityFlags() ) const = 0;
811
825 virtual bool transform( QgsAbstractGeometryTransformer *transformer, QgsFeedback *feedback = nullptr ) = 0;
826
827#ifndef SIP_RUN
828
838 virtual void filterVertices( const std::function< bool( const QgsPoint & ) > &filter );
839
854 virtual void transformVertices( const std::function< QgsPoint( const QgsPoint & ) > &transform );
855
861 class CORE_EXPORT part_iterator
862 {
863 private:
864
865 int mIndex = 0;
866 QgsAbstractGeometry *mGeometry = nullptr;
867
868 public:
870 part_iterator() = default;
871
873 part_iterator( QgsAbstractGeometry *g, int index );
874
880
883
886
888 int partNumber() const;
889
890 bool operator==( part_iterator other ) const;
891 bool operator!=( part_iterator other ) const { return !( *this == other ); }
892 };
893
903 {
904 return part_iterator( this, 0 );
905 }
906
915 part_iterator parts_end();
916
924 QgsGeometryConstPartIterator parts() const;
925
931 class CORE_EXPORT const_part_iterator
932 {
933 private:
934
935 int mIndex = 0;
936 const QgsAbstractGeometry *mGeometry = nullptr;
937
938 public:
941
943 const_part_iterator( const QgsAbstractGeometry *g, int index );
944
950
953
955 const QgsAbstractGeometry *operator*() const;
956
958 int partNumber() const;
959
960 bool operator==( const_part_iterator other ) const;
961 bool operator!=( const_part_iterator other ) const { return !( *this == other ); }
962 };
963
972 {
973 return const_part_iterator( this, 0 );
974 }
975
983 const_part_iterator const_parts_end() const;
984
985
990 class CORE_EXPORT vertex_iterator
991 {
992 private:
993
999 struct Level
1000 {
1001 const QgsAbstractGeometry *g = nullptr;
1002 int index = 0;
1003
1004 bool operator==( const Level &other ) const;
1005 };
1006
1007 std::array<Level, 3> levels;
1008 int depth = -1;
1009
1010 void digDown();
1011
1012 public:
1014 vertex_iterator() = default;
1015
1017 vertex_iterator( const QgsAbstractGeometry *g, int index );
1018
1024
1027
1029 QgsPoint operator*() const;
1030
1032 QgsVertexId vertexId() const;
1033
1034 bool operator==( const vertex_iterator &other ) const;
1035 bool operator!=( const vertex_iterator &other ) const { return !( *this == other ); }
1036 };
1037
1046 {
1047 return vertex_iterator( this, 0 );
1048 }
1049
1058 {
1059 return vertex_iterator( this, childCount() );
1060 }
1061#endif
1062
1097
1098
1121 QgsVertexIterator vertices() const;
1122
1129
1130 protected:
1131
1138 int sortIndex() const;
1139
1150 virtual int compareToSameClass( const QgsAbstractGeometry *other ) const = 0;
1151
1156 virtual bool hasChildGeometries() const;
1157
1162 virtual int childCount() const { return 0; }
1163
1168 virtual QgsAbstractGeometry *childGeometry( int index ) const { Q_UNUSED( index ) return nullptr; }
1169
1174 virtual QgsPoint childPoint( int index ) const;
1175
1176 protected:
1178
1182 void setZMTypeFromSubGeometry( const QgsAbstractGeometry *subggeom, Qgis::WkbType baseGeomType );
1183
1188 virtual QgsRectangle calculateBoundingBox() const;
1189
1196 virtual QgsBox3D calculateBoundingBox3D() const;
1197
1201 virtual void clearCache() const;
1202
1203 friend class TestQgsGeometry;
1204};
1205
1206
1207#ifndef SIP_RUN
1208
1209template <class T>
1211{
1212 return std::remove_pointer<T>::type::cast( geom );
1213}
1214
1215template <class T>
1217{
1218 return std::remove_pointer<T>::type::cast( geom );
1219}
1220
1221#endif
1222
1223// clazy:excludeall=qstring-allocations
1224
1229class CORE_EXPORT QgsVertexIterator
1230{
1231 public:
1232
1234
1237 : g( geometry )
1238 , i( g->vertices_begin() )
1239 , n( g->vertices_end() )
1240 {
1241 }
1242
1244 bool hasNext() const
1245 {
1246 return g && g->vertices_end() != i;
1247 }
1248
1250 QgsPoint next();
1251
1252#ifdef SIP_RUN
1253 QgsVertexIterator *__iter__();
1254 % MethodCode
1255 sipRes = sipCpp;
1256 % End
1257
1258 SIP_PYOBJECT __next__() SIP_TYPEHINT( QgsPoint );
1259 % MethodCode
1260 if ( sipCpp->hasNext() )
1261 sipRes = sipConvertFromType( new QgsPoint( sipCpp->next() ), sipType_QgsPoint, Py_None );
1262 else
1263 PyErr_SetString( PyExc_StopIteration, "" );
1264 % End
1265#endif
1266
1267 private:
1268 const QgsAbstractGeometry *g = nullptr;
1270
1271};
1272
1279{
1280 public:
1281
1283
1286 : g( geometry )
1287 , i( g->parts_begin() )
1288 , n( g->parts_end() )
1289 {
1290 }
1291
1294 {
1295 return g && g->parts_end() != i;
1296 }
1297
1299 QgsAbstractGeometry *next();
1300
1301#ifdef SIP_RUN
1302 QgsGeometryPartIterator *__iter__();
1303 % MethodCode
1304 sipRes = sipCpp;
1305 % End
1306
1307 SIP_PYOBJECT __next__() SIP_TYPEHINT( QgsAbstractGeometry );
1308 % MethodCode
1309 if ( sipCpp->hasNext() )
1310 sipRes = sipConvertFromType( sipCpp->next(), sipType_QgsAbstractGeometry, NULL );
1311 else
1312 PyErr_SetString( PyExc_StopIteration, "" );
1313 % End
1314#endif
1315
1316 private:
1317 QgsAbstractGeometry *g = nullptr;
1319
1320};
1321
1322
1329{
1330 public:
1331
1333
1336 : g( geometry )
1337 , i( g->const_parts_begin() )
1338 , n( g->const_parts_end() )
1339 {
1340 }
1341
1344 {
1345 return g && g->const_parts_end() != i;
1346 }
1347
1349 const QgsAbstractGeometry *next();
1350
1351#ifdef SIP_RUN
1352 QgsGeometryConstPartIterator *__iter__();
1353 % MethodCode
1354 sipRes = sipCpp;
1355 % End
1356
1357 SIP_PYOBJECT __next__() SIP_TYPEHINT( QgsAbstractGeometry );
1358 % MethodCode
1359 if ( sipCpp->hasNext() )
1360 sipRes = sipConvertFromType( const_cast< QgsAbstractGeometry * >( sipCpp->next() ), sipType_QgsAbstractGeometry, NULL );
1361 else
1362 PyErr_SetString( PyExc_StopIteration, "" );
1363 % End
1364#endif
1365
1366 private:
1367 const QgsAbstractGeometry *g = nullptr;
1369
1370};
1371
1373
1374#endif //QGSABSTRACTGEOMETRYV2
Provides global constants and enumerations for use throughout the application.
Definition qgis.h:59
WkbType
The WKB type describes the number of dimensions a geometry has.
Definition qgis.h:280
@ Unknown
Unknown.
Definition qgis.h:281
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.
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.
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 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 json asJsonObject(int precision=17) const
Returns a json object representation of the geometry.
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 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:42
A const WKB pointer.
Definition qgswkbptr.h:139
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: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
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:240
#define SIP_CONVERT_TO_SUBCLASS_CODE(code)
Definition qgis_sip.h:199
#define SIP_ENUM_BASETYPE(type)
Definition qgis_sip.h:275
#define SIP_SKIP
Definition qgis_sip.h:134
#define SIP_OUT
Definition qgis_sip.h:58
#define SIP_HOLDGIL
Definition qgis_sip.h:179
#define SIP_FACTORY
Definition qgis_sip.h:84
#define SIP_THROW(name,...)
Definition qgis_sip.h:211
#define SIP_END
Definition qgis_sip.h:216
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:250
Q_DECLARE_OPERATORS_FOR_FLAGS(QgsProjectionSelectionWidget::CrsOptions)
Utility class for identifying a unique vertex within a geometry.
Definition qgsvertexid.h:30