QGIS API Documentation  3.25.0-Master (dec16ba68b)
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 
45 class 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 
104 class 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)
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:223
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:45
bool isCanceled() const SIP_HOLDGIL
Tells whether the operation has been canceled already.
Definition: qgsfeedback.h:54
const QgsAbstractGeometry * constGet() const SIP_HOLDGIL
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
QgsWkbTypes::Type wkbType() const SIP_HOLDGIL
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 Type flatType(Type type) SIP_HOLDGIL
Returns the flat type for a WKB type.
Definition: qgswkbtypes.h:732