57 mStorageManager.reset( SpatialIndex::StorageManager::createNewMemoryStorageManager() );
58 mRTree = createSpatialIndex( *mStorageManager );
71 const QMutexLocker locker( &mMutex );
73 const qint64
id = mNextId++;
74 mIdToData.insert(
id, data );
75 mDataToId.insert( data,
id );
78 mRTree->insertData( 0,
nullptr, r,
static_cast< qint64
>(
id ) );
81 catch ( Tools::Exception &e )
84 QgsDebugError( u
"Tools::Exception caught when inserting data to QgsGenericSpatialIndex: %1"_s.arg( e.what().c_str() ) );
86 catch (
const std::exception &e )
89 QgsDebugError( u
"std::exception caught when inserting data to QgsGenericSpatialIndex: %1"_s.arg( e.what() ) );
93 QgsDebugError( u
"unknown spatial index exception caught when inserting data to QgsGenericSpatialIndex"_s );
109 const QMutexLocker locker( &mMutex );
111 const qint64
id = mDataToId.value( data, 0 );
116 const bool res = mRTree->deleteData( r,
id );
117 mDataToId.remove( data );
118 mIdToData.remove(
id );
129 GenericIndexVisitor<T> visitor( callback, mIdToData );
132 const QMutexLocker locker( &mMutex );
135 mRTree->intersectsWithQuery( r, visitor );
137 catch ( Tools::Exception &e )
140 QgsDebugError( u
"Tools::Exception caught in QgsGenericSpatialIndex::intersects: %1"_s.arg( e.what().c_str() ) );
142 catch (
const std::exception &e )
145 QgsDebugError( u
"std::exception caught in QgsGenericSpatialIndex::intersects: %1"_s.arg( e.what() ) );
149 QgsDebugError( u
"unknown spatial index exception caught in QgsGenericSpatialIndex::intersects"_s );
160 const QMutexLocker locker( &mMutex );
161 return mIdToData.isEmpty();
166 std::unique_ptr< SpatialIndex::ISpatialIndex > createSpatialIndex( SpatialIndex::IStorageManager &storageManager )
169 constexpr double fillFactor = 0.7;
170 constexpr unsigned long indexCapacity = 10;
171 constexpr unsigned long leafCapacity = 10;
172 constexpr unsigned long dimension = 2;
173 constexpr SpatialIndex::RTree::RTreeVariant variant = SpatialIndex::RTree::RV_RSTAR;
176 SpatialIndex::id_type indexId;
177 return std::unique_ptr< SpatialIndex::ISpatialIndex >( SpatialIndex::RTree::createNewRTree( storageManager, fillFactor, indexCapacity,
178 leafCapacity, dimension, variant, indexId ) );
181 std::unique_ptr< SpatialIndex::IStorageManager > mStorageManager;
182 std::unique_ptr< SpatialIndex::ISpatialIndex > mRTree;
184 mutable QMutex mMutex;
187 QHash< qint64, T * > mIdToData;
188 QHash< T *, qint64 > mDataToId;
190 template <
typename TT>
191 class GenericIndexVisitor :
public SpatialIndex::IVisitor
194 explicit GenericIndexVisitor(
const std::function<
bool( TT *data )> &callback,
const QHash< qint64, TT * > &data )
195 : mCallback( callback )
199 void visitNode(
const SpatialIndex::INode &n )
override
202 void visitData(
const SpatialIndex::IData &d )
override
204 const qint64
id = d.getIdentifier();
205 T *data = mData.value(
id );
209 void visitData( std::vector<const SpatialIndex::IData *> &v )
override
213 const std::function< bool( TT *data )> &mCallback;
214 QHash< qint64, TT * > mData;