36  : mFeaturePool( pool )
 
   38  , mGeometry( feature.geometry() )
 
   39  , mMapCrs( useMapCrs )
 
   50      QgsDebugMsg( QStringLiteral( 
"Shrug. What shall we do with a geometry that cannot be converted?" ) );
 
   62  return mFeaturePool->layerPtr();
 
   67  return mFeaturePool->layerId();
 
   77  return QStringLiteral( 
"%1:%2" ).arg( mFeaturePool->layerName() ).arg( mFeature.id() );
 
   82  return layerId() == other.
layerId() && mFeature.id() == other.mFeature.
id();
 
   87  return layerId() != other.
layerId() || mFeature.id() != other.mFeature.
id();
 
   97  nextLayerFeature( 
true );
 
  101  : mLayerIt( rh.mLayerIt )
 
  102  , mFeatureIt( rh.mFeatureIt )
 
  103  , mParent( rh.mParent )
 
  104  , mCurrentFeature( std::make_unique<
LayerFeature>( *rh.mCurrentFeature.get() ) )
 
  125  Q_ASSERT( mCurrentFeature );
 
  126  return *mCurrentFeature;
 
  131  return mLayerIt != other.mLayerIt || mFeatureIt != other.mFeatureIt;
 
  136  nextLayerFeature( 
false );
 
  139bool QgsGeometryCheckerUtils::LayerFeatures::iterator::nextLayerFeature( 
bool begin )
 
  141  if ( !
begin && nextFeature( 
false ) )
 
  145  while ( nextLayer( 
begin ) )
 
  148    if ( nextFeature( 
true ) )
 
  154  mFeatureIt = QgsFeatureIds::const_iterator();
 
  155  mCurrentFeature.reset();
 
  159bool QgsGeometryCheckerUtils::LayerFeatures::iterator::nextLayer( 
bool begin )
 
  167    if ( mLayerIt == mParent->mLayerIds.end() )
 
  171    if ( mParent->mGeometryTypes.contains( mParent->mFeaturePools[*mLayerIt]->geometryType() ) )
 
  173      mFeatureIt = mParent->mFeatureIds[*mLayerIt].constBegin();
 
  181bool QgsGeometryCheckerUtils::LayerFeatures::iterator::nextFeature( 
bool begin )
 
  184  const QgsFeatureIds &featureIds = mParent->mFeatureIds[*mLayerIt];
 
  191    if ( mFeatureIt == featureIds.end() )
 
  195    if ( mParent->mFeedback )
 
  196      mParent->mFeedback->setProgress( mParent->mFeedback->progress() + 1.0 );
 
  200      mCurrentFeature = std::make_unique<LayerFeature>( featurePool, feature, mParent->mContext, mParent->mUseMapCrs );
 
  211    const QMap<QString, QgsFeatureIds> &featureIds,
 
  212    const QList<QgsWkbTypes::GeometryType> &geometryTypes,
 
  216  : mFeaturePools( featurePools )
 
  217  , mFeatureIds( featureIds )
 
  218  , mLayerIds( featurePools.keys() )
 
  219  , mGeometryTypes( geometryTypes )
 
  220  , mFeedback( feedback )
 
  221  , mContext( context )
 
  222  , mUseMapCrs( useMapCrs )
 
  226    const QList<QString> &layerIds, 
const QgsRectangle &extent,
 
  227    const QList<QgsWkbTypes::GeometryType> &geometryTypes,
 
  229  : mFeaturePools( featurePools )
 
  230  , mLayerIds( layerIds )
 
  232  , mGeometryTypes( geometryTypes )
 
  233  , mContext( context )
 
  236  for ( 
const QString &layerId : layerIds )
 
  239    if ( geometryTypes.contains( featurePool->
geometryType() ) )
 
  242      mFeatureIds.insert( layerId, featurePool->
getIntersects( ct.
transform( extent, Qgis::TransformDirection::Reverse ) ) );
 
  253  return iterator( mLayerIds.constBegin(), 
this );
 
  258  return iterator( mLayerIds.end(), 
this );
 
  265  return std::make_unique<QgsGeos>( geometry, tolerance );
 
  288  QList<const QgsLineString *> rings;
 
  291    rings.append( exterior );
 
  293  for ( 
int iInt = 0, nInt = polygon->
numInteriorRings(); iInt < nInt; ++iInt )
 
  297      rings.append( interior );
 
  305  if ( qgsgeometry_cast<QgsGeometryCollection *>( geom ) )
 
  308    for ( 
int nParts = geom->
partCount(), iPart = nParts - 1; iPart >= 0; --iPart )
 
  310      if ( !qgsgeometry_cast<QgsSurface *>( geomCollection->
geometryN( iPart ) ) )
 
  320  const double nom = std::fabs( ( p2.
y() - p1.
y() ) * q.
x() - ( p2.
x() - p1.
x() ) * q.
y() + p2.
x() * p1.
y() - p2.
y() * p1.
x() );
 
  321  const double dx = p2.
x() - p1.
x();
 
  322  const double dy = p2.
y() - p1.
y();
 
  323  return nom / std::sqrt( dx * dx + dy * dy );
 
  329  for ( 
int i = 0 + excludeExtremities; i < nVerts - 1 - excludeExtremities; ++i )
 
  344  QList<QgsPoint> intersections;
 
  346  bool intersection = 
false;
 
  347  for ( 
int i = 0, n = line1->
vertexCount() - 1; i < n; ++i )
 
  349    for ( 
int j = 0, m = line2->
vertexCount() - 1; j < m; ++j )
 
  357        intersections.append( inter );
 
  361  return intersections;
 
  369  for ( 
int iPart1 = 0, nParts1 = geom1->
partCount(); iPart1 < nParts1; ++iPart1 )
 
  371    for ( 
int iRing1 = 0, nRings1 = geom1->
ringCount( iPart1 ); iRing1 < nRings1; ++iRing1 )
 
  373      for ( 
int iVert1 = 0, jVert1 = 1, nVerts1 = geom1->
vertexCount( iPart1, iRing1 ); jVert1 < nVerts1; iVert1 = jVert1++ )
 
  377        const double lambdap1 = 0.;
 
  390        for ( 
int iPart2 = 0, nParts2 = geom2->
partCount(); iPart2 < nParts2; ++iPart2 )
 
  392          for ( 
int iRing2 = 0, nRings2 = geom2->
ringCount( iPart2 ); iRing2 < nRings2; ++iRing2 )
 
  394            for ( 
int iVert2 = 0, jVert2 = 1, nVerts2 = geom2->
vertexCount( iPart2, iRing2 ); jVert2 < nVerts2; iVert2 = jVert2++ )
 
  403                double lambdaq1 = 
QgsVector( q1.
x() - p1.
x(), q1.
y() - p1.
y() ) * d;
 
  404                double lambdaq2 = 
QgsVector( q2.
x() - p1.
x(), q2.
y() - p1.
y() ) * d;
 
  405                if ( lambdaq1 > lambdaq2 )
 
  407                  std::swap( lambdaq1, lambdaq2 );
 
  409                const double lambda1 = std::max( lambdaq1, lambdap1 );
 
  410                const double lambda2 = std::min( lambdaq2, lambdap2 );
 
  411                len += std::max( 0., lambda2 - lambda1 );
 
Abstract base class for all geometries.
 
virtual int ringCount(int part=0) const =0
Returns the number of rings of which this geometry is built.
 
virtual int vertexCount(int part=0, int ring=0) const =0
Returns the number of vertices of which this geometry is built.
 
virtual QgsPoint vertexAt(QgsVertexId id) const =0
Returns the point corresponding to a specified vertex id.
 
virtual int partCount() const =0
Returns count of parts contained in the geometry.
 
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
 
Custom exception class for Coordinate Reference System related exceptions.
 
const QgsCurve * interiorRing(int i) const SIP_HOLDGIL
Retrieves an interior ring from the curve polygon.
 
const QgsCurve * exteriorRing() const SIP_HOLDGIL
Returns the curve polygon's exterior ring.
 
int numInteriorRings() const SIP_HOLDGIL
Returns the number of interior rings contained with the curve polygon.
 
int vertexCount(int part=0, int ring=0) const override
Returns the number of vertices of which this geometry is built.
 
QgsPoint vertexAt(QgsVertexId id) const override
Returns the point corresponding to a specified vertex id.
 
Defines a QGIS exception class.
 
A feature pool is based on a vector layer and caches features.
 
QgsWkbTypes::GeometryType geometryType() const
The geometry type of this layer.
 
QgsCoordinateReferenceSystem crs() const
The coordinate reference system of this layer.
 
QgsFeatureIds getIntersects(const QgsRectangle &rect) const
Gets all feature ids in the bounding box rect.
 
bool getFeature(QgsFeatureId id, QgsFeature &feature)
Retrieves the feature with the specified id into feature.
 
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
 
Base class for feedback objects to be used for cancellation of something running in a worker thread.
 
Base configuration for geometry checks.
 
const QgsCoordinateTransformContext transformContext
The coordinate transform context with which transformations will be done.
 
const QgsCoordinateReferenceSystem mapCrs
The coordinate system in which calculations should be done.
 
A layer feature combination to uniquely identify and access a feature in a set of layers.
 
LayerFeature(const QgsFeaturePool *pool, const QgsFeature &feature, const QgsGeometryCheckContext *context, bool useMapCrs)
Create a new layer/feature combination.
 
QString layerId() const
The layer id.
 
QgsGeometry geometry() const
Returns the geometry of this feature.
 
QString id() const
Returns a combination of the layerId and the feature id.
 
bool operator==(const QgsGeometryCheckerUtils::LayerFeature &other) const
 
QgsFeature feature() const
Returns the feature.
 
QPointer< QgsVectorLayer > layer() const
The layer.
 
bool operator!=(const QgsGeometryCheckerUtils::LayerFeature &other) const
 
bool useMapCrs() const
Returns if the geometry is reprojected to the map CRS or not.
 
An iterator over all features in a QgsGeometryCheckerUtils::LayerFeatures.
 
const iterator & operator++()
Increments the item the iterator currently points to by one and returns the new iterator.
 
const QgsGeometryCheckerUtils::LayerFeature & operator*() const
Dereferences the item at the current iterator location.
 
iterator(const QStringList::const_iterator &layerIt, const LayerFeatures *parent)
Creates a new iterator.
 
bool operator!=(const iterator &other) const
 
Contains a set of layers and feature ids in those layers to pass to a geometry check.
 
LayerFeatures(const QMap< QString, QgsFeaturePool * > &featurePools, const QMap< QString, QgsFeatureIds > &featureIds, const QList< QgsWkbTypes::GeometryType > &geometryTypes, QgsFeedback *feedback, const QgsGeometryCheckContext *context, bool useMapCrs=false)
Creates a new set of layer and features.
 
iterator end() const
One after the last feature to stop iterating.
 
iterator begin() const
The first feature to start iterating.
 
static void filter1DTypes(QgsAbstractGeometry *geom)
 
static std::unique_ptr< QgsGeometryEngine > createGeomEngine(const QgsAbstractGeometry *geometry, double tolerance)
 
static QList< const QgsLineString * > polygonRings(const QgsPolygon *polygon)
 
static QgsAbstractGeometry * getGeomPart(QgsAbstractGeometry *geom, int partIdx)
 
static double sharedEdgeLength(const QgsAbstractGeometry *geom1, const QgsAbstractGeometry *geom2, double tol)
 
static QList< QgsPoint > lineIntersections(const QgsLineString *line1, const QgsLineString *line2, double tol)
 
static bool pointOnLine(const QgsPoint &p, const QgsLineString *line, double tol, bool excludeExtremities=false)
 
virtual bool removeGeometry(int nr)
Removes a geometry from the collection.
 
const QgsAbstractGeometry * geometryN(int n) const
Returns a const reference to a geometry from within the collection.
 
static double sqrDistance2D(const QgsPoint &pt1, const QgsPoint &pt2) SIP_HOLDGIL
Returns the squared 2D distance between two points.
 
static bool segmentIntersection(const QgsPoint &p1, const QgsPoint &p2, const QgsPoint &q1, const QgsPoint &q2, QgsPoint &intersectionPoint, bool &isIntersection, double tolerance=1e-8, bool acceptImproperIntersection=false) SIP_HOLDGIL
Compute the intersection between two segments.
 
A geometry is the spatial representation of a feature.
 
Qgis::GeometryOperationResult transform(const QgsCoordinateTransform &ct, Qgis::TransformDirection direction=Qgis::TransformDirection::Forward, bool transformZ=false) SIP_THROW(QgsCsException)
Transforms this geometry as described by the coordinate transform ct.
 
Line string geometry type, with support for z-dimension and m-values.
 
Point geometry type, with support for z-dimension and m-values.
 
A rectangle specified with double values.
 
A class to represent a vector.
 
QgsVector normalized() const SIP_THROW(QgsException)
Returns the vector's normalized (or "unit") vector (ie same angle but length of 1....
 
QSet< QgsFeatureId > QgsFeatureIds
 
double pointLineDist(const QgsPoint &p1, const QgsPoint &p2, const QgsPoint &q)
 
Utility class for identifying a unique vertex within a geometry.