QGIS API Documentation  3.23.0-Master (c716e02dd3)
qgsgeometrycollection.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgsgeometrycollection.h
3  -------------------------------------------------------------------
4 Date : 28 Oct 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 *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15
16 #ifndef QGSGEOMETRYCOLLECTION_H
17 #define QGSGEOMETRYCOLLECTION_H
18
19 #include <QVector>
20
21
22 #include "qgis_core.h"
23 #include "qgis_sip.h"
24 #include "qgsabstractgeometry.h"
25 #include "qgsrectangle.h"
26
27 class QgsPoint;
28
29
36 class CORE_EXPORT QgsGeometryCollection: public QgsAbstractGeometry
37 {
38  public:
39
40
45
48  ~QgsGeometryCollection() override;
49
50  bool operator==( const QgsAbstractGeometry &other ) const override;
51  bool operator!=( const QgsAbstractGeometry &other ) const override;
52
53  QgsGeometryCollection *clone() const override SIP_FACTORY;
54
59  {
60  return mGeometries.size();
61  }
62
63 #ifdef SIP_RUN
64
68  int __len__() const;
69  % MethodCode
70  sipRes = sipCpp->numGeometries();
71  % End
72
74  int __bool__() const;
75  % MethodCode
76  sipRes = true;
77  % End
78 #endif
79
80
86  const QgsAbstractGeometry *geometryN( int n ) const SIP_SKIP
87  {
88  return mGeometries.value( n );
89  }
90
91 #ifndef SIP_RUN
92
97  QgsAbstractGeometry *geometryN( int n ) SIP_HOLDGIL;
98 #else
99
105  SIP_PYOBJECT geometryN( int n ) SIP_TYPEHINT( QgsAbstractGeometry );
106  % MethodCode
107  if ( a0 < 0 || a0 >= sipCpp->numGeometries() )
108  {
109  PyErr_SetString( PyExc_IndexError, QByteArray::number( a0 ) );
110  sipIsErr = 1;
111  }
112  else
113  {
114  return sipConvertFromType( sipCpp->geometryN( a0 ), sipType_QgsAbstractGeometry, NULL );
115  }
116  % End
117 #endif
118
119
120  //methods inherited from QgsAbstractGeometry
121  bool isEmpty() const override SIP_HOLDGIL;
122  int dimension() const override SIP_HOLDGIL;
123  QString geometryType() const override SIP_HOLDGIL;
124  void clear() override;
125  QgsGeometryCollection *snappedToGrid( double hSpacing, double vSpacing, double dSpacing = 0, double mSpacing = 0 ) const override SIP_FACTORY;
126  bool removeDuplicateNodes( double epsilon = 4 * std::numeric_limits<double>::epsilon(), bool useZValues = false ) override;
127  QgsAbstractGeometry *boundary() const override SIP_FACTORY;
128  void adjacentVertices( QgsVertexId vertex, QgsVertexId &previousVertex SIP_OUT, QgsVertexId &nextVertex SIP_OUT ) const override;
129  int vertexNumberFromVertexId( QgsVertexId id ) const override;
130  bool boundingBoxIntersects( const QgsRectangle &rectangle ) const override SIP_HOLDGIL;
131
140  void reserve( int size ) SIP_HOLDGIL;
141
143  virtual bool addGeometry( QgsAbstractGeometry *g SIP_TRANSFER );
144
150  virtual bool insertGeometry( QgsAbstractGeometry *g SIP_TRANSFER, int index );
151
152 #ifndef SIP_RUN
153
159  virtual bool removeGeometry( int nr );
160 #else
161
168  virtual bool removeGeometry( int nr );
169  % MethodCode
170  const int count = sipCpp->numGeometries();
171  if ( a0 < 0 || a0 >= count )
172  {
173  PyErr_SetString( PyExc_IndexError, QByteArray::number( a0 ) );
174  sipIsErr = 1;
175  }
176  else
177  {
178  return PyBool_FromLong( sipCpp->removeGeometry( a0 ) );
179  }
180  % End
181 #endif
182
183  void normalize() final SIP_HOLDGIL;
184  void transform( const QgsCoordinateTransform &ct, Qgis::TransformDirection d = Qgis::TransformDirection::Forward, bool transformZ = false ) override SIP_THROW( QgsCsException );
185  void transform( const QTransform &t, double zTranslate = 0.0, double zScale = 1.0, double mTranslate = 0.0, double mScale = 1.0 ) override;
186
187  void draw( QPainter &p ) const override;
188  QPainterPath asQPainterPath() const override;
189
190  bool fromWkb( QgsConstWkbPtr &wkb ) override;
191  bool fromWkt( const QString &wkt ) override;
192
193  int wkbSize( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const override;
194  QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const override;
195  QString asWkt( int precision = 17 ) const override;
196  QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
197  QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
198  json asJsonObject( int precision = 17 ) const override SIP_SKIP;
199  QString asKml( int precision = 17 ) const override;
200
201  QgsRectangle boundingBox() const override;
202
203  QgsCoordinateSequence coordinateSequence() const override;
204  int nCoordinates() const override;
205
206  double closestSegment( const QgsPoint &pt, QgsPoint &segmentPt SIP_OUT, QgsVertexId &vertexAfter SIP_OUT, int *leftOf SIP_OUT = nullptr, double epsilon = 4 * std::numeric_limits<double>::epsilon() ) const override;
207  bool nextVertex( QgsVertexId &id, QgsPoint &vertex SIP_OUT ) const override;
208
209  //low-level editing
210  bool insertVertex( QgsVertexId position, const QgsPoint &vertex ) override;
211  bool moveVertex( QgsVertexId position, const QgsPoint &newPos ) override;
212  bool deleteVertex( QgsVertexId position ) override;
213
214  double length() const override SIP_HOLDGIL;
215  double area() const override SIP_HOLDGIL;
216  double perimeter() const override SIP_HOLDGIL;
217
218  bool hasCurvedSegments() const override SIP_HOLDGIL;
219
225  QgsAbstractGeometry *segmentize( double tolerance = M_PI_2 / 90, SegmentationToleranceType toleranceType = MaximumAngle ) const override SIP_FACTORY;
226
227  double vertexAngle( QgsVertexId vertex ) const override;
228  double segmentLength( QgsVertexId startVertex ) const override;
229  int vertexCount( int part = 0, int ring = 0 ) const override;
230  int ringCount( int part = 0 ) const override;
231  int partCount() const override;
232  QgsPoint vertexAt( QgsVertexId id ) const override;
233  bool isValid( QString &error SIP_OUT, Qgis::GeometryValidityFlags flags = Qgis::GeometryValidityFlags() ) const override;
234
235  bool addZValue( double zValue = 0 ) override;
236  bool addMValue( double mValue = 0 ) override;
237  bool dropZValue() override;
238  bool dropMValue() override;
239  void swapXy() override;
240  QgsGeometryCollection *toCurveType() const override SIP_FACTORY;
241  const QgsAbstractGeometry *simplifiedTypeRef() const override SIP_HOLDGIL;
242
243  bool transform( QgsAbstractGeometryTransformer *transformer, QgsFeedback *feedback = nullptr ) override;
244
245 #ifndef SIP_RUN
246  void filterVertices( const std::function< bool( const QgsPoint & ) > &filter ) override;
247  void transformVertices( const std::function< QgsPoint( const QgsPoint & ) > &transform ) override;
248
256  inline static const QgsGeometryCollection *cast( const QgsAbstractGeometry *geom )
257  {
258  if ( geom && QgsWkbTypes::isMultiType( geom->wkbType() ) )
259  return static_cast<const QgsGeometryCollection *>( geom );
260  return nullptr;
261  }
262 #endif
263
264
265 #ifdef SIP_RUN
266
277  SIP_PYOBJECT __getitem__( int index ) SIP_TYPEHINT( QgsAbstractGeometry );
278  % MethodCode
279  const int count = sipCpp->numGeometries();
280  if ( a0 < -count || a0 >= count )
281  {
282  PyErr_SetString( PyExc_IndexError, QByteArray::number( a0 ) );
283  sipIsErr = 1;
284  }
285  else if ( a0 >= 0 )
286  {
287  return sipConvertFromType( sipCpp->geometryN( a0 ), sipType_QgsAbstractGeometry, NULL );
288  }
289  else
290  {
291  return sipConvertFromType( sipCpp->geometryN( count + a0 ), sipType_QgsAbstractGeometry, NULL );
292  }
293  % End
294
305  void __delitem__( int index );
306  % MethodCode
307  const int count = sipCpp->numGeometries();
308  if ( a0 >= 0 && a0 < count )
309  sipCpp->removeGeometry( a0 );
310  else if ( a0 < 0 && a0 >= -count )
311  sipCpp->removeGeometry( count + a0 );
312  else
313  {
314  PyErr_SetString( PyExc_IndexError, QByteArray::number( a0 ) );
315  sipIsErr = 1;
316  }
317  % End
318
324  SIP_PYOBJECT __iter__() SIP_TYPEHINT( QgsGeometryPartIterator );
325  % MethodCode
326  sipRes = sipConvertFromNewType( new QgsGeometryPartIterator( sipCpp ), sipType_QgsGeometryPartIterator, Py_None );
327  % End
328 #endif
329
331
332  protected:
333  int childCount() const override;
334  QgsAbstractGeometry *childGeometry( int index ) const override;
335  int compareToSameClass( const QgsAbstractGeometry *other ) const final;
336
337  protected:
338  QVector< QgsAbstractGeometry * > mGeometries;
339
344  virtual bool wktOmitChildType() const;
345
349  bool fromCollectionWkt( const QString &wkt, const QVector<QgsAbstractGeometry *> &subtypes, const QString &defaultChildWkbType = QString() );
350
351  QgsRectangle calculateBoundingBox() const override;
352  void clearCache() const override;
353
354  private:
355
356  mutable QgsRectangle mBoundingBox;
357  mutable bool mHasCachedValidity = false;
358  mutable QString mValidityFailureReason;
359 };
360
361 // clazy:excludeall=qstring-allocations
362
363 #endif // QGSGEOMETRYCOLLECTION_H
The Qgis class provides global constants for use throughout the application.
Definition: qgis.h:64
An abstract base class for classes which transform geometries by transforming input points to output ...
Abstract base class for all geometries.
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 QgsAbstractGeometry * createEmptyWithSameType() const =0
Creates a new geometry with the same class and same WKB type as the original and transfers ownership.
virtual QgsAbstractGeometry * clone() const =0
Clones the geometry by performing a deep copy.
QgsAbstractGeometry & operator=(const QgsAbstractGeometry &geom)
virtual bool operator!=(const QgsAbstractGeometry &other) const =0
virtual bool isEmpty() const
Returns true if the geometry is empty.
virtual void normalize()=0
Reorganizes the geometry into a normalized form (or "canonical" form).
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...
QgsWkbTypes::Type wkbType() const SIP_HOLDGIL
Returns the WKB type of the geometry.
virtual bool operator==(const QgsAbstractGeometry &other) const =0
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:66
Base class for feedback objects to be used for cancellation of something running in a worker thread.
Definition: qgsfeedback.h:45
Geometry collection.
static const QgsGeometryCollection * cast(const QgsAbstractGeometry *geom)
Cast the geom to a QgsGeometryCollection.
int numGeometries() const SIP_HOLDGIL
Returns the number of geometries within the collection.
const QgsAbstractGeometry * geometryN(int n) const
Returns a const reference to a geometry from within the collection.
Java-style iterator for traversal of parts of a geometry.
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
static bool isMultiType(Type type) SIP_HOLDGIL
Returns true if the WKB type is a multi type.
Definition: qgswkbtypes.h:862
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:292
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
#define SIP_THROW(name)
Definition: qgis_sip.h:189
#define SIP_TYPEHINT(type)
Definition: qgis_sip.h:218
#define SIP_SKIP
Definition: qgis_sip.h:126
#define SIP_TRANSFER
Definition: qgis_sip.h:36
#define SIP_OUT
Definition: qgis_sip.h:58
#define SIP_HOLDGIL
Definition: qgis_sip.h:157
#define SIP_FACTORY
Definition: qgis_sip.h:76
QVector< QgsRingSequence > QgsCoordinateSequence
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