mirror of
https://github.com/qgis/QGIS.git
synced 2025-02-25 00:58:06 -05:00
86 lines
4.0 KiB
Python
86 lines
4.0 KiB
Python
from sextante.core.GeoAlgorithm import GeoAlgorithm
|
|
import os.path
|
|
from PyQt4 import QtGui
|
|
from PyQt4.QtCore import *
|
|
from PyQt4.QtGui import *
|
|
from qgis.core import *
|
|
from sextante.parameters.ParameterVector import ParameterVector
|
|
from sextante.core.QGisLayers import QGisLayers
|
|
from sextante.outputs.OutputVector import OutputVector
|
|
from sextante.parameters.ParameterSelection import ParameterSelection
|
|
from sextante.parameters.ParameterBoolean import ParameterBoolean
|
|
from sextante.ftools import ftools_utils
|
|
|
|
class SelectByLocation(GeoAlgorithm):
|
|
|
|
INPUT = "INPUT"
|
|
INTERSECT = "INTERSECT"
|
|
METHOD = "METHOD"
|
|
USE_SELECTED = "USE_SELECTED"
|
|
OUTPUT = "OUTPUT"
|
|
|
|
def getIcon(self):
|
|
return QtGui.QIcon(os.path.dirname(__file__) + "/icons/select_location.png")
|
|
|
|
def processAlgorithm(self, progress):
|
|
method = self.getParameterValue(self.METHOD)
|
|
selection = self.getParameterValue(self.USE_SELECTED)
|
|
filename = self.getParameterValue(SelectByLocation.INPUT)
|
|
inputLayer = QGisLayers.getObjectFromUri(filename)
|
|
filename = self.getParameterValue(SelectByLocation.INTERSECT)
|
|
selectLayer = QGisLayers.getObjectFromUri(filename)
|
|
inputProvider = inputLayer.dataProvider()
|
|
allAttrs = inputProvider.attributeIndexes()
|
|
inputProvider.select(allAttrs, QgsRectangle())
|
|
selectProvider = selectLayer.dataProvider()
|
|
allAttrs = selectProvider.attributeIndexes()
|
|
selectProvider.select(allAttrs, QgsRectangle())
|
|
feat = QgsFeature()
|
|
infeat = QgsFeature()
|
|
geom = QgsGeometry()
|
|
selectedSet = []
|
|
index = ftools_utils.createIndex(inputProvider)
|
|
if selection:
|
|
features = selectLayer.selectedFeatures()
|
|
featurescount = len(features)
|
|
i = 0
|
|
for feat in features:
|
|
geom = QgsGeometry(feat.geometry())
|
|
intersects = index.intersects(geom.boundingBox())
|
|
for id in intersects:
|
|
inputProvider.featureAtId(int(id), infeat, True)
|
|
tmpGeom = QgsGeometry(infeat.geometry())
|
|
if geom.intersects(tmpGeom):
|
|
selectedSet.append(infeat.id())
|
|
i += 1
|
|
progress.setPercentage(i/featurescount * 100)
|
|
else:
|
|
featurescount = selectProvider.featureCount()
|
|
while selectProvider.nextFeature(feat):
|
|
geom = QgsGeometry(feat.geometry())
|
|
intersects = index.intersects(geom.boundingBox())
|
|
i = 0
|
|
for iid in intersects:
|
|
inputProvider.featureAtId(int(iid), infeat, True)
|
|
tmpGeom = QgsGeometry( infeat.geometry() )
|
|
if geom.intersects(tmpGeom):
|
|
selectedSet.append(infeat.id())
|
|
i += 1
|
|
progress.setPercentage(i/featurescount * 100)
|
|
if method == 1:
|
|
selectedSet = list(set(inputLayer.selectedFeaturesIds()).union(selectedSet))
|
|
elif method == 2:
|
|
selectedSet = list(set(inputLayer.selectedFeaturesIds()).difference(selectedSet))
|
|
inputLayer.setSelectedFeatures(selectedSet)
|
|
self.setOutputValue(self.OUTPUT, filename)
|
|
|
|
|
|
def defineCharacteristics(self):
|
|
self.name = "Select by location"
|
|
self.group = "Research tools"
|
|
self.addParameter(ParameterVector(SelectByLocation.INPUT, "Layer to select from", ParameterVector.VECTOR_TYPE_ANY))
|
|
self.addParameter(ParameterVector(SelectByLocation.INTERSECT, "Additional layer (intersection layer)", ParameterVector.VECTOR_TYPE_ANY))
|
|
self.addParameter(ParameterSelection(SelectByLocation.METHOD, "Modify current selection by", ["creating new selection","adding to current selection", "removing from current selection"]))
|
|
self.addParameter(ParameterBoolean(SelectByLocation.USE_SELECTED, "Use only selected features", False))
|
|
self.addOutput(OutputVector(SelectByLocation.OUTPUT, "Selection", True))
|