16 #ifndef QGSPOINTLOCATOR_H
17 #define QGSPOINTLOCATOR_H
25 #include "qgis_core.h"
85 class IStorageManager;
162 MiddleOfSegment = 1 << 4,
163 LineEndpoint = 1 << 5,
164 All = Vertex | Edge | Area | Centroid | MiddleOfSegment
167 Q_DECLARE_FLAGS( Types, Type )
182 bool init(
int maxFeaturesToIndex = -1,
bool relaxed =
false );
185 bool hasIndex()
const;
198 , mVertexIndex( vertexIndex )
202 mEdgePoints[0] = edgePoints[0];
203 mEdgePoints[1] = edgePoints[1];
209 bool isValid()
const {
return mType != Invalid; }
213 bool hasEdge()
const {
return mType == Edge; }
217 bool hasArea()
const {
return mType == Area; }
257 pt1 = mEdgePoints[0];
258 pt2 = mEdgePoints[1];
274 const QgsGeometry geom = mLayer->getGeometry( mFid );
280 snappedPoint = transform.
transform( snappedPoint );
284 QgsDebugMsg( QStringLiteral(
"transformation to layer coordinate failed" ) );
299 point.
transform( transform, Qgis::TransformDirection::Reverse );
303 QgsDebugMsg( QStringLiteral(
"transformation to destination coordinate failed" ) );
314 return mType == other.
mType &&
315 mDist == other.
mDist &&
318 mFid == other.
mFid &&
331 int mVertexIndex = 0;
340 typedef QList<QgsPointLocator::Match>
MatchList;
461 void waitForIndexingFinished();
473 bool rebuildIndex(
int maxFeaturesToIndex = -1 );
478 void onInitTaskFinished();
482 void onAttributeValueChanged(
QgsFeatureId fid,
int idx,
const QVariant &value );
490 bool prepare(
bool relaxed );
493 std::unique_ptr< SpatialIndex::IStorageManager > mStorage;
495 QHash<QgsFeatureId, QgsGeometry *> mGeoms;
496 std::unique_ptr< SpatialIndex::ISpatialIndex > mRTree;
499 bool mIsEmptyLayer =
false;
505 std::unique_ptr< QgsRectangle > mExtent;
507 std::unique_ptr<QgsRenderContext> mContext;
508 std::unique_ptr<QgsFeatureRenderer> mRenderer;
509 std::unique_ptr<QgsVectorLayerFeatureSource> mSource;
510 int mMaxFeaturesToIndex = -1;
511 bool mIsIndexing =
false;
512 bool mIsDestroying =
false;
515 QPointer<QgsPointLocatorInitTask> mInitTask;
524 friend class QgsPointLocatorInitTask;
525 friend class TestQgsPointLocator;
This class represents a coordinate reference system (CRS).
Contains information about the context in which a coordinate transform is executed.
Custom exception class for Coordinate Reference System related exceptions.
static QgsPoint closestPoint(const QgsAbstractGeometry &geometry, const QgsPoint &point)
Returns the nearest point on a segment of a geometry for the specified point.
A geometry is the spatial representation of a feature.
QgsPoint vertexAt(int atVertex) const
Returns coordinates of a vertex.
bool isEmpty() const
Returns true if the geometry is empty (eg a linestring with no vertices, or a collection with no geom...
Line string geometry type, with support for z-dimension and m-values.
Helper class used when traversing the index with areas - builds a list of matches.
Helper class used when traversing the index looking for centroid - builds a list of matches.
Helper class used when traversing the index looking for edges - builds a list of matches.
Helper class used when traversing the index looking for middle segment - builds a list of matches.
Helper class used when traversing the index looking for centroid - builds a list of matches.
Helper class used when traversing the index looking for edges - builds a list of matches.
Helper class used when traversing the index looking for line endpoints (start or end vertex) - builds...
Helper class used when traversing the index looking for middle segment - builds a list of matches.
Helper class used when traversing the index looking for vertices - builds a list of matches.
Helper class used when traversing the index looking for vertices - builds a list of matches.
The class defines interface for querying point location:
const QgsRectangle * extent() const
Gets extent of the area point locator covers - if nullptr then it caches the whole layer.
int cachedGeometryCount() const
Returns how many geometries are cached in the index.
class QList< QgsPointLocator::Match > MatchList
QgsVectorLayer * layer() const
Gets associated layer.
bool isIndexing() const
Returns true if the point locator is currently indexing the data.
void initFinished(bool ok)
Emitted whenever index has been built and initialization is finished.
Type
The type of a snap result or the filter type for a snap request.
A class to represent a 2D point.
Point geometry type, with support for z-dimension and m-values.
void transform(const QgsCoordinateTransform &ct, Qgis::TransformDirection d=Qgis::TransformDirection::Forward, bool transformZ=false) override SIP_THROW(QgsCsException)
Transforms the geometry using a coordinate transform.
A rectangle specified with double values.
Contains information about the context of a rendering operation.
Partial snapshot of vector layer's state (only the members necessary for access to features)
Represents a vector layer which manages a vector based data sets.
QSet< QgsFeatureId > QgsFeatureIds
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
Interface that allows rejection of some matches in intersection queries (e.g.
virtual bool acceptMatch(const QgsPointLocator::Match &match)=0
virtual ~MatchFilter()=default
QgsVectorLayer * layer() const
The vector layer where the snap occurred.
QgsFeatureId featureId() const
The id of the feature to which the snapped geometry belongs.
bool hasCentroid() const
Returns true if the Match is a centroid.
QgsPoint interpolatedPoint(const QgsCoordinateReferenceSystem &destinationCrs=QgsCoordinateReferenceSystem()) const
Convenient method to return a point on an edge with linear interpolation of the Z value.
double distance() const
for vertex / edge match units depending on what class returns it (geom.cache: layer units,...
QgsPointXY mMiddleOfSegment
QgsPointXY point() const
for vertex / edge match coords depending on what class returns it (geom.cache: layer coords,...
bool hasEdge() const
Returns true if the Match is an edge.
void edgePoints(QgsPointXY &pt1, QgsPointXY &pt2) const
Only for a valid edge match - obtain endpoints of the edge.
bool hasArea() const
Returns true if the Match is an area.
Match()=default
construct invalid match
Match(QgsPointLocator::Type t, QgsVectorLayer *vl, QgsFeatureId fid, double dist, const QgsPointXY &pt, int vertexIndex=0, QgsPointXY *edgePoints=nullptr)
QgsPointLocator::Type type() const
QgsPointXY mEdgePoints[2]
bool hasLineEndpoint() const
Returns true if the Match is a line endpoint (start or end vertex).
bool hasMiddleSegment() const
Returns true if the Match is the middle of a segment.
int vertexIndex() const
for vertex / edge match (first vertex of the edge)
bool hasVertex() const
Returns true if the Match is a vertex.
bool operator==(const QgsPointLocator::Match &other) const