54 mStorageManager.reset( SpatialIndex::StorageManager::createNewMemoryStorageManager() );
55 mRTree = createSpatialIndex( *mStorageManager );
68 const QMutexLocker locker( &mMutex );
70 const qint64
id = mNextId++;
71 mIdToData.insert(
id, data );
72 mDataToId.insert( data,
id );
75 mRTree->insertData( 0,
nullptr, r,
static_cast< qint64
>(
id ) );
78 catch ( Tools::Exception &e )
81 QgsDebugError( QStringLiteral(
"Tools::Exception caught when inserting data to QgsGenericSpatialIndex: %1" ).arg( e.what().c_str() ) );
83 catch (
const std::exception &e )
86 QgsDebugError( QStringLiteral(
"std::exception caught when inserting data to QgsGenericSpatialIndex: %1" ).arg( e.what() ) );
90 QgsDebugError( QStringLiteral(
"unknown spatial index exception caught when inserting data to QgsGenericSpatialIndex" ) );
106 const QMutexLocker locker( &mMutex );
108 const qint64
id = mDataToId.value( data, 0 );
113 const bool res = mRTree->deleteData( r,
id );
114 mDataToId.remove( data );
115 mIdToData.remove(
id );
126 GenericIndexVisitor<T> visitor( callback, mIdToData );
129 const QMutexLocker locker( &mMutex );
132 mRTree->intersectsWithQuery( r, visitor );
134 catch ( Tools::Exception &e )
137 QgsDebugError( QStringLiteral(
"Tools::Exception caught in QgsGenericSpatialIndex::intersects: %1" ).arg( e.what().c_str() ) );
139 catch (
const std::exception &e )
142 QgsDebugError( QStringLiteral(
"std::exception caught in QgsGenericSpatialIndex::intersects: %1" ).arg( e.what() ) );
146 QgsDebugError( QStringLiteral(
"unknown spatial index exception caught in QgsGenericSpatialIndex::intersects" ) );
157 const QMutexLocker locker( &mMutex );
158 return mIdToData.isEmpty();
163 std::unique_ptr< SpatialIndex::ISpatialIndex > createSpatialIndex( SpatialIndex::IStorageManager &storageManager )
166 constexpr double fillFactor = 0.7;
167 constexpr unsigned long indexCapacity = 10;
168 constexpr unsigned long leafCapacity = 10;
169 constexpr unsigned long dimension = 2;
170 constexpr SpatialIndex::RTree::RTreeVariant variant = SpatialIndex::RTree::RV_RSTAR;
173 SpatialIndex::id_type indexId;
174 return std::unique_ptr< SpatialIndex::ISpatialIndex >( SpatialIndex::RTree::createNewRTree( storageManager, fillFactor, indexCapacity,
175 leafCapacity, dimension, variant, indexId ) );
178 std::unique_ptr< SpatialIndex::IStorageManager > mStorageManager;
179 std::unique_ptr< SpatialIndex::ISpatialIndex > mRTree;
181 mutable QMutex mMutex;
184 QHash< qint64, T * > mIdToData;
185 QHash< T *, qint64 > mDataToId;
187 template <
typename TT>
188 class GenericIndexVisitor :
public SpatialIndex::IVisitor
191 explicit GenericIndexVisitor(
const std::function<
bool( TT *data )> &callback,
const QHash< qint64, TT * > &data )
192 : mCallback( callback )
196 void visitNode(
const SpatialIndex::INode &n )
override
199 void visitData(
const SpatialIndex::IData &d )
override
201 const qint64
id = d.getIdentifier();
202 T *data = mData.value(
id );
206 void visitData( std::vector<const SpatialIndex::IData *> &v )
override
210 const std::function< bool( TT *data )> &mCallback;
211 QHash< qint64, TT * > mData;