QGIS API Documentation 4.0.0-Norrköping (1ddcee3d0e4)
Loading...
Searching...
No Matches
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
23
24//
25// W A R N I N G
26// -------------
27//
28// This file is not part of the QGIS API. It exists purely as an
29// implementation detail. This header file may change from version to
30// version without notice, or even be removed.
31//
32
33#include <functional>
34#include <memory>
35
36#include "kdbush.hpp"
37#include "qgsfeature.h"
38#include "qgsfeatureiterator.h"
39#include "qgsfeaturesource.h"
40#include "qgsfeedback.h"
42
43#include <QList>
44
45#define SIP_NO_FILE
46
47class PointXYKDBush : public kdbush::KDBush< std::pair<double, double>, QgsSpatialIndexKDBushData, std::size_t >
48{
49 public:
50 explicit PointXYKDBush( QgsFeatureIterator &fi, QgsFeedback *feedback = nullptr, const std::function< bool( const QgsFeature & ) > *callback = nullptr )
51 {
52 fillFromIterator( fi, feedback, callback );
53 }
54
55 explicit PointXYKDBush( const QgsFeatureSource &source, QgsFeedback *feedback )
56 {
57 points.reserve( source.featureCount() );
58 QgsFeatureIterator it = source.getFeatures( QgsFeatureRequest().setNoAttributes() );
59 fillFromIterator( it, feedback, nullptr );
60 }
61
62 PointXYKDBush() {}
63
64 void fillFromIterator( QgsFeatureIterator &fi, QgsFeedback *feedback = nullptr, const std::function< bool( const QgsFeature & ) > *callback = nullptr )
65 {
66 std::size_t size = 0;
67
68 QgsFeature f;
69 while ( fi.nextFeature( f ) )
70 {
71 if ( feedback && feedback->isCanceled() )
72 return;
73
74 if ( callback && !( *callback )( f ) )
75 return;
76
77 if ( !f.hasGeometry() )
78 continue;
79
81 {
82 const QgsPoint *point = qgsgeometry_cast< const QgsPoint * >( f.geometry().constGet() );
83 points.emplace_back( QgsSpatialIndexKDBushData( f.id(), point->x(), point->y() ) );
84 }
85 else
86 {
87 // not a point
88 continue;
89 }
90
91 size++;
92 }
93
94 if ( size == 0 )
95 return;
96
97 sortKD( 0, size - 1, 0 );
98 finalized = true;
99 }
100
101 bool addFeature( QgsFeatureId id, const QgsPointXY point )
102 {
103 if ( finalized )
104 return false;
105 points.emplace_back( QgsSpatialIndexKDBushData( id, point.x(), point.y() ) );
106 return true;
107 }
108
109 void finalize()
110 {
111 if ( !finalized && !points.empty() )
112 {
113 sortKD( 0, points.size() - 1, 0 );
114 finalized = true;
115 }
116 }
117
118 std::size_t size() const { return points.size(); }
119
120 bool finalized = false;
121};
122
123class QgsSpatialIndexKDBushPrivate
124{
125 public:
126 explicit QgsSpatialIndexKDBushPrivate( QgsFeatureIterator &fi, QgsFeedback *feedback = nullptr )
127 : index( std::make_unique< PointXYKDBush >( fi, feedback ) )
128 {}
129
130 explicit QgsSpatialIndexKDBushPrivate( const QgsFeatureSource &source, QgsFeedback *feedback = nullptr )
131 : index( std::make_unique< PointXYKDBush >( source, feedback ) )
132 {}
133
134 explicit QgsSpatialIndexKDBushPrivate( QgsFeatureIterator &fi, const std::function< bool( const QgsFeature & ) > &callback, QgsFeedback *feedback = nullptr )
135 : index( std::make_unique< PointXYKDBush >( fi, feedback, &callback ) )
136 {}
137
138 explicit QgsSpatialIndexKDBushPrivate()
139 : index( std::make_unique< PointXYKDBush >() )
140 {}
141
142 QAtomicInt ref = 1;
143 std::unique_ptr< PointXYKDBush > index;
144};
145
147
148#endif // QGSSPATIALINDEXKDBUSH_PRIVATE_H
@ Point
Point.
Definition qgis.h:296
bool nextFeature(QgsFeature &f)
Fetch next feature and stores in f, returns true on success.
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.
QgsFeatureId id
Definition qgsfeature.h:68
QgsGeometry geometry
Definition qgsfeature.h:71
bool hasGeometry() const
Returns true if the feature has an associated geometry.
bool isCanceled() const
Tells whether the operation has been canceled already.
Definition qgsfeedback.h:56
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.).
double y
Definition qgspointxy.h:66
double x
Definition qgspointxy.h:65
double x
Definition qgspoint.h:56
double y
Definition qgspoint.h:57
static Qgis::WkbType flatType(Qgis::WkbType type)
Returns the flat type for a WKB type.
T qgsgeometry_cast(QgsAbstractGeometry *geom)
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features