QGIS API Documentation 3.34.0-Prizren (ffbdd678812)
Loading...
Searching...
No Matches
qgsspatialindex.h
Go to the documentation of this file.
1/***************************************************************************
2 qgsspatialindex.h - wrapper class for spatial index library
3 ----------------------
4 begin : December 2006
5 copyright : (C) 2006 by Martin Dobias
6 email : wonder.sk at gmail 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 QGSSPATIALINDEX_H
17#define QGSSPATIALINDEX_H
18
19
20#include "qgis_sip.h"
21
22// forward declaration
23namespace SpatialIndex SIP_SKIP
24{
25 class IStorageManager;
26 class ISpatialIndex;
27 class Region;
28 class Point;
29
30 namespace StorageManager
31 {
32 class IBuffer;
33 }
34}
35
36class QgsFeedback;
37class QgsFeature;
38class QgsRectangle;
39class QgsPointXY;
40
41#include "qgis_core.h"
42#include "qgsfeaturesink.h"
43#include <QList>
44#include <QSharedDataPointer>
45
46#include "qgsfeature.h"
47
48class QgsSpatialIndexData;
51
67class CORE_EXPORT QgsSpatialIndex : public QgsFeatureSink
68{
69
70 public:
71
72 /* creation of spatial index */
73
75 enum Flag
76 {
77 FlagStoreFeatureGeometries = 1 << 0,
78 };
79 Q_DECLARE_FLAGS( Flags, Flag )
80
81
84 QgsSpatialIndex( QgsSpatialIndex::Flags flags = QgsSpatialIndex::Flags() );
85
96 explicit QgsSpatialIndex( const QgsFeatureIterator &fi, QgsFeedback *feedback = nullptr, QgsSpatialIndex::Flags flags = QgsSpatialIndex::Flags() );
97
98#ifndef SIP_RUN
99
112 explicit QgsSpatialIndex( const QgsFeatureIterator &fi, const std::function< bool( const QgsFeature & ) > &callback, QgsSpatialIndex::Flags flags = QgsSpatialIndex::Flags() );
113#endif
114
126 explicit QgsSpatialIndex( const QgsFeatureSource &source, QgsFeedback *feedback = nullptr, QgsSpatialIndex::Flags flags = QgsSpatialIndex::Flags() );
127
129 QgsSpatialIndex( const QgsSpatialIndex &other );
130
132 ~QgsSpatialIndex() override;
133
135 QgsSpatialIndex &operator=( const QgsSpatialIndex &other );
136
137 /* operations */
138
143 Q_DECL_DEPRECATED bool insertFeature( const QgsFeature &feature ) SIP_DEPRECATED;
144
152 bool addFeature( QgsFeature &feature, QgsFeatureSink::Flags flags = QgsFeatureSink::Flags() ) override;
153
161 bool addFeatures( QgsFeatureList &features, QgsFeatureSink::Flags flags = QgsFeatureSink::Flags() ) override;
162
168 Q_DECL_DEPRECATED bool insertFeature( QgsFeatureId id, const QgsRectangle &bounds ) SIP_DEPRECATED;
169
175 bool addFeature( QgsFeatureId id, const QgsRectangle &bounds );
176
180 bool deleteFeature( const QgsFeature &feature );
181
182
183 /* queries */
184
192 QList<QgsFeatureId> intersects( const QgsRectangle &rectangle ) const;
193
210 QList<QgsFeatureId> nearestNeighbor( const QgsPointXY &point, int neighbors = 1, double maxDistance = 0 ) const;
211
230 QList<QgsFeatureId> nearestNeighbor( const QgsGeometry &geometry, int neighbors = 1, double maxDistance = 0 ) const;
231
232#ifndef SIP_RUN
233
241 QgsGeometry geometry( QgsFeatureId id ) const;
242
243#else
244
254 SIP_PYOBJECT geometry( QgsFeatureId id ) const SIP_TYPEHINT( QgsGeometry );
255 % MethodCode
256 std::unique_ptr< QgsGeometry > g = std::make_unique< QgsGeometry >( sipCpp->geometry( a0 ) );
257 if ( g->isNull() )
258 {
259 PyErr_SetString( PyExc_KeyError, QStringLiteral( "No geometry with feature id %1 exists in the index." ).arg( a0 ).toUtf8().constData() );
260 sipIsErr = 1;
261 }
262 else
263 {
264 sipRes = sipConvertFromType( g.release(), sipType_QgsGeometry, Py_None );
265 }
266 % End
267#endif
268
269 /* debugging */
270
272 QAtomicInt SIP_PYALTERNATIVETYPE( int ) refs() const;
273
274 private:
275
284 static bool featureInfo( const QgsFeature &f, SpatialIndex::Region &r, QgsFeatureId &id ) SIP_SKIP;
285
295 static bool featureInfo( const QgsFeature &f, QgsRectangle &rect, QgsFeatureId &id );
296
297 friend class QgsFeatureIteratorDataStream; // for access to featureInfo()
298
299 private:
300
301 QSharedDataPointer<QgsSpatialIndexData> d;
302
303};
304
305Q_DECLARE_OPERATORS_FOR_FLAGS( QgsSpatialIndex::Flags )
306
307#endif //QGSSPATIALINDEX_H
Wrapper for iterator of features from vector data provider or vector layer.
An interface for objects which accept features via addFeature(s) methods.
virtual bool addFeature(QgsFeature &feature, QgsFeatureSink::Flags flags=QgsFeatureSink::Flags())
Adds a single feature to the sink.
virtual bool addFeatures(QgsFeatureList &features, QgsFeatureSink::Flags flags=QgsFeatureSink::Flags())=0
Adds a list of features to the sink.
An interface for objects which provide features via a getFeatures method.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition qgsfeature.h:56
Base class for feedback objects to be used for cancellation of something running in a worker thread.
Definition qgsfeedback.h:45
A geometry is the spatial representation of a feature.
A class to represent a 2D point.
Definition qgspointxy.h:59
A rectangle specified with double values.
A spatial index for QgsFeature objects.
Flag
Flags controlling index behavior.
QgsSpatialIndex(const QgsFeatureIterator &fi, const std::function< bool(const QgsFeature &) > &callback, QgsSpatialIndex::Flags flags=QgsSpatialIndex::Flags())
Constructor - creates R-tree and bulk loads it with features from the iterator.
#define SIP_TYPEHINT(type)
Definition qgis_sip.h:227
#define SIP_PYALTERNATIVETYPE(type)
Definition qgis_sip.h:141
#define SIP_DEPRECATED
Definition qgis_sip.h:106
#define SIP_SKIP
Definition qgis_sip.h:126
QList< QgsFeature > QgsFeatureList
Definition qgsfeature.h:920
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
Q_DECLARE_OPERATORS_FOR_FLAGS(QgsTextRendererUtils::CurvedTextFlags)