|
22 | 22 | # This will get replaced with a git SHA1 when you do a git archive
|
23 | 23 | __revision__ = '$Format:%H$'
|
24 | 24 |
|
25 |
| - |
26 | 25 | from PyQt4.QtCore import *
|
27 |
| -from PyQt4.QtGui import * |
| 26 | + |
28 | 27 | from qgis.core import *
|
29 |
| -from sextante.parameters.ParameterVector import ParameterVector |
| 28 | + |
30 | 29 | from sextante.core.QGisLayers import QGisLayers
|
31 |
| -from sextante.outputs.OutputVector import OutputVector |
32 |
| -from sextante.algs.ftools import FToolsUtils as utils |
33 | 30 | from sextante.core.SextanteLog import SextanteLog
|
34 | 31 | from sextante.core.GeoAlgorithm import GeoAlgorithm
|
35 | 32 |
|
| 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 |
36 | 38 |
|
37 | 39 | class Difference(GeoAlgorithm):
|
38 | 40 |
|
39 | 41 | INPUT = "INPUT"
|
40 |
| - INPUT2 = "INPUT2" |
| 42 | + OVERLAY = "OVERLAY" |
41 | 43 | OUTPUT = "OUTPUT"
|
42 | 44 |
|
43 | 45 | #===========================================================================
|
44 | 46 | # def getIcon(self):
|
45 | 47 | # return QtGui.QIcon(os.path.dirname(__file__) + "/icons/difference.png")
|
46 | 48 | #===========================================================================
|
47 | 49 |
|
| 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 | + |
48 | 57 | 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 | + |
51 | 61 | GEOS_EXCEPT = True
|
| 62 | + |
52 | 63 | 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 | + |
65 | 68 | inFeatA = QgsFeature()
|
66 | 69 | inFeatB = QgsFeature()
|
67 | 70 | 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 | + |
72 | 79 | for inFeatA in selectionA:
|
73 |
| - nElement += 1 |
74 |
| - progress.setPercentage(nElement/float(nFeat) * 100) |
75 | 80 | 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()) |
83 | 89 | 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)) |
86 | 92 | except:
|
87 | 93 | GEOS_EXCEPT = False
|
88 | 94 | add = False
|
89 | 95 | break
|
| 96 | + |
90 | 97 | if add:
|
91 | 98 | 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) |
95 | 102 | except:
|
96 | 103 | FEATURE_EXCEPT = False
|
97 | 104 | continue
|
98 | 105 |
|
| 106 | + current += 1 |
| 107 | + progress.setPercentage(int(current * total)) |
99 | 108 |
|
100 | 109 | del writer
|
| 110 | + |
101 | 111 | if not GEOS_EXCEPT:
|
102 | 112 | SextanteLog.addToLog(SextanteLog.LOG_WARNING, "Geometry exception while computing difference")
|
103 | 113 | if not FEATURE_EXCEPT:
|
104 | 114 | 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