Skip to content

Commit 6df3540

Browse files
committedMar 21, 2013
review Difference tool
1 parent aa4f70c commit 6df3540

File tree

1 file changed

+48
-45
lines changed

1 file changed

+48
-45
lines changed
 

‎python/plugins/sextante/algs/ftools/Difference.py

Lines changed: 48 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -22,90 +22,93 @@
2222
# This will get replaced with a git SHA1 when you do a git archive
2323
__revision__ = '$Format:%H$'
2424

25-
2625
from PyQt4.QtCore import *
27-
from PyQt4.QtGui import *
26+
2827
from qgis.core import *
29-
from sextante.parameters.ParameterVector import ParameterVector
28+
3029
from sextante.core.QGisLayers import QGisLayers
31-
from sextante.outputs.OutputVector import OutputVector
32-
from sextante.algs.ftools import FToolsUtils as utils
3330
from sextante.core.SextanteLog import SextanteLog
3431
from sextante.core.GeoAlgorithm import GeoAlgorithm
3532

33+
from sextante.parameters.ParameterVector import ParameterVector
34+
35+
from sextante.outputs.OutputVector import OutputVector
36+
37+
from sextante.algs.ftools import FToolsUtils as utils
3638

3739
class Difference(GeoAlgorithm):
3840

3941
INPUT = "INPUT"
40-
INPUT2 = "INPUT2"
42+
OVERLAY = "OVERLAY"
4143
OUTPUT = "OUTPUT"
4244

4345
#===========================================================================
4446
# def getIcon(self):
4547
# return QtGui.QIcon(os.path.dirname(__file__) + "/icons/difference.png")
4648
#===========================================================================
4749

50+
def defineCharacteristics(self):
51+
self.name = "Difference"
52+
self.group = "Vector overlay tools"
53+
self.addParameter(ParameterVector(Difference.INPUT, "Input layer", ParameterVector.VECTOR_TYPE_ANY))
54+
self.addParameter(ParameterVector(Difference.OVERLAY, "Difference layer", ParameterVector.VECTOR_TYPE_ANY))
55+
self.addOutput(OutputVector(Difference.OUTPUT, "Difference"))
56+
4857
def processAlgorithm(self, progress):
49-
vlayerA = QGisLayers.getObjectFromUri(self.getParameterValue(Difference.INPUT))
50-
vlayerB = QGisLayers.getObjectFromUri(self.getParameterValue(Difference.INPUT2))
58+
layerA = QGisLayers.getObjectFromUri(self.getParameterValue(Difference.INPUT))
59+
layerB = QGisLayers.getObjectFromUri(self.getParameterValue(Difference.OVERLAY))
60+
5161
GEOS_EXCEPT = True
62+
5263
FEATURE_EXCEPT = True
53-
vproviderA = vlayerA.dataProvider()
54-
vproviderB = vlayerB.dataProvider()
55-
fields = vproviderA.fields()
56-
# check for crs compatibility
57-
crsA = vproviderA.crs()
58-
crsB = vproviderB.crs()
59-
if not crsA.isValid() or not crsB.isValid():
60-
SextanteLog.addToLog(SextanteLog.LOG_WARNING, "Difference. Invalid CRS. Results might be unexpected")
61-
else:
62-
if crsA != crsB:
63-
SextanteLog.addToLog(SextanteLog.LOG_WARNING, "Difference. Non-matching CRSs. Results might be unexpected")
64-
writer = self.getOutputFromName(Difference.OUTPUT).getVectorWriter(fields, vproviderA.geometryType(), vproviderA.crs() )
64+
65+
writer = self.getOutputFromName(Difference.OUTPUT).getVectorWriter(layerA.pendingFields(),
66+
layerA.dataProvider().geometryType(), layerA.dataProvider().crs())
67+
6568
inFeatA = QgsFeature()
6669
inFeatB = QgsFeature()
6770
outFeat = QgsFeature()
68-
index = utils.createSpatialIndex(vlayerB)
69-
nElement = 0
70-
selectionA = QGisLayers.features(vlayerA)
71-
nFeat = len(selectionA)
71+
72+
index = utils.createSpatialIndex(layerB)
73+
74+
selectionA = QGisLayers.features(layerA)
75+
76+
current = 0
77+
total = 100.0 / float(len(selectionA))
78+
7279
for inFeatA in selectionA:
73-
nElement += 1
74-
progress.setPercentage(nElement/float(nFeat) * 100)
7580
add = True
76-
geom = QgsGeometry( inFeatA.geometry() )
77-
diff_geom = QgsGeometry( geom )
78-
atMap = inFeatA.attributes()
79-
intersects = index.intersects( geom.boundingBox() )
80-
for id in intersects:
81-
vlayerB.featureAtId( int( id ), inFeatB , True)
82-
tmpGeom = QgsGeometry( inFeatB.geometry() )
81+
geom = QgsGeometry(inFeatA.geometry())
82+
diff_geom = QgsGeometry(geom)
83+
attrs = inFeatA.attributes()
84+
intersections = index.intersects(geom.boundingBox())
85+
for i in intersections:
86+
request = QgsFeatureRequest().setFilterFid(i)
87+
inFeatB = layerB.getFeatures(request).next()
88+
tmpGeom = QgsGeometry(inFeatB.geometry())
8389
try:
84-
if diff_geom.intersects( tmpGeom ):
85-
diff_geom = QgsGeometry( diff_geom.difference( tmpGeom ) )
90+
if diff_geom.intersects(tmpGeom):
91+
diff_geom = QgsGeometry(diff_geom.difference(tmpGeom))
8692
except:
8793
GEOS_EXCEPT = False
8894
add = False
8995
break
96+
9097
if add:
9198
try:
92-
outFeat.setGeometry( diff_geom )
93-
outFeat.setAttributes( atMap )
94-
writer.addFeature( outFeat )
99+
outFeat.setGeometry(diff_geom)
100+
outFeat.setAttributes(attrs)
101+
writer.addFeature(outFeat)
95102
except:
96103
FEATURE_EXCEPT = False
97104
continue
98105

106+
current += 1
107+
progress.setPercentage(int(current * total))
99108

100109
del writer
110+
101111
if not GEOS_EXCEPT:
102112
SextanteLog.addToLog(SextanteLog.LOG_WARNING, "Geometry exception while computing difference")
103113
if not FEATURE_EXCEPT:
104114
SextanteLog.addToLog(SextanteLog.LOG_WARNING, "Feature exception while computing difference")
105-
106-
def defineCharacteristics(self):
107-
self.name = "Difference"
108-
self.group = "Vector overlay tools"
109-
self.addParameter(ParameterVector(Difference.INPUT, "Input layer", ParameterVector.VECTOR_TYPE_ANY))
110-
self.addParameter(ParameterVector(Difference.INPUT2, "Difference layer", ParameterVector.VECTOR_TYPE_ANY))
111-
self.addOutput(OutputVector(Difference.OUTPUT, "Difference"))

0 commit comments

Comments
 (0)
Please sign in to comment.