QGIS API Documentation 3.28.0-Firenze (ed3ad0430f)
qgsgeometrycollection.h
Go to the documentation of this file.
1/***************************************************************************
2 qgsgeometrycollection.h
3 -------------------------------------------------------------------
4Date : 28 Oct 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 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
27class QgsPoint;
28
29
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
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:72
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.
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
virtual QgsAbstractGeometry * clone() const =0
Clones the geometry by performing a deep copy.
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_TYPEHINT(type)
Definition: qgis_sip.h:227
#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:166
#define SIP_FACTORY
Definition: qgis_sip.h:76
#define SIP_THROW(name,...)
Definition: qgis_sip.h:198
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