Branch data Line data Source code
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 : : 23 : : /// @cond PRIVATE 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" 35 : : #include "qgsspatialindexkdbushdata.h" 36 : : #include "qgsfeatureiterator.h" 37 : : #include "qgsfeedback.h" 38 : : #include "qgsfeaturesource.h" 39 : : #include <memory> 40 : : #include <QList> 41 : : #include "kdbush.hpp" 42 : : 43 : : 44 : 0 : class PointXYKDBush : public kdbush::KDBush< std::pair<double, double>, QgsSpatialIndexKDBushData, std::size_t > 45 : : { 46 : : public: 47 : : 48 : 0 : explicit PointXYKDBush( QgsFeatureIterator &fi, QgsFeedback *feedback = nullptr ) 49 : 0 : { 50 : 0 : fillFromIterator( fi, feedback ); 51 : 0 : } 52 : : 53 : 0 : explicit PointXYKDBush( const QgsFeatureSource &source, QgsFeedback *feedback ) 54 : 0 : { 55 : 0 : points.reserve( source.featureCount() ); 56 : 0 : QgsFeatureIterator it = source.getFeatures( QgsFeatureRequest().setNoAttributes() ); 57 : 0 : fillFromIterator( it, feedback ); 58 : 0 : } 59 : : 60 : 0 : void fillFromIterator( QgsFeatureIterator &fi, QgsFeedback *feedback = nullptr ) 61 : : { 62 : 0 : std::size_t size = 0; 63 : : 64 : 0 : QgsFeature f; 65 : 0 : while ( fi.nextFeature( f ) ) 66 : : { 67 : 0 : if ( feedback && feedback->isCanceled() ) 68 : 0 : return; 69 : : 70 : 0 : if ( !f.hasGeometry() ) 71 : 0 : continue; 72 : : 73 : 0 : if ( QgsWkbTypes::flatType( f.geometry().wkbType() ) == QgsWkbTypes::Point ) 74 : : { 75 : 0 : const QgsPoint *point = qgsgeometry_cast< const QgsPoint * >( f.geometry().constGet() ); 76 : 0 : points.emplace_back( QgsSpatialIndexKDBushData( f.id(), point->x(), point->y() ) ); 77 : 0 : } 78 : : else 79 : : { 80 : : // not a point 81 : 0 : continue; 82 : : } 83 : : 84 : 0 : size++; 85 : : } 86 : : 87 : 0 : if ( size == 0 ) 88 : 0 : return; 89 : : 90 : 0 : sortKD( 0, size - 1, 0 ); 91 : 0 : } 92 : : 93 : 0 : std::size_t size() const 94 : : { 95 : 0 : return points.size(); 96 : : } 97 : : 98 : : }; 99 : : 100 : 0 : class QgsSpatialIndexKDBushPrivate 101 : : { 102 : : public: 103 : : 104 : 0 : explicit QgsSpatialIndexKDBushPrivate( QgsFeatureIterator &fi, QgsFeedback *feedback = nullptr ) 105 : 0 : : index( std::make_unique < PointXYKDBush >( fi, feedback ) ) 106 : 0 : {} 107 : : 108 : 0 : explicit QgsSpatialIndexKDBushPrivate( const QgsFeatureSource &source, QgsFeedback *feedback = nullptr ) 109 : 0 : : index( std::make_unique < PointXYKDBush >( source, feedback ) ) 110 : 0 : {} 111 : : 112 : 0 : QAtomicInt ref = 1; 113 : : std::unique_ptr< PointXYKDBush > index; 114 : : }; 115 : : 116 : : /// @endcond 117 : : 118 : : #endif // QGSSPATIALINDEXKDBUSH_PRIVATE_H