QGIS API Documentation  3.16.0-Hannover (43b64b13f3)
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 #ifndef SIP_RUN
240  void filterVertices( const std::function< bool( const QgsPoint & ) > &filter ) override;
241  void transformVertices( const std::function< QgsPoint( const QgsPoint & ) > &transform ) override;
242 
250  inline const QgsGeometryCollection *cast( const QgsAbstractGeometry *geom ) const
251  {
252  if ( geom && QgsWkbTypes::isMultiType( geom->wkbType() ) )
253  return static_cast<const QgsGeometryCollection *>( geom );
254  return nullptr;
255  }
256 #endif
257 
258 
259 #ifdef SIP_RUN
260 
269  SIP_PYOBJECT __getitem__( int index ) SIP_TYPEHINT( QgsAbstractGeometry );
270  % MethodCode
271  const int count = sipCpp->numGeometries();
272  if ( a0 < -count || a0 >= count )
273  {
274  PyErr_SetString( PyExc_IndexError, QByteArray::number( a0 ) );
275  sipIsErr = 1;
276  }
277  else if ( a0 >= 0 )
278  {
279  return sipConvertFromType( sipCpp->geometryN( a0 ), sipType_QgsAbstractGeometry, NULL );
280  }
281  else
282  {
283  return sipConvertFromType( sipCpp->geometryN( count + a0 ), sipType_QgsAbstractGeometry, NULL );
284  }
285  % End
286 
295  void __delitem__( int index );
296  % MethodCode
297  const int count = sipCpp->numGeometries();
298  if ( a0 >= 0 && a0 < count )
299  sipCpp->removeGeometry( a0 );
300  else if ( a0 < 0 && a0 >= -count )
301  sipCpp->removeGeometry( count + a0 );
302  else
303  {
304  PyErr_SetString( PyExc_IndexError, QByteArray::number( a0 ) );
305  sipIsErr = 1;
306  }
307  % End
308 
314  SIP_PYOBJECT __iter__() SIP_TYPEHINT( QgsGeometryPartIterator );
315  % MethodCode
316  sipRes = sipConvertFromNewType( new QgsGeometryPartIterator( sipCpp ), sipType_QgsGeometryPartIterator, Py_None );
317  % End
318 #endif
319 
321 
322  protected:
323  int childCount() const override;
324  QgsAbstractGeometry *childGeometry( int index ) const override;
325 
326  protected:
327  QVector< QgsAbstractGeometry * > mGeometries;
328 
333  virtual bool wktOmitChildType() const;
334 
338  bool fromCollectionWkt( const QString &wkt, const QVector<QgsAbstractGeometry *> &subtypes, const QString &defaultChildWkbType = QString() );
339 
340  QgsRectangle calculateBoundingBox() const override;
341  void clearCache() const override;
342 
343  private:
344 
345  mutable QgsRectangle mBoundingBox;
346  mutable bool mHasCachedValidity = false;
347  mutable QString mValidityFailureReason;
348 };
349 
350 // clazy:excludeall=qstring-allocations
351 
352 #endif // QGSGEOMETRYCOLLECTION_H
QgsCoordinateSequence
QVector< QgsRingSequence > QgsCoordinateSequence
Definition: qgsabstractgeometry.h:51
QgsPoint
Point geometry type, with support for z-dimension and m-values.
Definition: qgspoint.h:38
SIP_OUT
#define SIP_OUT
Definition: qgis_sip.h:58
QgsAbstractGeometry::filterVertices
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...
Definition: qgsabstractgeometry.cpp:250
QgsCoordinateTransform::TransformDirection
TransformDirection
Enum used to indicate the direction (forward or inverse) of the transform.
Definition: qgscoordinatetransform.h:59
closestSegment
double closestSegment(const QgsPolylineXY &pl, const QgsPointXY &pt, int &vertexAfter, double epsilon)
Definition: qgstracer.cpp:68
QgsRectangle
A rectangle specified with double values.
Definition: qgsrectangle.h:42
SIP_TYPEHINT
#define SIP_TYPEHINT(type)
Definition: qgis_sip.h:218
QgsGeometryCollection::numGeometries
int numGeometries() const SIP_HOLDGIL
Returns the number of geometries within the collection.
Definition: qgsgeometrycollection.h:57
SIP_FACTORY
#define SIP_FACTORY
Definition: qgis_sip.h:76
MathUtils::leftOf
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
precision
int precision
Definition: qgswfsgetfeature.cpp:49
QgsGeometryCollection
Geometry collection.
Definition: qgsgeometrycollection.h:36
QgsGeometryCollection::cast
const QgsGeometryCollection * cast(const QgsAbstractGeometry *geom) const
Cast the geom to a QgsGeometryCollection.
Definition: qgsgeometrycollection.h:250
QgsCsException
Custom exception class for Coordinate Reference System related exceptions.
Definition: qgsexception.h:66
SIP_SKIP
#define SIP_SKIP
Definition: qgis_sip.h:126
SIP_HOLDGIL
#define SIP_HOLDGIL
Definition: qgis_sip.h:157
SIP_THROW
#define SIP_THROW(name)
Definition: qgis_sip.h:189
QgsAbstractGeometry::wkbType
QgsWkbTypes::Type wkbType() const SIP_HOLDGIL
Returns the WKB type of the geometry.
Definition: qgsabstractgeometry.h:193
QgsConstWkbPtr
Definition: qgswkbptr.h:128
QgsAbstractGeometry::clone
virtual QgsAbstractGeometry * clone() const =0
Clones the geometry by performing a deep copy.
qgis_sip.h
SIP_TRANSFER
#define SIP_TRANSFER
Definition: qgis_sip.h:36
QgsAbstractGeometry::isEmpty
virtual bool isEmpty() const
Returns true if the geometry is empty.
Definition: qgsabstractgeometry.cpp:298
QgsAbstractGeometry
Abstract base class for all geometries.
Definition: qgsabstractgeometry.h:74
QgsCoordinateTransform::ForwardTransform
@ ForwardTransform
Transform from source to destination CRS.
Definition: qgscoordinatetransform.h:60
QgsAbstractGeometry::createEmptyWithSameType
virtual QgsAbstractGeometry * createEmptyWithSameType() const =0
Creates a new geometry with the same class and same WKB type as the original and transfers ownership.
QgsGeometryCollection::geometryN
const QgsAbstractGeometry * geometryN(int n) const
Returns a const reference to a geometry from within the collection.
Definition: qgsgeometrycollection.h:85
QgsAbstractGeometry::operator=
QgsAbstractGeometry & operator=(const QgsAbstractGeometry &geom)
Definition: qgsabstractgeometry.cpp:33
c
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
Definition: porting_processing.dox:1
QgsAbstractGeometry::operator!=
virtual bool operator!=(const QgsAbstractGeometry &other) const =0
QgsGeometryPartIterator
Java-style iterator for traversal of parts of a geometry.
Definition: qgsabstractgeometry.h:1219
QgsVertexId
Utility class for identifying a unique vertex within a geometry.
Definition: qgsabstractgeometry.h:1059
QgsAbstractGeometry::transformVertices
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.
Definition: qgsabstractgeometry.cpp:255
QgsAbstractGeometry::operator==
virtual bool operator==(const QgsAbstractGeometry &other) const =0
QgsWkbTypes::isMultiType
static bool isMultiType(Type type) SIP_HOLDGIL
Returns true if the WKB type is a multi type.
Definition: qgswkbtypes.h:832
QgsCoordinateTransform
Class for doing transforms between two map coordinate systems.
Definition: qgscoordinatetransform.h:53
QgsAbstractGeometry::transform
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.
qgsabstractgeometry.h