17#include "moc_qgspointlocator.cpp" 
   34#include <spatialindex/SpatialIndex.h> 
   36#include <QLinkedListIterator> 
   37#include <QtConcurrent> 
   43static SpatialIndex::Point point2point( 
const QgsPointXY &point )
 
   45  double plow[2] = { point.
x(), point.
y() };
 
   46  return Point( plow, 2 );
 
   54static const double POINT_LOC_EPSILON = 1e-12;
 
   68      : mDataList( dataList )
 
 
   72    IData *
getNext()
 override { 
return mIt.next(); }
 
   73    bool hasNext()
 override { 
return mIt.hasNext(); }
 
   75    uint32_t 
size()
 override { Q_ASSERT( 
false && 
"not available" ); 
return 0; }
 
   76    void rewind()
 override { Q_ASSERT( 
false && 
"not available" ); }
 
   79    QLinkedList<RTree::Data *> mDataList;
 
   80    QLinkedListIterator<RTree::Data *> mIt;
 
 
   98      , mSrcPoint( srcPoint )
 
 
  102    void visitNode( 
const INode &n )
 override { Q_UNUSED( n ) }
 
  103    void visitData( std::vector<const IData *> &v )
 override { Q_UNUSED( v ) }
 
  111      int vertexIndex, beforeVertex, afterVertex;
 
 
 
  155      , mSrcPoint( srcPoint )
 
 
  159    void visitNode( 
const INode &n )
 override { Q_UNUSED( n ) }
 
  160    void visitData( std::vector<const IData *> &v )
 override { Q_UNUSED( v ) }
 
 
  209      , mSrcPoint( srcPoint )
 
 
  213    void visitNode( 
const INode &n )
 override { Q_UNUSED( n ) }
 
  214    void visitData( std::vector<const IData *> &v )
 override { Q_UNUSED( v ) }
 
  230      edgePoints[0] = geom->
vertexAt( afterVertex - 1 );
 
  231      edgePoints[1] = geom->
vertexAt( afterVertex );
 
  232      pt = 
QgsPointXY( ( edgePoints[0].x() + edgePoints[1].x() ) / 2.0, ( edgePoints[0].y() + edgePoints[1].y() ) / 2.0 );
 
 
 
  270      , mSrcPoint( srcPoint )
 
 
  274    void visitNode( 
const INode &n )
 override { Q_UNUSED( n ) }
 
  275    void visitData( std::vector<const IData *> &v )
 override { Q_UNUSED( v ) }
 
  280      const QgsGeometry *geom = mLocator->mGeoms.value( 
id );
 
  285      int bestVertexNumber = -1;
 
  286      auto replaceIfBetter = [
this, &bestPoint, &bestVertexNumber]( 
const QgsPoint & candidate, 
int vertexNumber )
 
  288        if ( bestPoint.
isEmpty() || candidate.distanceSquared( mSrcPoint.
x(), mSrcPoint.
y() ) < bestPoint.
sqrDist( mSrcPoint ) )
 
  291          bestVertexNumber = vertexNumber;
 
  304          int partStartVertexNum = 0;
 
  307            if ( 
const QgsCurve *curve = qgsgeometry_cast< const QgsCurve * >( *partIt ) )
 
  309              replaceIfBetter( curve->startPoint(), partStartVertexNum );
 
  310              replaceIfBetter( curve->endPoint(), partStartVertexNum + curve->numPoints() - 1 );
 
  311              partStartVertexNum += curve->numPoints();
 
  319          int partStartVertexNum = 0;
 
  322            if ( 
const QgsCurvePolygon *polygon = qgsgeometry_cast< const QgsCurvePolygon * >( *partIt ) )
 
  324              if ( polygon->exteriorRing() )
 
  326                replaceIfBetter( polygon->exteriorRing()->startPoint(), partStartVertexNum );
 
  327                partStartVertexNum += polygon->exteriorRing()->numPoints();
 
  329              for ( 
int i = 0; i < polygon->numInteriorRings(); ++i )
 
  331                const QgsCurve *ring = polygon->interiorRing( i );
 
  332                replaceIfBetter( ring->
startPoint(), partStartVertexNum );
 
 
 
  372      , mSrcPoint( srcPoint )
 
 
  376    void visitNode( 
const INode &n )
 override { Q_UNUSED( n ) }
 
  377    void visitData( std::vector<const IData *> &v )
 override { Q_UNUSED( v ) }
 
  393      edgePoints[0] = geom->
vertexAt( afterVertex - 1 );
 
  394      edgePoints[1] = geom->
vertexAt( afterVertex );
 
 
 
  430    void visitNode( 
const INode &n )
 override { Q_UNUSED( n ) }
 
  431    void visitData( std::vector<const IData *> &v )
 override { Q_UNUSED( v ) }
 
 
  497      if ( !( outcode0 | outcode1 ) )
 
  503      else if ( outcode0 & outcode1 )
 
  515        const OutCode outcodeOut = outcode0 ? outcode0 : outcode1;
 
  519        if ( outcodeOut & 
TOP )
 
  522          x = x0 + ( x1 - x0 ) * ( 
mRect.
yMaximum() - y0 ) / ( y1 - y0 );
 
  525        else if ( outcodeOut & 
BOTTOM )
 
  528          x = x0 + ( x1 - x0 ) * ( 
mRect.
yMinimum() - y0 ) / ( y1 - y0 );
 
  531        else if ( outcodeOut & 
RIGHT )
 
  534          y = y0 + ( y1 - y0 ) * ( 
mRect.
xMaximum() - x0 ) / ( x1 - x0 );
 
  537        else if ( outcodeOut & 
LEFT )
 
  540          y = y0 + ( y1 - y0 ) * ( 
mRect.
xMinimum() - x0 ) / ( x1 - x0 );
 
  548        if ( outcodeOut == outcode0 )
 
 
 
  593    const QgsCurve *curve = qgsgeometry_cast<const QgsCurve *>( *part );
 
  601    while ( it != ( *part )->vertices_end() )
 
  604      if ( cs.isSegmentInRect( prevPoint.x(), prevPoint.y(), thisPoint.x(), thisPoint.y() ) )
 
  607        edgePoints[0] = prevPoint;
 
  608        edgePoints[1] = thisPoint;
 
  631      , mSrcRect( srcRect )
 
 
  635    void visitNode( 
const INode &n )
 override { Q_UNUSED( n ) }
 
  636    void visitData( std::vector<const IData *> &v )
 override { Q_UNUSED( v ) }
 
  645      const auto segmentsInRect {_geometrySegmentsInRect( geom, mSrcRect, mLocator->mLayer, 
id )};
 
 
 
  678      , mSrcRect( srcRect )
 
 
  682    void visitNode( 
const INode &n )
 override { Q_UNUSED( n ) }
 
  683    void visitData( std::vector<const IData *> &v )
 override { Q_UNUSED( v ) }
 
  688      const QgsGeometry *geom = mLocator->mGeoms.value( 
id );
 
 
 
  727      , mSrcRect( srcRect )
 
 
  731    void visitNode( 
const INode &n )
 override { Q_UNUSED( n ); }
 
  732    void visitData( std::vector<const IData *> &v )
 override { Q_UNUSED( v ); }
 
  737      const QgsGeometry *geom = mLocator->mGeoms.value( 
id );
 
  742      if ( mSrcRect.
contains( centroid ) )
 
 
 
  772      , mSrcRect( srcRect )
 
 
  776    void visitNode( 
const INode &n )
 override { Q_UNUSED( n ); }
 
  777    void visitData( std::vector<const IData *> &v )
 override { Q_UNUSED( v ); }
 
  782      const QgsGeometry *geom = mLocator->mGeoms.value( 
id );
 
  791        for ( ; it != geom->
vertices_end(); ++it, ++itPrevious )
 
  793          const QgsPointXY pt( ( ( *itPrevious ).x() + ( *it ).x() ) / 2.0, ( ( *itPrevious ).y() + ( *it ).y() ) / 2.0 );
 
 
 
  830    void getNextEntry( 
const IEntry &entry, id_type &nextEntry, 
bool &hasNext )
 override 
  832      const INode *n = 
dynamic_cast<const INode *
>( &entry );
 
  836      QgsDebugMsgLevel( QStringLiteral( 
"NODE: %1" ).arg( n->getIdentifier() ), 4 );
 
  837      if ( n->getLevel() > 0 )
 
  840        for ( uint32_t cChild = 0; cChild < n->getChildrenCount(); cChild++ )
 
  842          QgsDebugMsgLevel( QStringLiteral( 
"- CH: %1" ).arg( n->getChildIdentifier( cChild ) ), 4 );
 
  843          ids.push( n->getChildIdentifier( cChild ) );
 
  849        for ( uint32_t cChild = 0; cChild < n->getChildrenCount(); cChild++ )
 
  851          QgsDebugMsgLevel( QStringLiteral( 
"- L: %1" ).arg( n->getChildIdentifier( cChild ) ), 4 );
 
  857        nextEntry = ids.back();
 
 
 
  879  mStorage.reset( StorageManager::createNewMemoryStorageManager() );
 
 
  892  mIsDestroying = 
true;
 
 
  924  mContext.reset( 
nullptr );
 
  928    mContext = std::unique_ptr<QgsRenderContext>( 
new QgsRenderContext( *context ) );
 
 
  934void QgsPointLocator::onInitTaskFinished()
 
  936  Q_ASSERT_X( QThread::currentThread() == qApp->thread(), 
"QgsPointLocator::onInitTaskFinished", 
"was not called on main thread" );
 
  951  for ( 
const QgsFeatureId fid : std::as_const( mAddedFeatures ) )
 
  952    onFeatureAdded( fid );
 
  953  mAddedFeatures.clear();
 
  955  for ( 
const QgsFeatureId fid : std::as_const( mDeletedFeatures ) )
 
  956    onFeatureDeleted( fid );
 
  957  mDeletedFeatures.clear();
 
  987    connect( mInitTask, &QgsPointLocatorInitTask::taskTerminated, 
this, &QgsPointLocator::onInitTaskFinished );
 
  988    connect( mInitTask, &QgsPointLocatorInitTask::taskCompleted, 
this, &QgsPointLocator::onInitTaskFinished );
 
 
 1004  disconnect( mInitTask, &QgsPointLocatorInitTask::taskTerminated, 
this, &QgsPointLocator::onInitTaskFinished );
 
 1005  disconnect( mInitTask, &QgsPointLocatorInitTask::taskCompleted, 
this, &QgsPointLocator::onInitTaskFinished );
 
 1006  mInitTask->waitForFinished();
 
 1008  if ( !mIsDestroying )
 
 1009    onInitTaskFinished();
 
 
 1014  return mIsIndexing || mRTree || mIsEmptyLayer;
 
 
 1017bool QgsPointLocator::prepare( 
bool relaxed )
 
 1029    init( -1, relaxed );
 
 1030    if ( ( relaxed && mIsIndexing ) || !mRTree ) 
 
 1042  QgsDebugMsgLevel( QStringLiteral( 
"RebuildIndex start : %1" ).arg( mSource->id() ), 2 );
 
 1046  QLinkedList<RTree::Data *> dataList;
 
 1067        QgsDebugError( QStringLiteral( 
"could not transform bounding box to map, skipping the snap filter (%1)" ).arg( e.
what() ) );
 
 1073  bool filter = 
false;
 
 1077    ctx = mContext.get();
 
 1081      mRenderer->startRender( *ctx, mSource->fields() );
 
 1088  int indexedCount = 0;
 
 1095    if ( filter && ctx && mRenderer )
 
 1098      if ( !mRenderer->willRenderFeature( f, *ctx ) )
 
 1109        transformedGeometry.
transform( mTransform );
 
 1116        QgsDebugError( QStringLiteral( 
"could not transform geometry to map, skipping the snap for it (%1)" ).arg( e.
what() ) );
 
 1125      dataList << 
new RTree::Data( 0, 
nullptr, r, f.
id() );
 
 1127      auto it = mGeoms.find( f.
id() );
 
 1128      if ( it != mGeoms.end() )
 
 1140    if ( maxFeaturesToIndex != -1 && indexedCount > maxFeaturesToIndex )
 
 1142      qDeleteAll( dataList );
 
 1149  const double fillFactor = 0.7;
 
 1150  const unsigned long indexCapacity = 10;
 
 1151  const unsigned long leafCapacity = 10;
 
 1152  const unsigned long dimension = 2;
 
 1153  const RTree::RTreeVariant variant = RTree::RV_RSTAR;
 
 1154  SpatialIndex::id_type indexId;
 
 1156  if ( dataList.isEmpty() )
 
 1158    mIsEmptyLayer = 
true;
 
 1163  mRTree.reset( RTree::createAndBulkLoadNewRTree( RTree::BLM_STR, stream, *mStorage, fillFactor, indexCapacity,
 
 1164                leafCapacity, dimension, variant, indexId ) );
 
 1166  if ( ctx && mRenderer )
 
 1168    mRenderer->stopRender( *ctx );
 
 1171  QgsDebugMsgLevel( QStringLiteral( 
"RebuildIndex end : %1 ms (%2)" ).arg( t.elapsed() ).arg( mSource->id() ), 2 );
 
 
 1181  mIsEmptyLayer = 
false;
 
 1183  qDeleteAll( mGeoms );
 
 
 1188void QgsPointLocator::onFeatureAdded( 
QgsFeatureId fid )
 
 1193    mAddedFeatures << fid;
 
 1199    if ( mIsEmptyLayer )
 
 1202      mIsEmptyLayer = 
false;
 
 1216      std::unique_ptr< QgsFeatureRenderer > renderer( mLayer->
renderer() ? mLayer->
renderer()->
clone() : nullptr );
 
 1220      ctx = mContext.get();
 
 1221      if ( renderer && ctx )
 
 1224        renderer->startRender( *ctx, mLayer->
fields() );
 
 1227        if ( !renderer->willRenderFeature( f, *ctx ) )
 
 1232        renderer->stopRender( *ctx );
 
 1243        transformedGeom.
transform( mTransform );
 
 1250        QgsDebugError( QStringLiteral( 
"could not transform geometry to map, skipping the snap for it (%1)" ).arg( e.
what() ) );
 
 1259      mRTree->insertData( 0, 
nullptr, r, f.
id() );
 
 1261      auto it = mGeoms.find( f.
id() );
 
 1262      if ( it != mGeoms.end() )
 
 1275void QgsPointLocator::onFeatureDeleted( 
QgsFeatureId fid )
 
 1279    if ( mAddedFeatures.contains( fid ) )
 
 1281      mAddedFeatures.remove( fid );
 
 1286      mDeletedFeatures << fid;
 
 1294  auto it = mGeoms.find( fid );
 
 1295  if ( it != mGeoms.end() )
 
 1307  onFeatureDeleted( fid );
 
 1308  onFeatureAdded( fid );
 
 1311void QgsPointLocator::onAttributeValueChanged( 
QgsFeatureId fid, 
int idx, 
const QVariant &value )
 
 1317    onFeatureDeleted( fid );
 
 1318    onFeatureAdded( fid );
 
 1325  if ( !prepare( relaxed ) )
 
 1330  const QgsRectangle rect( point.
x() - tolerance, point.
y() - tolerance, point.
x() + tolerance, point.
y() + tolerance );
 
 
 1339  if ( !prepare( relaxed ) )
 
 1345  const QgsRectangle rect( point.
x() - tolerance, point.
y() - tolerance, point.
x() + tolerance, point.
y() + tolerance );
 
 
 1354  if ( !prepare( relaxed ) )
 
 1360  const QgsRectangle rect( point.
x() - tolerance, point.
y() - tolerance, point.
x() + tolerance, point.
y() + tolerance );
 
 
 1369  if ( !prepare( relaxed ) )
 
 1375  const QgsRectangle rect( point.
x() - tolerance, point.
y() - tolerance, point.
x() + tolerance, point.
y() + tolerance );
 
 
 1384  if ( !prepare( relaxed ) )
 
 1393  const QgsRectangle rect( point.
x() - tolerance, point.
y() - tolerance, point.
x() + tolerance, point.
y() + tolerance );
 
 
 1402  if ( !prepare( relaxed ) )
 
 1406  if ( !mlist.isEmpty() && mlist.at( 0 ).isValid() )
 
 1408    return mlist.at( 0 );
 
 1411  if ( tolerance == 0 )
 
 
 1432  if ( !prepare( relaxed ) )
 
 
 1448  const QgsRectangle rect( point.
x() - tolerance, point.
y() - tolerance, point.
x() + tolerance, point.
y() + tolerance );
 
 
 1454  if ( !prepare( relaxed ) )
 
 
 1466  const QgsRectangle rect( point.
x() - tolerance, point.
y() - tolerance, point.
x() + tolerance, point.
y() + tolerance );
 
 
 1473  if ( !prepare( relaxed ) )
 
 1482  mRTree->intersectsWithQuery( point2point( point ), visitor );
 
 
GeometryType
The geometry types are used to group Qgis::WkbType in a coarse way.
 
@ Reverse
Reverse/inverse transform (from destination to source)
 
The part_iterator class provides an STL-style iterator for const references to geometry parts.
 
The vertex_iterator class provides an STL-style iterator for vertices.
 
QgsVertexId vertexId() const
Returns vertex ID of the current item.
 
virtual bool hasCurvedSegments() const
Returns true if the geometry contains curved segments.
 
static QgsTaskManager * taskManager()
Returns the application's task manager, used for managing application wide background task handling.
 
Represents a coordinate reference system (CRS).
 
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
 
Contains information about the context in which a coordinate transform is executed.
 
Curve polygon geometry type.
 
Abstract base class for curved geometry type.
 
virtual int numPoints() const =0
Returns the number of points in the curve.
 
virtual QgsPoint startPoint() const =0
Returns the starting point of the curve.
 
virtual bool isValid() const =0
Returns true if this is a valid layer.
 
Defines a QGIS exception class.
 
static QgsExpressionContextScope * layerScope(const QgsMapLayer *layer)
Creates a new scope which contains variables and functions relating to a QgsMapLayer.
 
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
 
Wrapper for iterator of features from vector data provider or vector layer.
 
bool nextFeature(QgsFeature &f)
Fetch next feature and stores in f, returns true on success.
 
@ Filter
Features may be filtered, i.e. some features may not be rendered (categorized, rule based ....
 
virtual QgsFeatureRenderer * clone() const =0
Create a deep copy of this renderer.
 
Wraps a request for features to a vector layer (or directly its vector data provider).
 
QgsFeatureRequest & setSubsetOfAttributes(const QgsAttributeList &attrs)
Set a subset of attributes that will be fetched.
 
QgsFeatureRequest & setNoAttributes()
Set that no attributes will be fetched.
 
QgsFeatureRequest & setFilterRect(const QgsRectangle &rectangle)
Sets the rectangle from which features will be taken.
 
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
 
bool hasGeometry() const
Returns true if the feature has an associated geometry.
 
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
 
A geometry is the spatial representation of a feature.
 
double closestSegmentWithContext(const QgsPointXY &point, QgsPointXY &minDistPoint, int &nextVertexIndex, int *leftOrRightOfSegment=nullptr, double epsilon=Qgis::DEFAULT_SEGMENT_EPSILON) const
Searches for the closest segment of geometry to the given point.
 
QgsAbstractGeometry::const_part_iterator const_parts_begin() const
Returns STL-style const iterator pointing to the first part of the geometry.
 
QgsGeometry convertToType(Qgis::GeometryType destType, bool destMultipart=false) const
Try to convert the geometry to the requested type.
 
Qgis::GeometryOperationResult transform(const QgsCoordinateTransform &ct, Qgis::TransformDirection direction=Qgis::TransformDirection::Forward, bool transformZ=false)
Transforms this geometry as described by the coordinate transform ct.
 
QgsPoint vertexAt(int atVertex) const
Returns coordinates of a vertex.
 
QgsPointXY closestVertex(const QgsPointXY &point, int &closestVertexIndex, int &previousVertexIndex, int &nextVertexIndex, double &sqrDist) const
Returns the vertex closest to the given point, the corresponding vertex index, squared distance snap ...
 
QgsPointXY asPoint() const
Returns the contents of the geometry as a 2-dimensional point.
 
void convertToStraightSegment(double tolerance=M_PI/180., QgsAbstractGeometry::SegmentationToleranceType toleranceType=QgsAbstractGeometry::MaximumAngle)
Converts the geometry to straight line segments, if it is a curved geometry type.
 
bool isMultipart() const
Returns true if WKB of the geometry is of WKBMulti* type.
 
QgsGeometry centroid() const
Returns the center of mass of a geometry.
 
bool isEmpty() const
Returns true if the geometry is empty (eg a linestring with no vertices, or a collection with no geom...
 
int vertexNrFromVertexId(QgsVertexId id) const
Returns the vertex number corresponding to a vertex id.
 
QgsAbstractGeometry::const_part_iterator const_parts_end() const
Returns STL-style iterator pointing to the imaginary part after the last part of the geometry.
 
QgsAbstractGeometry::vertex_iterator vertices_begin() const
Returns STL-style iterator pointing to the first vertex of the geometry.
 
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
 
Qgis::WkbType wkbType() const
Returns type of the geometry as a WKB type (point / linestring / polygon etc.)
 
bool intersects(const QgsRectangle &rectangle) const
Returns true if this geometry exactly intersects with a rectangle.
 
QgsAbstractGeometry::vertex_iterator vertices_end() const
Returns STL-style iterator pointing to the imaginary vertex after the last vertex of the geometry.
 
QgsCoordinateReferenceSystem crs
 
void styleChanged()
Signal emitted whenever a change affects the layer's style.
 
void dataChanged()
Data of layer changed.
 
Helper class to dump the R-index nodes and their content.
 
void getNextEntry(const IEntry &entry, id_type &nextEntry, bool &hasNext) override
 
Helper class for bulk loading of R-trees.
 
IData * getNext() override
 
QgsPointLocator_Stream(const QLinkedList< RTree::Data * > &dataList)
 
Helper class used when traversing the index with areas - builds a list of matches.
 
void visitNode(const INode &n) override
 
void visitData(const IData &d) override
 
void visitData(std::vector< const IData * > &v) override
 
QgsPointLocator_VisitorArea(QgsPointLocator *pl, const QgsPointXY &origPt, QgsPointLocator::MatchList &list, QgsPointLocator::MatchFilter *filter=nullptr)
constructor
 
Helper class used when traversing the index looking for centroid - builds a list of matches.
 
QgsPointLocator_VisitorCentroidsInRect(QgsPointLocator *pl, QgsPointLocator::MatchList &lst, const QgsRectangle &srcRect, QgsPointLocator::MatchFilter *filter=nullptr)
Constructs the visitor.
 
void visitData(const IData &d) override
 
void visitData(std::vector< const IData * > &v) override
 
void visitNode(const INode &n) override
 
Helper class used when traversing the index looking for edges - builds a list of matches.
 
void visitData(std::vector< const IData * > &v) override
 
QgsPointLocator_VisitorEdgesInRect(QgsPointLocator *pl, QgsPointLocator::MatchList &lst, const QgsRectangle &srcRect, QgsPointLocator::MatchFilter *filter=nullptr)
 
void visitNode(const INode &n) override
 
void visitData(const IData &d) override
 
Helper class used when traversing the index looking for middle segment - builds a list of matches.
 
void visitData(std::vector< const IData * > &v) override
 
void visitNode(const INode &n) override
 
void visitData(const IData &d) override
 
QgsPointLocator_VisitorMiddlesInRect(QgsPointLocator *pl, QgsPointLocator::MatchList &lst, const QgsRectangle &srcRect, QgsPointLocator::MatchFilter *filter=nullptr)
Constructs the visitor.
 
Helper class used when traversing the index looking for centroid - builds a list of matches.
 
void visitData(const IData &d) override
 
void visitNode(const INode &n) override
 
void visitData(std::vector< const IData * > &v) override
 
Helper class used when traversing the index looking for edges - builds a list of matches.
 
QgsPointLocator_VisitorNearestEdge(QgsPointLocator *pl, QgsPointLocator::Match &m, const QgsPointXY &srcPoint, QgsPointLocator::MatchFilter *filter=nullptr)
 
void visitData(const IData &d) override
 
void visitData(std::vector< const IData * > &v) override
 
void visitNode(const INode &n) override
 
Helper class used when traversing the index looking for line endpoints (start or end vertex) - builds...
 
void visitData(std::vector< const IData * > &v) override
 
void visitNode(const INode &n) override
 
void visitData(const IData &d) override
 
Helper class used when traversing the index looking for middle segment - builds a list of matches.
 
void visitData(std::vector< const IData * > &v) override
 
void visitData(const IData &d) override
 
void visitNode(const INode &n) override
 
Helper class used when traversing the index looking for vertices - builds a list of matches.
 
void visitData(const IData &d) override
 
void visitNode(const INode &n) override
 
void visitData(std::vector< const IData * > &v) override
 
QgsPointLocator_VisitorNearestVertex(QgsPointLocator *pl, QgsPointLocator::Match &m, const QgsPointXY &srcPoint, QgsPointLocator::MatchFilter *filter=nullptr)
 
Helper class used when traversing the index looking for vertices - builds a list of matches.
 
void visitData(const IData &d) override
 
void visitNode(const INode &n) override
 
void visitData(std::vector< const IData * > &v) override
 
QgsPointLocator_VisitorVerticesInRect(QgsPointLocator *pl, QgsPointLocator::MatchList &lst, const QgsRectangle &srcRect, QgsPointLocator::MatchFilter *filter=nullptr)
Constructs the visitor.
 
Defines the interface for querying point locations.
 
friend class QgsPointLocatorInitTask
 
Match nearestEdge(const QgsPointXY &point, double tolerance, QgsPointLocator::MatchFilter *filter=nullptr, bool relaxed=false)
Find nearest edge to the specified point - up to distance specified by tolerance Optional filter may ...
 
void setRenderContext(const QgsRenderContext *context)
Configure render context - if not nullptr, it will use to index only visible feature.
 
QgsCoordinateReferenceSystem destinationCrs() const
Gets destination CRS - may be an invalid QgsCoordinateReferenceSystem if not doing OTF reprojection.
 
MatchList pointInPolygon(const QgsPointXY &point, bool relaxed=false, QgsPointLocator::MatchFilter *filter=nullptr)
Find out if the point is in any polygons.
 
void setExtent(const QgsRectangle *extent)
Configure extent - if not nullptr, it will index only that area.
 
bool init(int maxFeaturesToIndex=-1, bool relaxed=false)
Prepare the index for queries.
 
QgsVectorLayer * layer() const
Gets associated layer.
 
MatchList verticesInRect(const QgsRectangle &rect, QgsPointLocator::MatchFilter *filter=nullptr, bool relaxed=false)
Find vertices within a specified rectangle This method is either blocking or non blocking according t...
 
class QList< QgsPointLocator::Match > MatchList
 
Match nearestVertex(const QgsPointXY &point, double tolerance, QgsPointLocator::MatchFilter *filter=nullptr, bool relaxed=false)
Find nearest vertex to the specified point - up to distance specified by tolerance Optional filter ma...
 
const QgsRectangle * extent() const
Gets extent of the area point locator covers - if nullptr then it caches the whole layer.
 
MatchList edgesInRect(const QgsRectangle &rect, QgsPointLocator::MatchFilter *filter=nullptr, bool relaxed=false)
Find edges within a specified rectangle Optional filter may discard unwanted matches.
 
bool hasIndex() const
Indicate whether the data have been already indexed.
 
Match nearestMiddleOfSegment(const QgsPointXY &point, double tolerance, QgsPointLocator::MatchFilter *filter=nullptr, bool relaxed=false)
Find nearest middle of segment to the specified point - up to distance specified by tolerance Optiona...
 
void waitForIndexingFinished()
If the point locator has been initialized relaxedly and is currently indexing, this methods waits for...
 
Match nearestCentroid(const QgsPointXY &point, double tolerance, QgsPointLocator::MatchFilter *filter=nullptr, bool relaxed=false)
Find nearest centroid to the specified point - up to distance specified by tolerance Optional filter ...
 
void initFinished(bool ok)
Emitted whenever index has been built and initialization is finished.
 
bool rebuildIndex(int maxFeaturesToIndex=-1)
 
Match nearestArea(const QgsPointXY &point, double tolerance, QgsPointLocator::MatchFilter *filter=nullptr, bool relaxed=false)
Find nearest area to the specified point - up to distance specified by tolerance Optional filter may ...
 
@ Area
Snapped to an area.
 
@ MiddleOfSegment
Snapped to the middle of a segment.
 
@ Vertex
Snapped to a vertex. Can be a vertex of the geometry or an intersection.
 
@ Centroid
Snapped to a centroid.
 
@ Edge
Snapped to an edge.
 
@ LineEndpoint
Start or end points of lines only.
 
QgsPointLocator(QgsVectorLayer *layer, const QgsCoordinateReferenceSystem &destinationCrs=QgsCoordinateReferenceSystem(), const QgsCoordinateTransformContext &transformContext=QgsCoordinateTransformContext(), const QgsRectangle *extent=nullptr)
Construct point locator for a layer.
 
~QgsPointLocator() override
 
Match nearestLineEndpoints(const QgsPointXY &point, double tolerance, QgsPointLocator::MatchFilter *filter=nullptr, bool relaxed=false)
Find nearest line endpoint (start or end vertex) to the specified point - up to distance specified by...
 
double sqrDist(double x, double y) const
Returns the squared distance between this point a specified x, y coordinate.
 
bool isEmpty() const
Returns true if the geometry is empty.
 
Point geometry type, with support for z-dimension and m-values.
 
A rectangle specified with double values.
 
bool contains(const QgsRectangle &rect) const
Returns true when rectangle contains other rectangle.
 
bool isFinite() const
Returns true if the rectangle has finite boundaries.
 
Contains information about the context of a rendering operation.
 
QgsExpressionContext & expressionContext()
Gets the expression context.
 
static SpatialIndex::Region rectangleToRegion(const QgsRectangle &rectangle)
Converts a QGIS rectangle to a SpatialIndex region.
 
long addTask(QgsTask *task, int priority=0)
Adds a task to the manager.
 
Partial snapshot of vector layer's state (only the members necessary for access to features).
 
Represents a vector layer which manages a vector based dataset.
 
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const FINAL
Queries the layer for features specified in request.
 
QgsFeatureRenderer * renderer()
Returns the feature renderer used for rendering the features in the layer in 2D map views.
 
QgsVectorDataProvider * dataProvider() FINAL
Returns the layer's data provider, it may be nullptr.
 
void attributeValueChanged(QgsFeatureId fid, int idx, const QVariant &value)
Emitted whenever an attribute value change is done in the edit buffer.
 
Q_INVOKABLE Qgis::GeometryType geometryType() const
Returns point, line or polygon.
 
void featureAdded(QgsFeatureId fid)
Emitted when a new feature has been added to the layer.
 
void featureDeleted(QgsFeatureId fid)
Emitted when a feature has been deleted.
 
void geometryChanged(QgsFeatureId fid, const QgsGeometry &geometry)
Emitted whenever a geometry change is done in the edit buffer.
 
static Qgis::GeometryType geometryType(Qgis::WkbType type)
Returns the geometry type for a WKB type, e.g., both MultiPolygon and CurvePolygon would have a Polyg...
 
QgsPointLocator_VisitorNearestCentroid(QgsPointLocator *pl, QgsPointLocator::Match &m, const QgsPointXY &srcPoint, QgsPointLocator::MatchFilter *filter=nullptr)
Helper class used when traversing the index looking for centroid - builds a list of matches.
 
QgsPointLocator_VisitorNearestMiddleOfSegment(QgsPointLocator *pl, QgsPointLocator::Match &m, const QgsPointXY &srcPoint, QgsPointLocator::MatchFilter *filter=nullptr)
Helper class used when traversing the index looking for middle segment - builds a list of matches.
 
QgsPointLocator_VisitorNearestLineEndpoint(QgsPointLocator *pl, QgsPointLocator::Match &m, const QgsPointXY &srcPoint, QgsPointLocator::MatchFilter *filter=nullptr)
Helper class used when traversing the index looking for line endpoints (start or end vertex) - builds...
 
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
 
#define QgsDebugMsgLevel(str, level)
 
#define QgsDebugError(str)
 
Interface that allows rejection of some matches in intersection queries (e.g.
 
virtual bool acceptMatch(const QgsPointLocator::Match &match)=0
 
QgsFeatureId featureId() const
The id of the feature to which the snapped geometry belongs.
 
QgsVectorLayer * layer() const
The vector layer where the snap occurred.
 
double distance() const
for vertex / edge match units depending on what class returns it (geom.cache: layer units,...
 
QgsPointXY point() const
for vertex / edge match coords depending on what class returns it (geom.cache: layer coords,...
 
OutCode computeOutCode(double x, double y)
 
bool isSegmentInRect(double x0, double y0, double x1, double y1)
 
_CohenSutherland(const QgsRectangle &rect)