56 mStorageManager.reset( SpatialIndex::StorageManager::createNewMemoryStorageManager() );
57 mRTree = createSpatialIndex( *mStorageManager );
70 const QMutexLocker locker( &mMutex );
72 const qint64
id = mNextId++;
73 mIdToData.insert(
id, data );
74 mDataToId.insert( data,
id );
77 mRTree->insertData( 0,
nullptr, r,
static_cast< qint64
>(
id ) );
80 catch ( Tools::Exception &e )
83 QgsDebugError( u
"Tools::Exception caught when inserting data to QgsGenericSpatialIndex: %1"_s.arg( e.what().c_str() ) );
85 catch (
const std::exception &e )
88 QgsDebugError( u
"std::exception caught when inserting data to QgsGenericSpatialIndex: %1"_s.arg( e.what() ) );
92 QgsDebugError( u
"unknown spatial index exception caught when inserting data to QgsGenericSpatialIndex"_s );
108 const QMutexLocker locker( &mMutex );
110 const qint64
id = mDataToId.value( data, 0 );
115 const bool res = mRTree->deleteData( r,
id );
116 mDataToId.remove( data );
117 mIdToData.remove(
id );
128 GenericIndexVisitor<T> visitor( callback, mIdToData );
131 const QMutexLocker locker( &mMutex );
134 mRTree->intersectsWithQuery( r, visitor );
136 catch ( Tools::Exception &e )
139 QgsDebugError( u
"Tools::Exception caught in QgsGenericSpatialIndex::intersects: %1"_s.arg( e.what().c_str() ) );
141 catch (
const std::exception &e )
144 QgsDebugError( u
"std::exception caught in QgsGenericSpatialIndex::intersects: %1"_s.arg( e.what() ) );
148 QgsDebugError( u
"unknown spatial index exception caught in QgsGenericSpatialIndex::intersects"_s );
159 const QMutexLocker locker( &mMutex );
160 return mIdToData.isEmpty();
165 std::unique_ptr< SpatialIndex::ISpatialIndex > createSpatialIndex( SpatialIndex::IStorageManager &storageManager )
168 constexpr double fillFactor = 0.7;
169 constexpr unsigned long indexCapacity = 10;
170 constexpr unsigned long leafCapacity = 10;
171 constexpr unsigned long dimension = 2;
172 constexpr SpatialIndex::RTree::RTreeVariant variant = SpatialIndex::RTree::RV_RSTAR;
175 SpatialIndex::id_type indexId;
176 return std::unique_ptr< SpatialIndex::ISpatialIndex >( SpatialIndex::RTree::createNewRTree( storageManager, fillFactor, indexCapacity,
177 leafCapacity, dimension, variant, indexId ) );
180 std::unique_ptr< SpatialIndex::IStorageManager > mStorageManager;
181 std::unique_ptr< SpatialIndex::ISpatialIndex > mRTree;
183 mutable QMutex mMutex;
186 QHash< qint64, T * > mIdToData;
187 QHash< T *, qint64 > mDataToId;
189 template <
typename TT>
190 class GenericIndexVisitor :
public SpatialIndex::IVisitor
193 explicit GenericIndexVisitor(
const std::function<
bool( TT *data )> &callback,
const QHash< qint64, TT * > &data )
194 : mCallback( callback )
198 void visitNode(
const SpatialIndex::INode &n )
override
201 void visitData(
const SpatialIndex::IData &d )
override
203 const qint64
id = d.getIdentifier();
204 T *data = mData.value(
id );
208 void visitData( std::vector<const SpatialIndex::IData *> &v )
override
212 const std::function< bool( TT *data )> &mCallback;
213 QHash< qint64, TT * > mData;