From df1ead5ed4e6816f37fe96f761545fcf1e208b56 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Tue, 2 May 2017 13:39:36 +1000 Subject: [PATCH] [processing] Remove vector.spatialindex() Use QgsProcessingUtils.createSpatialIndex() instead. --- doc/api_break.dox | 2 +- python/core/processing/qgsprocessingutils.sip | 9 ++++++++ .../processing/algs/qgis/Difference.py | 2 +- .../processing/algs/qgis/ExtractByLocation.py | 2 +- .../processing/algs/qgis/HubDistanceLines.py | 2 +- .../processing/algs/qgis/HubDistancePoints.py | 2 +- .../processing/algs/qgis/Intersection.py | 2 +- .../processing/algs/qgis/LinesIntersection.py | 2 +- .../algs/qgis/NearestNeighbourAnalysis.py | 2 +- .../processing/algs/qgis/PointDistance.py | 4 ++-- .../processing/algs/qgis/PointsInPolygon.py | 2 +- .../algs/qgis/PointsInPolygonUnique.py | 2 +- .../algs/qgis/PointsInPolygonWeighted.py | 2 +- .../processing/algs/qgis/RandomPointsLayer.py | 2 +- .../processing/algs/qgis/SelectByLocation.py | 2 +- .../processing/algs/qgis/SpatialJoin.py | 2 +- .../algs/qgis/SplitLinesWithLines.py | 2 +- .../plugins/processing/algs/qgis/SumLines.py | 2 +- .../algs/qgis/SymmetricalDifference.py | 4 ++-- python/plugins/processing/algs/qgis/Union.py | 4 ++-- python/plugins/processing/tools/vector.py | 21 ++----------------- src/core/processing/qgsprocessingutils.cpp | 11 ++++++++++ src/core/processing/qgsprocessingutils.h | 9 ++++++++ 23 files changed, 53 insertions(+), 41 deletions(-) diff --git a/doc/api_break.dox b/doc/api_break.dox index f18b48b1d5f..cc67becd21c 100644 --- a/doc/api_break.dox +++ b/doc/api_break.dox @@ -2234,7 +2234,7 @@ object of type QgsProcessingFeedback, and will need to adapt their use of progre - dataobjects.getLayerFromString() was removed. Use QgsProcessingUtils.mapLayerFromString() instead. - vector.bufferedBoundingBox() was removed. Use QgsRectangle.grow() instead. - vector.duplicateInMemory() was removed. - +- vector.spatialindex() was removed. Use QgsProcessingUtils.createSpatialIndex() instead. Triangulation {#qgis_api_break_3_0_Triangulation} ------------- diff --git a/python/core/processing/qgsprocessingutils.sip b/python/core/processing/qgsprocessingutils.sip index 83976a0ddad..1f932fae07e 100644 --- a/python/core/processing/qgsprocessingutils.sip +++ b/python/core/processing/qgsprocessingutils.sip @@ -104,6 +104,15 @@ class QgsProcessingUtils :rtype: long %End + static QgsSpatialIndex createSpatialIndex( QgsVectorLayer *layer, const QgsProcessingContext &context ); +%Docstring + Creates a spatial index for a layer, when + the settings from the supplied ``context`` are respected. E.g. if the + context is set to only use selected features, then calling this will + return an index containing only selected features in the layer. + :rtype: QgsSpatialIndex +%End + static QList< QVariant > uniqueValues( QgsVectorLayer *layer, int fieldIndex, const QgsProcessingContext &context ); %Docstring Returns a list of unique values contained in a single field in a ``layer``, when diff --git a/python/plugins/processing/algs/qgis/Difference.py b/python/plugins/processing/algs/qgis/Difference.py index 12eca5d5a48..4105bb21012 100644 --- a/python/plugins/processing/algs/qgis/Difference.py +++ b/python/plugins/processing/algs/qgis/Difference.py @@ -78,7 +78,7 @@ class Difference(GeoAlgorithm): Difference.OUTPUT).getVectorWriter(layerA.fields(), geomType, layerA.crs(), context) outFeat = QgsFeature() - index = vector.spatialindex(layerB) + index = QgsProcessingUtils.createSpatialIndex(layerB, context) selectionA = QgsProcessingUtils.getFeatures(layerA, context) total = 100.0 / QgsProcessingUtils.featureCount(layerA, context) for current, inFeatA in enumerate(selectionA): diff --git a/python/plugins/processing/algs/qgis/ExtractByLocation.py b/python/plugins/processing/algs/qgis/ExtractByLocation.py index 02c025b25c3..bd25c950777 100644 --- a/python/plugins/processing/algs/qgis/ExtractByLocation.py +++ b/python/plugins/processing/algs/qgis/ExtractByLocation.py @@ -94,7 +94,7 @@ class ExtractByLocation(GeoAlgorithm): predicates = self.getParameterValue(self.PREDICATE) precision = self.getParameterValue(self.PRECISION) - index = vector.spatialindex(layer) + index = QgsProcessingUtils.createSpatialIndex(layer, context) output = self.getOutputFromName(self.OUTPUT) writer = output.getVectorWriter(layer.fields(), layer.wkbType(), layer.crs(), context) diff --git a/python/plugins/processing/algs/qgis/HubDistanceLines.py b/python/plugins/processing/algs/qgis/HubDistanceLines.py index 2ea5019f7e2..8d5665c2e54 100644 --- a/python/plugins/processing/algs/qgis/HubDistanceLines.py +++ b/python/plugins/processing/algs/qgis/HubDistanceLines.py @@ -113,7 +113,7 @@ class HubDistanceLines(GeoAlgorithm): writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, QgsWkbTypes.LineString, layerPoints.crs(), context) - index = vector.spatialindex(layerHubs) + index = QgsProcessingUtils.createSpatialIndex(layerHubs, context) distance = QgsDistanceArea() distance.setSourceCrs(layerPoints.crs()) diff --git a/python/plugins/processing/algs/qgis/HubDistancePoints.py b/python/plugins/processing/algs/qgis/HubDistancePoints.py index 25b5606e2a5..8bfa0b47406 100644 --- a/python/plugins/processing/algs/qgis/HubDistancePoints.py +++ b/python/plugins/processing/algs/qgis/HubDistancePoints.py @@ -113,7 +113,7 @@ class HubDistancePoints(GeoAlgorithm): writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, QgsWkbTypes.Point, layerPoints.crs(), context) - index = vector.spatialindex(layerHubs) + index = QgsProcessingUtils.createSpatialIndex(layerHubs, context) distance = QgsDistanceArea() distance.setSourceCrs(layerPoints.crs()) diff --git a/python/plugins/processing/algs/qgis/Intersection.py b/python/plugins/processing/algs/qgis/Intersection.py index 09f9a64f53f..530b757b88e 100644 --- a/python/plugins/processing/algs/qgis/Intersection.py +++ b/python/plugins/processing/algs/qgis/Intersection.py @@ -86,7 +86,7 @@ class Intersection(GeoAlgorithm): fields = vector.combineVectorFields(vlayerA, vlayerB) writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, geomType, vlayerA.crs(), context) outFeat = QgsFeature() - index = vector.spatialindex(vlayerB) + index = QgsProcessingUtils.createSpatialIndex(vlayerB, context) selectionA = QgsProcessingUtils.getFeatures(vlayerA, context) total = 100.0 / QgsProcessingUtils.featureCount(vlayerA, context) for current, inFeatA in enumerate(selectionA): diff --git a/python/plugins/processing/algs/qgis/LinesIntersection.py b/python/plugins/processing/algs/qgis/LinesIntersection.py index f7f36e2d908..c8004b41f56 100644 --- a/python/plugins/processing/algs/qgis/LinesIntersection.py +++ b/python/plugins/processing/algs/qgis/LinesIntersection.py @@ -108,7 +108,7 @@ class LinesIntersection(GeoAlgorithm): writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fieldListA, QgsWkbTypes.Point, layerA.crs(), context) - spatialIndex = vector.spatialindex(layerB) + spatialIndex = QgsProcessingUtils.createSpatialIndex(layerB, context) outFeat = QgsFeature() features = QgsProcessingUtils.getFeatures(layerA, context) diff --git a/python/plugins/processing/algs/qgis/NearestNeighbourAnalysis.py b/python/plugins/processing/algs/qgis/NearestNeighbourAnalysis.py index 63e075b8e3d..4112b42c6de 100644 --- a/python/plugins/processing/algs/qgis/NearestNeighbourAnalysis.py +++ b/python/plugins/processing/algs/qgis/NearestNeighbourAnalysis.py @@ -86,7 +86,7 @@ class NearestNeighbourAnalysis(GeoAlgorithm): layer = dataobjects.QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.POINTS), context) output = self.getOutputValue(self.OUTPUT) - spatialIndex = vector.spatialindex(layer) + spatialIndex = QgsProcessingUtils.createSpatialIndex(layer, context) neighbour = QgsFeature() distance = QgsDistanceArea() diff --git a/python/plugins/processing/algs/qgis/PointDistance.py b/python/plugins/processing/algs/qgis/PointDistance.py index aa9559eca9b..f5ac3a83768 100644 --- a/python/plugins/processing/algs/qgis/PointDistance.py +++ b/python/plugins/processing/algs/qgis/PointDistance.py @@ -125,7 +125,7 @@ class PointDistance(GeoAlgorithm): else: self.writer.addRecord(['InputID', 'MEAN', 'STDDEV', 'MIN', 'MAX']) - index = vector.spatialindex(targetLayer) + index = QgsProcessingUtils.createSpatialIndex(targetLayer, context) inIdx = inLayer.fields().lookupField(inField) outIdx = targetLayer.fields().lookupField(targetField) @@ -164,7 +164,7 @@ class PointDistance(GeoAlgorithm): def regularMatrix(self, context, inLayer, inField, targetLayer, targetField, nPoints, feedback): - index = vector.spatialindex(targetLayer) + index = QgsProcessingUtils.createSpatialIndex(targetLayer, context) inIdx = inLayer.fields().lookupField(inField) diff --git a/python/plugins/processing/algs/qgis/PointsInPolygon.py b/python/plugins/processing/algs/qgis/PointsInPolygon.py index 0f94e1abb8e..c8a1a4a306f 100644 --- a/python/plugins/processing/algs/qgis/PointsInPolygon.py +++ b/python/plugins/processing/algs/qgis/PointsInPolygon.py @@ -83,7 +83,7 @@ class PointsInPolygon(GeoAlgorithm): writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields.toList(), polyLayer.wkbType(), polyLayer.crs(), context) - spatialIndex = vector.spatialindex(pointLayer) + spatialIndex = QgsProcessingUtils.createSpatialIndex(pointLayer, context) ftPoly = QgsFeature() ftPoint = QgsFeature() diff --git a/python/plugins/processing/algs/qgis/PointsInPolygonUnique.py b/python/plugins/processing/algs/qgis/PointsInPolygonUnique.py index e4b516a11d6..b7294bf2dff 100644 --- a/python/plugins/processing/algs/qgis/PointsInPolygonUnique.py +++ b/python/plugins/processing/algs/qgis/PointsInPolygonUnique.py @@ -90,7 +90,7 @@ class PointsInPolygonUnique(GeoAlgorithm): writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields.toList(), polyLayer.wkbType(), polyLayer.crs(), context) - spatialIndex = vector.spatialindex(pointLayer) + spatialIndex = QgsProcessingUtils.createSpatialIndex(pointLayer, context) ftPoint = QgsFeature() outFeat = QgsFeature() diff --git a/python/plugins/processing/algs/qgis/PointsInPolygonWeighted.py b/python/plugins/processing/algs/qgis/PointsInPolygonWeighted.py index cbe3ecd592e..2be15f1a803 100644 --- a/python/plugins/processing/algs/qgis/PointsInPolygonWeighted.py +++ b/python/plugins/processing/algs/qgis/PointsInPolygonWeighted.py @@ -96,7 +96,7 @@ class PointsInPolygonWeighted(GeoAlgorithm): writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields.toList(), polyLayer.wkbType(), polyLayer.crs(), context) - spatialIndex = vector.spatialindex(pointLayer) + spatialIndex = QgsProcessingUtils.createSpatialIndex(pointLayer, context) ftPoint = QgsFeature() outFeat = QgsFeature() diff --git a/python/plugins/processing/algs/qgis/RandomPointsLayer.py b/python/plugins/processing/algs/qgis/RandomPointsLayer.py index 6101e9ee503..9b158ea86e1 100644 --- a/python/plugins/processing/algs/qgis/RandomPointsLayer.py +++ b/python/plugins/processing/algs/qgis/RandomPointsLayer.py @@ -78,7 +78,7 @@ class RandomPointsLayer(GeoAlgorithm): minDistance = float(self.getParameterValue(self.MIN_DISTANCE)) bbox = layer.extent() - idxLayer = vector.spatialindex(layer) + idxLayer = QgsProcessingUtils.createSpatialIndex(layer, context) fields = QgsFields() fields.append(QgsField('id', QVariant.Int, '', 10, 0)) diff --git a/python/plugins/processing/algs/qgis/SelectByLocation.py b/python/plugins/processing/algs/qgis/SelectByLocation.py index 4dee5c3db48..4080e4c2e4b 100644 --- a/python/plugins/processing/algs/qgis/SelectByLocation.py +++ b/python/plugins/processing/algs/qgis/SelectByLocation.py @@ -104,7 +104,7 @@ class SelectByLocation(GeoAlgorithm): oldSelection = set(inputLayer.selectedFeatureIds()) inputLayer.removeSelection() - index = vector.spatialindex(inputLayer) + index = QgsProcessingUtils.createSpatialIndex(inputLayer, context) if 'disjoint' in predicates: disjoinSet = [] diff --git a/python/plugins/processing/algs/qgis/SpatialJoin.py b/python/plugins/processing/algs/qgis/SpatialJoin.py index 5a3dd5f4e70..2ae6fdc6eb2 100644 --- a/python/plugins/processing/algs/qgis/SpatialJoin.py +++ b/python/plugins/processing/algs/qgis/SpatialJoin.py @@ -154,7 +154,7 @@ class SpatialJoin(GeoAlgorithm): inFeatB = QgsFeature() inGeom = QgsGeometry() - index = vector.spatialindex(join) + index = QgsProcessingUtils.createSpatialIndex(join, context) mapP2 = dict() features = QgsProcessingUtils.getFeatures(join, context) diff --git a/python/plugins/processing/algs/qgis/SplitLinesWithLines.py b/python/plugins/processing/algs/qgis/SplitLinesWithLines.py index 0b57a48db2c..bc75c099557 100644 --- a/python/plugins/processing/algs/qgis/SplitLinesWithLines.py +++ b/python/plugins/processing/algs/qgis/SplitLinesWithLines.py @@ -85,7 +85,7 @@ class SplitLinesWithLines(GeoAlgorithm): writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fieldList, QgsWkbTypes.LineString, layerA.crs(), context) - spatialIndex = vector.spatialindex(layerB) + spatialIndex = QgsProcessingUtils.createSpatialIndex(layerB, context) outFeat = QgsFeature() features = QgsProcessingUtils.getFeatures(layerA, context) diff --git a/python/plugins/processing/algs/qgis/SumLines.py b/python/plugins/processing/algs/qgis/SumLines.py index 92ee2c4883e..44213246bd2 100644 --- a/python/plugins/processing/algs/qgis/SumLines.py +++ b/python/plugins/processing/algs/qgis/SumLines.py @@ -86,7 +86,7 @@ class SumLines(GeoAlgorithm): writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fieldList.toList(), polyLayer.wkbType(), polyLayer.crs(), context) - spatialIndex = vector.spatialindex(lineLayer) + spatialIndex = QgsProcessingUtils.createSpatialIndex(lineLayer, context) ftLine = QgsFeature() ftPoly = QgsFeature() diff --git a/python/plugins/processing/algs/qgis/SymmetricalDifference.py b/python/plugins/processing/algs/qgis/SymmetricalDifference.py index 927dd7ddb46..710bc82d0a9 100644 --- a/python/plugins/processing/algs/qgis/SymmetricalDifference.py +++ b/python/plugins/processing/algs/qgis/SymmetricalDifference.py @@ -81,8 +81,8 @@ class SymmetricalDifference(GeoAlgorithm): featB = QgsFeature() outFeat = QgsFeature() - indexA = vector.spatialindex(layerB) - indexB = vector.spatialindex(layerA) + indexA = QgsProcessingUtils.createSpatialIndex(layerB, context) + indexB = QgsProcessingUtils.createSpatialIndex(layerA, context) featuresA = QgsProcessingUtils.getFeatures(layerA, context) featuresB = QgsProcessingUtils.getFeatures(layerB, context) diff --git a/python/plugins/processing/algs/qgis/Union.py b/python/plugins/processing/algs/qgis/Union.py index bf9315e3250..6afa71cd66e 100644 --- a/python/plugins/processing/algs/qgis/Union.py +++ b/python/plugins/processing/algs/qgis/Union.py @@ -88,8 +88,8 @@ class Union(GeoAlgorithm): inFeatA = QgsFeature() inFeatB = QgsFeature() outFeat = QgsFeature() - indexA = vector.spatialindex(vlayerB) - indexB = vector.spatialindex(vlayerA) + indexA = QgsProcessingUtils.createSpatialIndex(vlayerB, context) + indexB = QgsProcessingUtils.createSpatialIndex(vlayerA, context) count = 0 nElement = 0 diff --git a/python/plugins/processing/tools/vector.py b/python/plugins/processing/tools/vector.py index effe4d92a2b..c9103f7f068 100644 --- a/python/plugins/processing/tools/vector.py +++ b/python/plugins/processing/tools/vector.py @@ -40,15 +40,12 @@ import uuid import psycopg2 from osgeo import ogr -from qgis.PyQt.QtCore import QVariant, QCoreApplication +from qgis.PyQt.QtCore import QVariant from qgis.core import (QgsFields, QgsField, QgsGeometry, - QgsRectangle, QgsWkbTypes, QgsSpatialIndex, - QgsProject, - QgsMapLayer, QgsVectorLayer, QgsVectorFileWriter, QgsDistanceArea, @@ -57,8 +54,7 @@ from qgis.core import (QgsFields, QgsFeatureRequest, QgsSettings, QgsProcessingContext, - QgsProcessingUtils, - QgsMessageLog) + QgsProcessingUtils) from processing.core.ProcessingConfig import ProcessingConfig from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException @@ -172,19 +168,6 @@ def testForUniqueness(fieldList1, fieldList2): return fieldList2 -def spatialindex(layer): - """Creates a spatial index for the passed vector layer. - """ - request = QgsFeatureRequest() - request.setSubsetOfAttributes([]) - if ProcessingConfig.getSetting(ProcessingConfig.USE_SELECTED) \ - and layer.selectedFeatureCount() > 0: - idx = QgsSpatialIndex(layer.getSelectedFeatures(request)) - else: - idx = QgsSpatialIndex(layer.getFeatures(request)) - return idx - - def createUniqueFieldName(fieldName, fieldList): def nextname(name): num = 1 diff --git a/src/core/processing/qgsprocessingutils.cpp b/src/core/processing/qgsprocessingutils.cpp index e2594845f40..cda05ae8122 100644 --- a/src/core/processing/qgsprocessingutils.cpp +++ b/src/core/processing/qgsprocessingutils.cpp @@ -228,6 +228,17 @@ long QgsProcessingUtils::featureCount( QgsVectorLayer *layer, const QgsProcessin return layer->featureCount(); } +QgsSpatialIndex QgsProcessingUtils::createSpatialIndex( QgsVectorLayer *layer, const QgsProcessingContext &context ) +{ + QgsFeatureRequest request; + request.setSubsetOfAttributes( QgsAttributeList() ); + bool useSelection = context.flags() & QgsProcessingContext::UseSelectionIfPresent && layer->selectedFeatureCount() > 0; + if ( useSelection ) + return QgsSpatialIndex( layer->getSelectedFeatures( request ) ); + else + return QgsSpatialIndex( layer->getFeatures( request ) ); +} + QList QgsProcessingUtils::uniqueValues( QgsVectorLayer *layer, int fieldIndex, const QgsProcessingContext &context ) { if ( !layer ) diff --git a/src/core/processing/qgsprocessingutils.h b/src/core/processing/qgsprocessingutils.h index 593718d5473..72792d13b62 100644 --- a/src/core/processing/qgsprocessingutils.h +++ b/src/core/processing/qgsprocessingutils.h @@ -23,6 +23,7 @@ #include "qgsrasterlayer.h" #include "qgsvectorlayer.h" #include "qgsmessagelog.h" +#include "qgsspatialindex.h" class QgsProject; class QgsProcessingContext; @@ -113,6 +114,14 @@ class CORE_EXPORT QgsProcessingUtils */ static long featureCount( QgsVectorLayer *layer, const QgsProcessingContext &context ); + /** + * Creates a spatial index for a layer, when + * the settings from the supplied \a context are respected. E.g. if the + * context is set to only use selected features, then calling this will + * return an index containing only selected features in the layer. + */ + static QgsSpatialIndex createSpatialIndex( QgsVectorLayer *layer, const QgsProcessingContext &context ); + /** * Returns a list of unique values contained in a single field in a \a layer, when * the settings from the supplied \a context are respected. E.g. if the