QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
qgsspatialindexkdbush_p.h
Go to the documentation of this file.
1/***************************************************************************
2 qgsspatialindexkdbush_p.h
3 -----------------
4 begin : July 2018
5 copyright : (C) 2018 by Nyall Dawson
6 email : nyall dot dawson at gmail dot com
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
18#ifndef QGSSPATIALINDEXKDBUSH_PRIVATE_H
19#define QGSSPATIALINDEXKDBUSH_PRIVATE_H
20
21#define SIP_NO_FILE
22
24
25//
26// W A R N I N G
27// -------------
28//
29// This file is not part of the QGIS API. It exists purely as an
30// implementation detail. This header file may change from version to
31// version without notice, or even be removed.
32//
33
34#include "qgsfeature.h"
36#include "qgsfeatureiterator.h"
37#include "qgsfeedback.h"
38#include "qgsfeaturesource.h"
39#include <memory>
40#include <QList>
41#include "kdbush.hpp"
42#include <functional>
43
44
45class PointXYKDBush : public kdbush::KDBush< std::pair<double, double>, QgsSpatialIndexKDBushData, std::size_t >
46{
47 public:
48
49 explicit PointXYKDBush( QgsFeatureIterator &fi, QgsFeedback *feedback = nullptr, const std::function< bool( const QgsFeature & ) > *callback = nullptr )
50 {
51 fillFromIterator( fi, feedback, callback );
52 }
53
54 explicit PointXYKDBush( const QgsFeatureSource &source, QgsFeedback *feedback )
55 {
56 points.reserve( source.featureCount() );
57 QgsFeatureIterator it = source.getFeatures( QgsFeatureRequest().setNoAttributes() );
58 fillFromIterator( it, feedback, nullptr );
59 }
60
61 void fillFromIterator( QgsFeatureIterator &fi, QgsFeedback *feedback = nullptr, const std::function< bool( const QgsFeature & ) > *callback = nullptr )
62 {
63 std::size_t size = 0;
64
65 QgsFeature f;
66 while ( fi.nextFeature( f ) )
67 {
68 if ( feedback && feedback->isCanceled() )
69 return;
70
71 if ( callback && !( *callback )( f ) )
72 return;
73
74 if ( !f.hasGeometry() )
75 continue;
76
78 {
79 const QgsPoint *point = qgsgeometry_cast< const QgsPoint * >( f.geometry().constGet() );
80 points.emplace_back( QgsSpatialIndexKDBushData( f.id(), point->x(), point->y() ) );
81 }
82 else
83 {
84 // not a point
85 continue;
86 }
87
88 size++;
89 }
90
91 if ( size == 0 )
92 return;
93
94 sortKD( 0, size - 1, 0 );
95 }
96
97 std::size_t size() const
98 {
99 return points.size();
100 }
101
102};
103
104class QgsSpatialIndexKDBushPrivate
105{
106 public:
107
108 explicit QgsSpatialIndexKDBushPrivate( QgsFeatureIterator &fi, QgsFeedback *feedback = nullptr )
109 : index( std::make_unique < PointXYKDBush >( fi, feedback ) )
110 {}
111
112 explicit QgsSpatialIndexKDBushPrivate( const QgsFeatureSource &source, QgsFeedback *feedback = nullptr )
113 : index( std::make_unique < PointXYKDBush >( source, feedback ) )
114 {}
115
116 explicit QgsSpatialIndexKDBushPrivate( QgsFeatureIterator &fi, const std::function< bool( const QgsFeature & ) > &callback, QgsFeedback *feedback = nullptr )
117 : index( std::make_unique < PointXYKDBush >( fi, feedback, &callback ) )
118 {}
119
120 QAtomicInt ref = 1;
121 std::unique_ptr< PointXYKDBush > index;
122};
123
125
126#endif // QGSSPATIALINDEXKDBUSH_PRIVATE_H
Wrapper for iterator of features from vector data provider or vector layer.
bool nextFeature(QgsFeature &f)
Fetch next feature and stores in f, returns true on success.
This class wraps a request for features to a vector layer (or directly its vector data provider).
An interface for objects which provide features via a getFeatures method.
virtual QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const =0
Returns an iterator for the features in the source.
virtual long long featureCount() const =0
Returns the number of features contained in the source, or -1 if the feature count is unknown.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition: qgsfeature.h:56
QgsGeometry geometry
Definition: qgsfeature.h:67
bool hasGeometry() const
Returns true if the feature has an associated geometry.
Definition: qgsfeature.cpp:230
Q_GADGET QgsFeatureId id
Definition: qgsfeature.h:64
Base class for feedback objects to be used for cancellation of something running in a worker thread.
Definition: qgsfeedback.h:44
bool isCanceled() const
Tells whether the operation has been canceled already.
Definition: qgsfeedback.h:53
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
Qgis::WkbType wkbType() const
Returns type of the geometry as a WKB type (point / linestring / polygon etc.)
Point geometry type, with support for z-dimension and m-values.
Definition: qgspoint.h:49
Q_GADGET double x
Definition: qgspoint.h:52
double y
Definition: qgspoint.h:53
A container for data stored inside a QgsSpatialIndexKDBush index.
static Qgis::WkbType flatType(Qgis::WkbType type)
Returns the flat type for a WKB type.
Definition: qgswkbtypes.h:628