QGIS API Documentation  3.37.0-Master (a5b4d9743e8)
qgsabstractgeometry.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgsabstractgeometry.h
3  -------------------------------------------------------------------
4 Date : 04 Sept 2014
5 Copyright : (C) 2014 by Marco Hugentobler
6 email : 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"
31 using namespace nlohmann;
32 #endif
33 
34 class QgsMapToPixel;
35 class QgsCurve;
36 class QgsMultiCurve;
37 class QgsMultiPoint;
38 
39 struct QgsVertexId;
40 class QgsVertexIterator;
41 class QPainter;
42 class QDomDocument;
43 class QDomElement;
46 class QgsConstWkbPtr;
47 class QPainterPath;
49 class QgsFeedback;
51 class QgsPoint;
52 class QgsRectangle;
53 class QgsBox3D;
54 
55 typedef QVector< QgsPoint > QgsPointSequence;
56 #ifndef SIP_RUN
57 typedef QVector< QgsPointSequence > QgsRingSequence;
58 typedef QVector< QgsRingSequence > QgsCoordinateSequence;
59 #else
60 typedef QVector< QVector< QgsPoint > > QgsRingSequence;
61 typedef QVector< QVector< QVector< QgsPoint > > > QgsCoordinateSequence;
62 #endif
63 
64 
79 class 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 
156  QgsAbstractGeometry() = default;
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 
262  bool isMeasure() const SIP_HOLDGIL
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 
306  enum WkbFlag SIP_ENUM_BASETYPE( IntFlag )
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 
648  virtual QgsAbstractGeometry *snappedToGrid( double hSpacing, double vSpacing, double dSpacing = 0, double mSpacing = 0 ) const = 0 SIP_FACTORY;
649 
669  virtual bool removeDuplicateNodes( double epsilon = 4 * std::numeric_limits<double>::epsilon(), bool useZValues = false ) = 0;
670 
678  virtual double vertexAngle( QgsVertexId vertex ) const = 0;
679 
683  virtual int vertexCount( int part = 0, int ring = 0 ) const = 0;
684 
688  virtual int ringCount( int part = 0 ) const = 0;
689 
695  virtual int partCount() const = 0;
696 
704  virtual bool addZValue( double zValue = 0 ) = 0;
705 
713  virtual bool addMValue( double mValue = 0 ) = 0;
714 
721  virtual bool dropZValue() = 0;
722 
729  virtual bool dropMValue() = 0;
730 
737  virtual void swapXy() = 0;
738 
743  virtual bool convertTo( Qgis::WkbType type );
744 
763  virtual const QgsAbstractGeometry *simplifiedTypeRef() const SIP_HOLDGIL;
764 
776  virtual bool isValid( QString &error SIP_OUT, Qgis::GeometryValidityFlags flags = Qgis::GeometryValidityFlags() ) const = 0;
777 
791  virtual bool transform( QgsAbstractGeometryTransformer *transformer, QgsFeedback *feedback = nullptr ) = 0;
792 
793 #ifndef SIP_RUN
794 
804  virtual void filterVertices( const std::function< bool( const QgsPoint & ) > &filter );
805 
820  virtual void transformVertices( const std::function< QgsPoint( const QgsPoint & ) > &transform );
821 
827  class CORE_EXPORT part_iterator
828  {
829  private:
830 
831  int mIndex = 0;
832  QgsAbstractGeometry *mGeometry = nullptr;
833 
834  public:
836  part_iterator() = default;
837 
839  part_iterator( QgsAbstractGeometry *g, int index );
840 
845  part_iterator &operator++();
846 
848  part_iterator operator++( int );
849 
852 
854  int partNumber() const;
855 
856  bool operator==( part_iterator other ) const;
857  bool operator!=( part_iterator other ) const { return !( *this == other ); }
858  };
859 
869  {
870  return part_iterator( this, 0 );
871  }
872 
881  part_iterator parts_end();
882 
890  QgsGeometryConstPartIterator parts() const;
891 
897  class CORE_EXPORT const_part_iterator
898  {
899  private:
900 
901  int mIndex = 0;
902  const QgsAbstractGeometry *mGeometry = nullptr;
903 
904  public:
906  const_part_iterator() = default;
907 
909  const_part_iterator( const QgsAbstractGeometry *g, int index );
910 
915  const_part_iterator &operator++();
916 
918  const_part_iterator operator++( int );
919 
921  const QgsAbstractGeometry *operator*() const;
922 
924  int partNumber() const;
925 
926  bool operator==( const_part_iterator other ) const;
927  bool operator!=( const_part_iterator other ) const { return !( *this == other ); }
928  };
929 
938  {
939  return const_part_iterator( this, 0 );
940  }
941 
949  const_part_iterator const_parts_end() const;
950 
951 
956  class CORE_EXPORT vertex_iterator
957  {
958  private:
959 
965  struct Level
966  {
967  const QgsAbstractGeometry *g = nullptr;
968  int index = 0;
969 
970  bool operator==( const Level &other ) const;
971  };
972 
973  std::array<Level, 3> levels;
974  int depth = -1;
975 
976  void digDown();
977 
978  public:
980  vertex_iterator() = default;
981 
983  vertex_iterator( const QgsAbstractGeometry *g, int index );
984 
989  vertex_iterator &operator++();
990 
992  vertex_iterator operator++( int );
993 
995  QgsPoint operator*() const;
996 
998  QgsVertexId vertexId() const;
999 
1000  bool operator==( const vertex_iterator &other ) const;
1001  bool operator!=( const vertex_iterator &other ) const { return !( *this == other ); }
1002  };
1003 
1012  {
1013  return vertex_iterator( this, 0 );
1014  }
1015 
1024  {
1025  return vertex_iterator( this, childCount() );
1026  }
1027 #endif
1028 
1062  QgsGeometryPartIterator parts();
1063 
1064 
1087  QgsVertexIterator vertices() const;
1088 
1095 
1096  protected:
1097 
1104  int sortIndex() const;
1105 
1116  virtual int compareToSameClass( const QgsAbstractGeometry *other ) const = 0;
1117 
1122  virtual bool hasChildGeometries() const;
1123 
1128  virtual int childCount() const { return 0; }
1129 
1134  virtual QgsAbstractGeometry *childGeometry( int index ) const { Q_UNUSED( index ) return nullptr; }
1135 
1140  virtual QgsPoint childPoint( int index ) const;
1141 
1142  protected:
1144 
1148  void setZMTypeFromSubGeometry( const QgsAbstractGeometry *subggeom, Qgis::WkbType baseGeomType );
1149 
1154  virtual QgsRectangle calculateBoundingBox() const;
1155 
1162  virtual QgsBox3D calculateBoundingBox3D() const;
1163 
1167  virtual void clearCache() const;
1168 
1169  friend class TestQgsGeometry;
1170 };
1171 
1172 
1173 #ifndef SIP_RUN
1174 
1175 template <class T>
1176 inline T qgsgeometry_cast( const QgsAbstractGeometry *geom )
1177 {
1178  return const_cast<T>( std::remove_pointer<T>::type::cast( geom ) );
1179 }
1180 
1181 #endif
1182 
1183 // clazy:excludeall=qstring-allocations
1184 
1189 class CORE_EXPORT QgsVertexIterator
1190 {
1191  public:
1193  QgsVertexIterator() = default;
1194 
1197  : g( geometry )
1198  , i( g->vertices_begin() )
1199  , n( g->vertices_end() )
1200  {
1201  }
1202 
1204  bool hasNext() const
1205  {
1206  return g && g->vertices_end() != i;
1207  }
1208 
1210  QgsPoint next();
1211 
1212 #ifdef SIP_RUN
1213  QgsVertexIterator *__iter__();
1214  % MethodCode
1215  sipRes = sipCpp;
1216  % End
1217 
1218  SIP_PYOBJECT __next__() SIP_TYPEHINT( QgsPoint );
1219  % MethodCode
1220  if ( sipCpp->hasNext() )
1221  sipRes = sipConvertFromType( new QgsPoint( sipCpp->next() ), sipType_QgsPoint, Py_None );
1222  else
1223  PyErr_SetString( PyExc_StopIteration, "" );
1224  % End
1225 #endif
1226 
1227  private:
1228  const QgsAbstractGeometry *g = nullptr;
1230 
1231 };
1232 
1238 class CORE_EXPORT QgsGeometryPartIterator
1239 {
1240  public:
1243 
1246  : g( geometry )
1247  , i( g->parts_begin() )
1248  , n( g->parts_end() )
1249  {
1250  }
1251 
1253  bool hasNext() const SIP_HOLDGIL
1254  {
1255  return g && g->parts_end() != i;
1256  }
1257 
1259  QgsAbstractGeometry *next();
1260 
1261 #ifdef SIP_RUN
1262  QgsGeometryPartIterator *__iter__();
1263  % MethodCode
1264  sipRes = sipCpp;
1265  % End
1266 
1267  SIP_PYOBJECT __next__() SIP_TYPEHINT( QgsAbstractGeometry );
1268  % MethodCode
1269  if ( sipCpp->hasNext() )
1270  sipRes = sipConvertFromType( sipCpp->next(), sipType_QgsAbstractGeometry, NULL );
1271  else
1272  PyErr_SetString( PyExc_StopIteration, "" );
1273  % End
1274 #endif
1275 
1276  private:
1277  QgsAbstractGeometry *g = nullptr;
1279 
1280 };
1281 
1282 
1289 {
1290  public:
1293 
1296  : g( geometry )
1297  , i( g->const_parts_begin() )
1298  , n( g->const_parts_end() )
1299  {
1300  }
1301 
1303  bool hasNext() const SIP_HOLDGIL
1304  {
1305  return g && g->const_parts_end() != i;
1306  }
1307 
1309  const QgsAbstractGeometry *next();
1310 
1311 #ifdef SIP_RUN
1312  QgsGeometryConstPartIterator *__iter__();
1313  % MethodCode
1314  sipRes = sipCpp;
1315  % End
1316 
1317  SIP_PYOBJECT __next__() SIP_TYPEHINT( QgsAbstractGeometry );
1318  % MethodCode
1319  if ( sipCpp->hasNext() )
1320  sipRes = sipConvertFromType( const_cast< QgsAbstractGeometry * >( sipCpp->next() ), sipType_QgsAbstractGeometry, NULL );
1321  else
1322  PyErr_SetString( PyExc_StopIteration, "" );
1323  % End
1324 #endif
1325 
1326  private:
1327  const QgsAbstractGeometry *g = nullptr;
1329 
1330 };
1331 
1333 
1334 #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:182
@ 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.
virtual QgsAbstractGeometry * boundary() const =0
Returns the closure of the combinatorial boundary of the geometry (ie the topological boundary of the...
SegmentationToleranceType
Segmentation tolerance as maximum angle or maximum difference between approximation and circle.
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.
WkbFlag
WKB export flags.
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.
Definition: qgsexception.h:67
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.
Definition: qgsmaptopixel.h:39
Multi curve geometry collection.
Definition: qgsmulticurve.h:29
Multi point geometry collection.
Definition: qgsmultipoint.h:29
Point geometry type, with support for z-dimension and m-values.
Definition: qgspoint.h:49
A rectangle specified with double values.
Definition: qgsrectangle.h:42
Java-style iterator for traversal of vertices of a geometry.
bool hasNext() const
Find out whether there are more vertices.
QgsVertexIterator()=default
Constructor for QgsVertexIterator.
QgsVertexIterator(const QgsAbstractGeometry *geometry)
Constructs iterator for the given geometry.
static bool hasZ(Qgis::WkbType type)
Tests whether a WKB type contains the z-dimension.
Definition: qgswkbtypes.h:973
static bool hasM(Qgis::WkbType type)
Tests whether a WKB type contains m values.
Definition: qgswkbtypes.h:1023
double ANALYSIS_EXPORT leftOf(const QgsPoint &thepoint, const QgsPoint *p1, const QgsPoint *p2)
Returns whether 'thepoint' is left or right of the line from 'p1' to 'p2'. Negative values mean left ...
Definition: MathUtils.cpp:222
CORE_EXPORT QgsMeshVertex centroid(const QgsMeshFace &face, const QVector< QgsMeshVertex > &vertices)
Returns the centroid of the face.
#define SIP_TYPEHINT(type)
Definition: qgis_sip.h: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