QGIS API Documentation  3.18.1-Zürich (202f1bf7e5)
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 *
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 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 
26 class QgsPoint;
27 
28 
35 class CORE_EXPORT QgsGeometryCollection: public QgsAbstractGeometry
36 {
37  public:
38 
39 
44 
47  ~QgsGeometryCollection() override;
48 
49  bool operator==( const QgsAbstractGeometry &other ) const override;
50  bool operator!=( const QgsAbstractGeometry &other ) const override;
51 
52  QgsGeometryCollection *clone() const override SIP_FACTORY;
53 
58  {
59  return mGeometries.size();
60  }
61 
62 #ifdef SIP_RUN
63 
67  int __len__() const;
68  % MethodCode
69  sipRes = sipCpp->numGeometries();
70  % End
71 
73  int __bool__() const;
74  % MethodCode
75  sipRes = true;
76  % End
77 #endif
78 
79 
85  const QgsAbstractGeometry *geometryN( int n ) const SIP_SKIP
86  {
87  return mGeometries.value( n );
88  }
89 
90 #ifndef SIP_RUN
91 
96  QgsAbstractGeometry *geometryN( int n ) SIP_HOLDGIL;
97 #else
98 
103  SIP_PYOBJECT geometryN( int n ) SIP_TYPEHINT( QgsAbstractGeometry );
104  % MethodCode
105  if ( a0 < 0 || a0 >= sipCpp->numGeometries() )
106  {
107  PyErr_SetString( PyExc_IndexError, QByteArray::number( a0 ) );
108  sipIsErr = 1;
109  }
110  else
111  {
112  return sipConvertFromType( sipCpp->geometryN( a0 ), sipType_QgsAbstractGeometry, NULL );
113  }
114  % End
115 #endif
116 
117 
118  //methods inherited from QgsAbstractGeometry
119  bool isEmpty() const override SIP_HOLDGIL;
120  int dimension() const override SIP_HOLDGIL;
121  QString geometryType() const override SIP_HOLDGIL;
122  void clear() override;
123  QgsGeometryCollection *snappedToGrid( double hSpacing, double vSpacing, double dSpacing = 0, double mSpacing = 0 ) const override SIP_FACTORY;
124  bool removeDuplicateNodes( double epsilon = 4 * std::numeric_limits<double>::epsilon(), bool useZValues = false ) override;
125  QgsAbstractGeometry *boundary() const override SIP_FACTORY;
126  void adjacentVertices( QgsVertexId vertex, QgsVertexId &previousVertex SIP_OUT, QgsVertexId &nextVertex SIP_OUT ) const override;
127  int vertexNumberFromVertexId( QgsVertexId id ) const override;
128 
137  void reserve( int size ) SIP_HOLDGIL;
138 
140  virtual bool addGeometry( QgsAbstractGeometry *g SIP_TRANSFER );
141 
147  virtual bool insertGeometry( QgsAbstractGeometry *g SIP_TRANSFER, int index );
148 
149 #ifndef SIP_RUN
150 
156  virtual bool removeGeometry( int nr );
157 #else
158 
166  virtual bool removeGeometry( int nr );
167  % MethodCode
168  const int count = sipCpp->numGeometries();
169  if ( a0 < 0 || a0 >= count )
170  {
171  PyErr_SetString( PyExc_IndexError, QByteArray::number( a0 ) );
172  sipIsErr = 1;
173  }
174  else
175  {
176  return PyBool_FromLong( sipCpp->removeGeometry( a0 ) );
177  }
178  % End
179 #endif
180 
182  void transform( const QTransform &t, double zTranslate = 0.0, double zScale = 1.0, double mTranslate = 0.0, double mScale = 1.0 ) override;
183 
184  void draw( QPainter &p ) const override;
185  QPainterPath asQPainterPath() const override;
186 
187  bool fromWkb( QgsConstWkbPtr &wkb ) override;
188  bool fromWkt( const QString &wkt ) override;
189 
190  int wkbSize( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const override;
191  QByteArray asWkb( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const override;
192  QString asWkt( int precision = 17 ) const override;
193  QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
194  QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
195  json asJsonObject( int precision = 17 ) const override SIP_SKIP;
196  QString asKml( int precision = 17 ) const override;
197 
198  QgsRectangle boundingBox() const override;
199 
200  QgsCoordinateSequence coordinateSequence() const override;
201  int nCoordinates() const override;
202 
203  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;
204  bool nextVertex( QgsVertexId &id, QgsPoint &vertex SIP_OUT ) const override;
205 
206  //low-level editing
207  bool insertVertex( QgsVertexId position, const QgsPoint &vertex ) override;
208  bool moveVertex( QgsVertexId position, const QgsPoint &newPos ) override;
209  bool deleteVertex( QgsVertexId position ) override;
210 
211  double length() const override SIP_HOLDGIL;
212  double area() const override SIP_HOLDGIL;
213  double perimeter() const override SIP_HOLDGIL;
214 
215  bool hasCurvedSegments() const override SIP_HOLDGIL;
216 
222  QgsAbstractGeometry *segmentize( double tolerance = M_PI_2 / 90, SegmentationToleranceType toleranceType = MaximumAngle ) const override SIP_FACTORY;
223 
224  double vertexAngle( QgsVertexId vertex ) const override;
225  double segmentLength( QgsVertexId startVertex ) const override;
226  int vertexCount( int part = 0, int ring = 0 ) const override;
227  int ringCount( int part = 0 ) const override;
228  int partCount() const override;
229  QgsPoint vertexAt( QgsVertexId id ) const override;
230  bool isValid( QString &error SIP_OUT, int flags = 0 ) const override;
231 
232  bool addZValue( double zValue = 0 ) override;
233  bool addMValue( double mValue = 0 ) override;
234  bool dropZValue() override;
235  bool dropMValue() override;
236  void swapXy() override;
237  QgsGeometryCollection *toCurveType() const override SIP_FACTORY;
238 
239  bool transform( QgsAbstractGeometryTransformer *transformer, QgsFeedback *feedback = nullptr ) override;
240 
241 #ifndef SIP_RUN
242  void filterVertices( const std::function< bool( const QgsPoint & ) > &filter ) override;
243  void transformVertices( const std::function< QgsPoint( const QgsPoint & ) > &transform ) override;
244 
252  inline static const QgsGeometryCollection *cast( const QgsAbstractGeometry *geom )
253  {
254  if ( geom && QgsWkbTypes::isMultiType( geom->wkbType() ) )
255  return static_cast<const QgsGeometryCollection *>( geom );
256  return nullptr;
257  }
258 #endif
259 
260 
261 #ifdef SIP_RUN
262 
271  SIP_PYOBJECT __getitem__( int index ) SIP_TYPEHINT( QgsAbstractGeometry );
272  % MethodCode
273  const int count = sipCpp->numGeometries();
274  if ( a0 < -count || a0 >= count )
275  {
276  PyErr_SetString( PyExc_IndexError, QByteArray::number( a0 ) );
277  sipIsErr = 1;
278  }
279  else if ( a0 >= 0 )
280  {
281  return sipConvertFromType( sipCpp->geometryN( a0 ), sipType_QgsAbstractGeometry, NULL );
282  }
283  else
284  {
285  return sipConvertFromType( sipCpp->geometryN( count + a0 ), sipType_QgsAbstractGeometry, NULL );
286  }
287  % End
288 
297  void __delitem__( int index );
298  % MethodCode
299  const int count = sipCpp->numGeometries();
300  if ( a0 >= 0 && a0 < count )
301  sipCpp->removeGeometry( a0 );
302  else if ( a0 < 0 && a0 >= -count )
303  sipCpp->removeGeometry( count + a0 );
304  else
305  {
306  PyErr_SetString( PyExc_IndexError, QByteArray::number( a0 ) );
307  sipIsErr = 1;
308  }
309  % End
310 
316  SIP_PYOBJECT __iter__() SIP_TYPEHINT( QgsGeometryPartIterator );
317  % MethodCode
318  sipRes = sipConvertFromNewType( new QgsGeometryPartIterator( sipCpp ), sipType_QgsGeometryPartIterator, Py_None );
319  % End
320 #endif
321 
323 
324  protected:
325  int childCount() const override;
326  QgsAbstractGeometry *childGeometry( int index ) const override;
327 
328  protected:
329  QVector< QgsAbstractGeometry * > mGeometries;
330 
335  virtual bool wktOmitChildType() const;
336 
340  bool fromCollectionWkt( const QString &wkt, const QVector<QgsAbstractGeometry *> &subtypes, const QString &defaultChildWkbType = QString() );
341 
342  QgsRectangle calculateBoundingBox() const override;
343  void clearCache() const override;
344 
345  private:
346 
347  mutable QgsRectangle mBoundingBox;
348  mutable bool mHasCachedValidity = false;
349  mutable QString mValidityFailureReason;
350 };
351 
352 // clazy:excludeall=qstring-allocations
353 
354 #endif // QGSGEOMETRYCOLLECTION_H
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 void transform(const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection d=QgsCoordinateTransform::ForwardTransform, bool transformZ=false) SIP_THROW(QgsCsException)=0
Transforms the geometry using a coordinate transform.
virtual bool isEmpty() const
Returns true if the geometry is empty.
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:130
Class for doing transforms between two map coordinate systems.
TransformDirection
Enum used to indicate the direction (forward or inverse) of the transform.
@ ForwardTransform
Transform from source to destination CRS.
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:38
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:832
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:68
int precision
Utility class for identifying a unique vertex within a geometry.