Branch data Line data Source code
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 : : 16 : : #include "qgsgeometrycheckcontext.h" 17 : : #include "qgsgeometrypointinpolygoncheck.h" 18 : : #include "qgspolygon.h" 19 : : #include "qgsgeometryengine.h" 20 : : #include "qgsgeometrycheckerror.h" 21 : : 22 : 1 : void QgsGeometryPointInPolygonCheck::collectErrors( const QMap<QString, QgsFeaturePool *> &featurePools, QList<QgsGeometryCheckError *> &errors, QStringList &messages, QgsFeedback *feedback, const LayerFeatureIds &ids ) const 23 : : { 24 : 1 : QMap<QString, QgsFeatureIds> featureIds = ids.isEmpty() ? allLayerFeatureIds( featurePools ) : ids.toMap(); 25 : 1 : QgsGeometryCheckerUtils::LayerFeatures layerFeatures( featurePools, featureIds, compatibleGeometryTypes(), feedback, mContext, true ); 26 : 8 : for ( const QgsGeometryCheckerUtils::LayerFeature &layerFeature : layerFeatures ) 27 : : { 28 : 7 : const QgsAbstractGeometry *geom = layerFeature.geometry().constGet(); 29 : 14 : for ( int iPart = 0, nParts = geom->partCount(); iPart < nParts; ++iPart ) 30 : : { 31 : 7 : const QgsPoint *point = dynamic_cast<const QgsPoint *>( QgsGeometryCheckerUtils::getGeomPart( geom, iPart ) ); 32 : 7 : if ( !point ) 33 : : { 34 : : // Should not happen 35 : 0 : continue; 36 : : } 37 : 7 : int nTested = 0; 38 : 7 : int nInside = 0; 39 : : 40 : : // Check whether point is contained by a fully contained by a polygon 41 : 14 : QgsRectangle rect( point->x() - mContext->tolerance, point->y() - mContext->tolerance, 42 : 7 : point->x() + mContext->tolerance, point->y() + mContext->tolerance ); 43 : 7 : QgsGeometryCheckerUtils::LayerFeatures checkFeatures( featurePools, featureIds.keys(), rect, {QgsWkbTypes::PolygonGeometry}, mContext ); 44 : 11 : for ( const QgsGeometryCheckerUtils::LayerFeature &checkFeature : checkFeatures ) 45 : : { 46 : 4 : ++nTested; 47 : 4 : const QgsAbstractGeometry *testGeom = checkFeature.geometry().constGet(); 48 : 4 : std::unique_ptr< QgsGeometryEngine > testGeomEngine = QgsGeometryCheckerUtils::createGeomEngine( testGeom, mContext->reducedTolerance ); 49 : 4 : if ( !testGeomEngine->isValid() ) 50 : : { 51 : 2 : messages.append( tr( "Point in polygon check failed for (%1): the geometry is invalid" ).arg( checkFeature.id() ) ); 52 : 2 : continue; 53 : : } 54 : 2 : if ( testGeomEngine->contains( point ) && !testGeomEngine->touches( point ) ) 55 : : { 56 : 2 : ++nInside; 57 : 2 : } 58 : 4 : } 59 : 7 : if ( nTested == 0 || nTested != nInside ) 60 : : { 61 : 6 : errors.append( new QgsGeometryCheckError( this, layerFeature, *point, QgsVertexId( iPart, 0, 0 ) ) ); 62 : 6 : } 63 : 7 : } 64 : : } 65 : 1 : } 66 : : 67 : 0 : void QgsGeometryPointInPolygonCheck::fixError( const QMap<QString, QgsFeaturePool *> &featurePools, QgsGeometryCheckError *error, int method, const QMap<QString, int> & /*mergeAttributeIndices*/, Changes & /*changes*/ ) const 68 : : { 69 : 0 : Q_UNUSED( featurePools ) 70 : : 71 : 0 : if ( method == NoChange ) 72 : : { 73 : 0 : error->setFixed( method ); 74 : 0 : } 75 : : else 76 : : { 77 : 0 : error->setFixFailed( tr( "Unknown method" ) ); 78 : : } 79 : 0 : } 80 : : 81 : 0 : QStringList QgsGeometryPointInPolygonCheck::resolutionMethods() const 82 : : { 83 : 0 : static QStringList methods = QStringList() << tr( "No action" ); 84 : 0 : return methods; 85 : 0 : } 86 : : 87 : 0 : QgsGeometryCheck::CheckType QgsGeometryPointInPolygonCheck::factoryCheckType() 88 : : { 89 : 0 : return QgsGeometryCheck::FeatureNodeCheck; 90 : : }