55 mStorageManager.reset( SpatialIndex::StorageManager::createNewMemoryStorageManager() );
56 mRTree = createSpatialIndex( *mStorageManager );
69 const QMutexLocker locker( &mMutex );
71 const qint64
id = mNextId++;
72 mIdToData.insert(
id, data );
73 mDataToId.insert( data,
id );
76 mRTree->insertData( 0,
nullptr, r,
static_cast< qint64
>(
id ) );
79 catch ( Tools::Exception &e )
82 QgsDebugError( u
"Tools::Exception caught when inserting data to QgsGenericSpatialIndex: %1"_s.arg( e.what().c_str() ) );
84 catch (
const std::exception &e )
87 QgsDebugError( u
"std::exception caught when inserting data to QgsGenericSpatialIndex: %1"_s.arg( e.what() ) );
91 QgsDebugError( u
"unknown spatial index exception caught when inserting data to QgsGenericSpatialIndex"_s );
107 const QMutexLocker locker( &mMutex );
109 const qint64
id = mDataToId.value( data, 0 );
114 const bool res = mRTree->deleteData( r,
id );
115 mDataToId.remove( data );
116 mIdToData.remove(
id );
127 GenericIndexVisitor<T> visitor( callback, mIdToData );
130 const QMutexLocker locker( &mMutex );
133 mRTree->intersectsWithQuery( r, visitor );
135 catch ( Tools::Exception &e )
138 QgsDebugError( u
"Tools::Exception caught in QgsGenericSpatialIndex::intersects: %1"_s.arg( e.what().c_str() ) );
140 catch (
const std::exception &e )
143 QgsDebugError( u
"std::exception caught in QgsGenericSpatialIndex::intersects: %1"_s.arg( e.what() ) );
147 QgsDebugError( u
"unknown spatial index exception caught in QgsGenericSpatialIndex::intersects"_s );
158 const QMutexLocker locker( &mMutex );
159 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, leafCapacity, dimension, variant, indexId ) );
177 std::unique_ptr< SpatialIndex::IStorageManager > mStorageManager;
178 std::unique_ptr< SpatialIndex::ISpatialIndex > mRTree;
180 mutable QMutex mMutex;
183 QHash< qint64, T * > mIdToData;
184 QHash< T *, qint64 > mDataToId;
186 template<
typename TT>
class GenericIndexVisitor :
public SpatialIndex::IVisitor
189 explicit GenericIndexVisitor(
const std::function<
bool( TT *data )> &callback,
const QHash< qint64, TT * > &data )
190 : mCallback( callback )
194 void visitNode(
const SpatialIndex::INode &n )
override { Q_UNUSED( n ) }
196 void visitData(
const SpatialIndex::IData &d )
override
198 const qint64
id = d.getIdentifier();
199 T *data = mData.value(
id );
203 void visitData( std::vector<const SpatialIndex::IData *> &v )
override { Q_UNUSED( v ) }
206 const std::function< bool( TT *data )> &mCallback;
207 QHash< qint64, TT * > mData;