Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgssinglegeometrycheck.cpp 3 : : -------------------------------------- 4 : : Date : 7.9.2018 5 : : Copyright : (C) 2018 by Matthias Kuhn 6 : : email : matthias@opengis.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 "qgsgeometryisvalidcheck.h" 17 : : #include "qgsfeature.h" 18 : : #include "qgssettings.h" 19 : : #include "qgsgeos.h" 20 : : #include "qgsgeometryvalidator.h" 21 : : 22 : 0 : QgsGeometryIsValidCheck::QgsGeometryIsValidCheck( const QgsGeometryCheckContext *context, const QVariantMap &configuration ) 23 : 0 : : QgsSingleGeometryCheck( context, configuration ) 24 : 0 : {} 25 : : 26 : 0 : QList<QgsWkbTypes::GeometryType> QgsGeometryIsValidCheck::compatibleGeometryTypes() const 27 : : { 28 : 0 : return factoryCompatibleGeometryTypes(); 29 : : } 30 : : 31 : 0 : QList<QgsSingleGeometryCheckError *> QgsGeometryIsValidCheck::processGeometry( const QgsGeometry &geometry ) const 32 : : { 33 : 0 : QVector<QgsGeometry::Error> errors; 34 : : 35 : 0 : QgsGeometry::ValidationMethod method = QgsGeometry::ValidatorQgisInternal; 36 : 0 : if ( QgsSettings().value( QStringLiteral( "qgis/digitizing/validate_geometries" ), 1 ).toInt() == 2 ) 37 : 0 : method = QgsGeometry::ValidatorGeos; 38 : : 39 : 0 : QgsGeometryValidator validator( geometry, &errors, method ); 40 : : 41 : 0 : QObject::connect( &validator, &QgsGeometryValidator::errorFound, &validator, [ &errors ]( const QgsGeometry::Error & error ) 42 : : { 43 : 0 : errors.append( error ); 44 : 0 : } ); 45 : : 46 : : // We are already on a thread here normally, no reason to start yet another one. Run synchronously. 47 : 0 : validator.run(); 48 : : 49 : 0 : QList<QgsSingleGeometryCheckError *> result; 50 : 0 : for ( const auto &error : std::as_const( errors ) ) 51 : : { 52 : 0 : QgsGeometry errorGeometry; 53 : 0 : if ( error.hasWhere() ) 54 : 0 : errorGeometry = QgsGeometry( std::make_unique<QgsPoint>( error.where() ) ); 55 : : 56 : 0 : result << new QgsGeometryIsValidCheckError( this, geometry, errorGeometry, error.what() ); 57 : 0 : } 58 : 0 : return result; 59 : 0 : } 60 : : 61 : 0 : QStringList QgsGeometryIsValidCheck::resolutionMethods() const 62 : : { 63 : 0 : return QStringList(); 64 : : } 65 : : ///@cond private 66 : 0 : QList<QgsWkbTypes::GeometryType> QgsGeometryIsValidCheck::factoryCompatibleGeometryTypes() 67 : : { 68 : 0 : return {QgsWkbTypes::LineGeometry, QgsWkbTypes::PolygonGeometry}; 69 : : } 70 : : 71 : 0 : bool QgsGeometryIsValidCheck::factoryIsCompatible( QgsVectorLayer *layer ) SIP_SKIP 72 : : { 73 : 0 : return factoryCompatibleGeometryTypes().contains( layer->geometryType() ); 74 : 0 : } 75 : : 76 : 0 : QString QgsGeometryIsValidCheck::factoryDescription() 77 : : { 78 : 0 : return tr( "Is Valid" ); 79 : : } 80 : : 81 : 0 : QString QgsGeometryIsValidCheck::factoryId() 82 : : { 83 : 0 : return QStringLiteral( "QgsIsValidCheck" ); 84 : : } 85 : : 86 : 0 : QgsGeometryCheck::Flags QgsGeometryIsValidCheck::factoryFlags() 87 : : { 88 : 0 : return AvailableInValidation; 89 : : } 90 : : 91 : 0 : QgsGeometryCheck::CheckType QgsGeometryIsValidCheck::factoryCheckType() 92 : : { 93 : 0 : return QgsGeometryCheck::FeatureNodeCheck; 94 : : } 95 : : ///@endcond 96 : : 97 : 0 : QgsGeometryIsValidCheckError::QgsGeometryIsValidCheckError( const QgsSingleGeometryCheck *check, const QgsGeometry &geometry, const QgsGeometry &errorLocation, const QString &errorDescription ) 98 : 0 : : QgsSingleGeometryCheckError( check, geometry, errorLocation ) 99 : 0 : , mDescription( errorDescription ) 100 : 0 : { 101 : : 102 : 0 : } 103 : : 104 : 0 : QString QgsGeometryIsValidCheckError::description() const 105 : : { 106 : 0 : return mDescription; 107 : : }