From 8177bbef1abfc036d8cea0d279a18a302e4d3d4e Mon Sep 17 00:00:00 2001 From: Martin Dobias Date: Tue, 20 Jan 2015 21:18:06 +0700 Subject: [PATCH] Snapping utils optimization Avoid snapping to edges if vertex has already been found. Also increase the maximum feature count to 1M before doing non-indexed queries --- src/core/qgssnappingutils.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/core/qgssnappingutils.cpp b/src/core/qgssnappingutils.cpp index 71b913a5b52..6475d5bd355 100644 --- a/src/core/qgssnappingutils.cpp +++ b/src/core/qgssnappingutils.cpp @@ -73,7 +73,7 @@ QgsPointLocator* QgsSnappingUtils::locatorForLayerUsingStrategy( QgsVectorLayer* return temporaryLocatorForLayer( vl, pointMap, tolerance ); else // Hybrid { - if ( vl->pendingFeatureCount() > 100000 ) + if ( vl->pendingFeatureCount() > 1000000 ) return temporaryLocatorForLayer( vl, pointMap, tolerance ); else return locatorForLayer( vl ); @@ -95,6 +95,9 @@ QgsPointLocator* QgsSnappingUtils::temporaryLocatorForLayer( QgsVectorLayer* vl, static QgsPointLocator::Match _findClosestSegmentIntersection( const QgsPoint& pt, const QgsPointLocator::MatchList& segments ) { + if ( segments.isEmpty() ) + return QgsPointLocator::Match(); + QSet endpoints; // make a geometry @@ -180,7 +183,7 @@ static void _updateBestMatch( QgsPointLocator::Match& bestMatch, const QgsPoint& { _replaceIfBetter( bestMatch, loc->nearestVertex( pointMap, tolerance, filter ), tolerance ); } - if ( type & QgsPointLocator::Edge ) + if ( bestMatch.type() != QgsPointLocator::Vertex && ( type & QgsPointLocator::Edge ) ) { _replaceIfBetter( bestMatch, loc->nearestEdge( pointMap, tolerance, filter ), tolerance ); }