Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsgeometrylinelayerintersectioncheck.cpp 3 : : --------------------- 4 : : begin : September 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 "qgsgeometrylinelayerintersectioncheck.h" 18 : : #include "qgspolygon.h" 19 : : #include "qgslinestring.h" 20 : : #include "qgsfeaturepool.h" 21 : : #include "qgsgeometrycheckerror.h" 22 : : 23 : 1 : void QgsGeometryLineLayerIntersectionCheck::collectErrors( const QMap<QString, QgsFeaturePool *> &featurePools, QList<QgsGeometryCheckError *> &errors, QStringList &messages, QgsFeedback *feedback, const LayerFeatureIds &ids ) const 24 : : { 25 : 1 : Q_UNUSED( messages ) 26 : : 27 : 1 : QMap<QString, QgsFeatureIds> featureIds = ids.isEmpty() ? allLayerFeatureIds( featurePools ) : ids.toMap(); 28 : 1 : featureIds.remove( mCheckLayer ); // Don't check layer against itself 29 : 1 : QgsGeometryCheckerUtils::LayerFeatures layerFeatures( featurePools, featureIds, compatibleGeometryTypes(), feedback, mContext, true ); 30 : 10 : for ( const QgsGeometryCheckerUtils::LayerFeature &layerFeature : layerFeatures ) 31 : : { 32 : 9 : const QgsAbstractGeometry *geom = layerFeature.geometry().constGet(); 33 : 19 : for ( int iPart = 0, nParts = geom->partCount(); iPart < nParts; ++iPart ) 34 : : { 35 : 10 : const QgsLineString *line = dynamic_cast<const QgsLineString *>( QgsGeometryCheckerUtils::getGeomPart( geom, iPart ) ); 36 : 10 : if ( !line ) 37 : : { 38 : : // Should not happen 39 : 0 : continue; 40 : : } 41 : : 42 : : // Check whether the line intersects with any other features of the specified layer 43 : 10 : QgsGeometryCheckerUtils::LayerFeatures checkFeatures( featurePools, QStringList() << mCheckLayer, line->boundingBox(), {QgsWkbTypes::LineGeometry, QgsWkbTypes::PolygonGeometry}, mContext ); 44 : 19 : for ( const QgsGeometryCheckerUtils::LayerFeature &checkFeature : checkFeatures ) 45 : : { 46 : 9 : const QgsAbstractGeometry *testGeom = checkFeature.geometry().constGet(); 47 : 18 : for ( int jPart = 0, mParts = testGeom->partCount(); jPart < mParts; ++jPart ) 48 : : { 49 : 9 : const QgsAbstractGeometry *part = QgsGeometryCheckerUtils::getGeomPart( testGeom, jPart ); 50 : 9 : if ( const QgsLineString *testLine = dynamic_cast<const QgsLineString *>( part ) ) 51 : : { 52 : 0 : const QList< QgsPoint > intersections = QgsGeometryCheckerUtils::lineIntersections( line, testLine, mContext->tolerance ); 53 : 0 : for ( const QgsPoint &inter : intersections ) 54 : : { 55 : 0 : errors.append( new QgsGeometryCheckError( this, layerFeature, inter, QgsVertexId( iPart ), checkFeature.id() ) ); 56 : : } 57 : 0 : } 58 : 9 : else if ( const QgsPolygon *polygon = dynamic_cast<const QgsPolygon *>( part ) ) 59 : : { 60 : 9 : const QList< const QgsLineString * > rings = QgsGeometryCheckerUtils::polygonRings( polygon ); 61 : 19 : for ( const QgsLineString *ring : rings ) 62 : : { 63 : 10 : const QList< QgsPoint > intersections = QgsGeometryCheckerUtils::lineIntersections( line, ring, mContext->tolerance ); 64 : 15 : for ( const QgsPoint &inter : intersections ) 65 : : { 66 : 5 : errors.append( new QgsGeometryCheckError( this, layerFeature, inter, QgsVertexId( iPart ), checkFeature.id() ) ); 67 : : } 68 : 10 : } 69 : 9 : } 70 : 9 : } 71 : : } 72 : 10 : } 73 : : } 74 : 1 : } 75 : : 76 : 0 : void QgsGeometryLineLayerIntersectionCheck::fixError( const QMap<QString, QgsFeaturePool *> &featurePools, QgsGeometryCheckError *error, int method, const QMap<QString, int> & /*mergeAttributeIndices*/, Changes & /*changes*/ ) const 77 : : { 78 : 0 : Q_UNUSED( featurePools ) 79 : : 80 : 0 : if ( method == NoChange ) 81 : : { 82 : 0 : error->setFixed( method ); 83 : 0 : } 84 : : else 85 : : { 86 : 0 : error->setFixFailed( tr( "Unknown method" ) ); 87 : : } 88 : 0 : } 89 : : 90 : 0 : QStringList QgsGeometryLineLayerIntersectionCheck::resolutionMethods() const 91 : : { 92 : 0 : static QStringList methods = QStringList() << tr( "No action" ); 93 : 0 : return methods; 94 : 0 : } 95 : : 96 : 0 : QgsGeometryCheck::CheckType QgsGeometryLineLayerIntersectionCheck::factoryCheckType() 97 : : { 98 : 0 : return QgsGeometryCheck::FeatureNodeCheck; 99 : : }