QGIS API Documentation  3.8.0-Zanzibar (11aff65)
qgsgeometrypointinpolygoncheck.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsgeometrypointinpolygoncheck.cpp
3  ---------------------
4  begin : June 2017
5  copyright : (C) 2017 by Sandro Mani / Sourcepole AG
6  email : smani at sourcepole dot ch
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 
18 #include "qgspolygon.h"
19 #include "qgsgeometryengine.h"
20 #include "qgsgeometrycheckerror.h"
21 
22 void QgsGeometryPointInPolygonCheck::collectErrors( const QMap<QString, QgsFeaturePool *> &featurePools, QList<QgsGeometryCheckError *> &errors, QStringList &messages, QgsFeedback *feedback, const LayerFeatureIds &ids ) const
23 {
24  QMap<QString, QgsFeatureIds> featureIds = ids.isEmpty() ? allLayerFeatureIds( featurePools ) : ids.toMap();
25  QgsGeometryCheckerUtils::LayerFeatures layerFeatures( featurePools, featureIds, compatibleGeometryTypes(), feedback, mContext, true );
26  for ( const QgsGeometryCheckerUtils::LayerFeature &layerFeature : layerFeatures )
27  {
28  const QgsAbstractGeometry *geom = layerFeature.geometry().constGet();
29  for ( int iPart = 0, nParts = geom->partCount(); iPart < nParts; ++iPart )
30  {
31  const QgsPoint *point = dynamic_cast<const QgsPoint *>( QgsGeometryCheckerUtils::getGeomPart( geom, iPart ) );
32  if ( !point )
33  {
34  // Should not happen
35  continue;
36  }
37  int nTested = 0;
38  int nInside = 0;
39 
40  // Check whether point is contained by a fully contained by a polygon
41  QgsRectangle rect( point->x() - mContext->tolerance, point->y() - mContext->tolerance,
42  point->x() + mContext->tolerance, point->y() + mContext->tolerance );
43  QgsGeometryCheckerUtils::LayerFeatures checkFeatures( featurePools, featureIds.keys(), rect, {QgsWkbTypes::PolygonGeometry}, mContext );
44  for ( const QgsGeometryCheckerUtils::LayerFeature &checkFeature : checkFeatures )
45  {
46  ++nTested;
47  const QgsAbstractGeometry *testGeom = checkFeature.geometry().constGet();
48  std::unique_ptr< QgsGeometryEngine > testGeomEngine = QgsGeometryCheckerUtils::createGeomEngine( testGeom, mContext->reducedTolerance );
49  if ( !testGeomEngine->isValid() )
50  {
51  messages.append( tr( "Point in polygon check failed for (%1): the geometry is invalid" ).arg( checkFeature.id() ) );
52  continue;
53  }
54  if ( testGeomEngine->contains( point ) && !testGeomEngine->touches( point ) )
55  {
56  ++nInside;
57  }
58  }
59  if ( nTested == 0 || nTested != nInside )
60  {
61  errors.append( new QgsGeometryCheckError( this, layerFeature, *point, QgsVertexId( iPart, 0, 0 ) ) );
62  }
63  }
64  }
65 }
66 
67 void QgsGeometryPointInPolygonCheck::fixError( const QMap<QString, QgsFeaturePool *> &featurePools, QgsGeometryCheckError *error, int method, const QMap<QString, int> & /*mergeAttributeIndices*/, Changes & /*changes*/ ) const
68 {
69  Q_UNUSED( featurePools )
70 
71  if ( method == NoChange )
72  {
73  error->setFixed( method );
74  }
75  else
76  {
77  error->setFixFailed( tr( "Unknown method" ) );
78  }
79 }
80 
82 {
83  static QStringList methods = QStringList() << tr( "No action" );
84  return methods;
85 }
86 
88 {
90 }
A rectangle specified with double values.
Definition: qgsrectangle.h:41
double y
Definition: qgspoint.h:42
static QgsAbstractGeometry * getGeomPart(QgsAbstractGeometry *geom, int partIdx)
QMap< QString, QgsFeatureIds > toMap() const
Contains a set of layers and feature ids in those layers to pass to a geometry check.
CheckType
The type of a check.
QList< QgsWkbTypes::GeometryType > compatibleGeometryTypes() const override
A list of geometry types for which this check can be performed.
void setFixFailed(const QString &reason)
Set the error status to failed and specify the reason for failure.
Base class for feedback objects to be used for cancellation of something running in a worker thread...
Definition: qgsfeedback.h:44
static QgsGeometryCheck::CheckType factoryCheckType()
Utility class for identifying a unique vertex within a geometry.
A layer feature combination to uniquely identify and access a feature in a set of layers...
Abstract base class for all geometries.
QMap< QString, QgsFeatureIds > allLayerFeatureIds(const QMap< QString, QgsFeaturePool *> &featurePools) const
Returns all layers and feature ids.
const double tolerance
The tolerance to allow for in geometry checks.
const QgsGeometryCheckContext * mContext
Point geometry type, with support for z-dimension and m-values.
Definition: qgspoint.h:37
const double reducedTolerance
The tolerance to allow for in geometry checks.
A list of layers and feature ids for each of these layers.
QStringList resolutionMethods() const override
Returns a list of descriptions for available resolutions for errors.
QMap< QString, QMap< QgsFeatureId, QList< QgsGeometryCheck::Change > > > Changes
A collection of changes.
void fixError(const QMap< QString, QgsFeaturePool *> &featurePools, QgsGeometryCheckError *error, int method, const QMap< QString, int > &mergeAttributeIndices, Changes &changes) const override
Fix the error error with the specified method.
void setFixed(int method)
Set the status to fixed and specify the method that has been used to fix the error.
void collectErrors(const QMap< QString, QgsFeaturePool *> &featurePools, QList< QgsGeometryCheckError *> &errors, QStringList &messages, QgsFeedback *feedback, const LayerFeatureIds &ids=LayerFeatureIds()) const override
The main worker method.
This represents an error reported by a geometry check.
static std::unique_ptr< QgsGeometryEngine > createGeomEngine(const QgsAbstractGeometry *geometry, double tolerance)
virtual int partCount() const =0
Returns count of parts contained in the geometry.
The check controls individual nodes.
double x
Definition: qgspoint.h:41