Skip to content

Commit c80371a

Browse files
author
volayaf
committed
added explode and multi to single part algorithms
added lastools for linux added FUSION filterdata algorihtm changed r installation method git-svn-id: http://sextante.googlecode.com/svn/trunk/soft/bindings/qgis-plugin@171 881b9c09-3ef8-f3c2-ec3d-21d735c97f4d
1 parent 3107d16 commit c80371a

19 files changed

+250
-20
lines changed

src/sextante/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ def name():
55
def description():
66
return "SEXTANTE Geoprocessing platform for QGIS"
77
def version():
8-
return "Version 1.0.4"
8+
return "Version 1.0.5"
99
def icon():
1010
return "icon.png"
1111
def qgisMinimumVersion():

src/sextante/algs/Explode.py

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
from sextante.core.GeoAlgorithm import GeoAlgorithm
2+
import os.path
3+
from PyQt4 import QtGui
4+
from PyQt4.QtCore import *
5+
from PyQt4.QtGui import *
6+
from qgis.core import *
7+
from sextante.parameters.ParameterVector import ParameterVector
8+
from sextante.core.QGisLayers import QGisLayers
9+
from sextante.outputs.OutputVector import OutputVector
10+
11+
class Explode(GeoAlgorithm):
12+
13+
INPUT = "INPUT"
14+
OUTPUT = "OUTPUT"
15+
16+
def getIcon(self):
17+
return QtGui.QIcon(os.path.dirname(__file__) + "/../images/toolbox.png")
18+
19+
def processAlgorithm(self, progress):
20+
settings = QSettings()
21+
systemEncoding = settings.value( "/UI/encoding", "System" ).toString()
22+
vlayer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT))
23+
output = self.getOutputValue(self.OUTPUT)
24+
vprovider = vlayer.dataProvider()
25+
allAttrs = vprovider.attributeIndexes()
26+
vprovider.select( allAttrs )
27+
fields = vprovider.fields()
28+
writer = QgsVectorFileWriter( output, systemEncoding,
29+
fields, QGis.WKBLineString, vprovider.crs() )
30+
inFeat = QgsFeature()
31+
outFeat = QgsFeature()
32+
inGeom = QgsGeometry()
33+
nFeat = vprovider.featureCount()
34+
nElement = 0
35+
while vprovider.nextFeature( inFeat ):
36+
nElement += 1
37+
progress.setPercentage((nElement*100)/nFeat)
38+
inGeom = inFeat.geometry()
39+
atMap = inFeat.attributeMap()
40+
segments = self.extractAsSingleSegments( inGeom )
41+
outFeat.setAttributeMap( atMap )
42+
for segment in segments:
43+
outFeat.setGeometry(segment)
44+
writer.addFeature(outFeat)
45+
del writer
46+
47+
48+
def extractAsSingleSegments( self, geom ):
49+
segments = []
50+
if geom.isMultipart():
51+
multi = geom.asMultiPolyline()
52+
for polyline in multi:
53+
segments.extend( self.getPolylineAsSingleSegments(polyline))
54+
else:
55+
segments.extend( self.getPolylineAsSingleSegments(geom.asPolyline()))
56+
return segments
57+
58+
def getPolylineAsSingleSegments(self, polyline):
59+
segments = []
60+
for i in range(len(polyline)-1):
61+
ptA = polyline[i]
62+
ptB = polyline[i+1]
63+
segment = QgsGeometry.fromPolyline([ptA, ptB])
64+
segments.append(segment)
65+
return segments
66+
67+
def defineCharacteristics(self):
68+
self.name = "Explode lines"
69+
self.group = "Algorithms for vector layers"
70+
self.addParameter(ParameterVector(self.INPUT, "Input layer",ParameterVector.VECTOR_TYPE_LINE))
71+
self.addOutput(OutputVector(self.OUTPUT, "Output layer"))
72+

src/sextante/algs/FieldsCalculator.py

-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from PyQt4.QtCore import *
66
from PyQt4.QtGui import *
77
from sextante.parameters.ParameterString import ParameterString
8-
from sextante.parameters.ParameterSelection import ParameterSelection
98
from sextante.core.QGisLayers import QGisLayers
109
import os
1110
from PyQt4 import QtGui

src/sextante/algs/SextanteAlgorithmProvider.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@
44
import os
55
from sextante.algs.FieldsCalculator import FieldsCalculator
66
from sextante.algs.SaveSelectedFeatures import SaveSelectedFeatures
7+
from sextante.algs.Explode import Explode
78

89
class SextanteAlgorithmProvider(AlgorithmProvider):
910

1011
def __init__(self):
1112
AlgorithmProvider.__init__(self)
12-
self.alglist = [AddTableField(), FieldsCalculator(), SaveSelectedFeatures()]
13+
self.alglist = [AddTableField(), FieldsCalculator(), SaveSelectedFeatures(), Explode()]
1314

1415
def initializeSettings(self):
1516
AlgorithmProvider.initializeSettings(self)

src/sextante/core/Sextante.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,8 @@ def initialize():
8686
Sextante.addProvider(FToolsAlgorithmProvider())
8787
Sextante.addProvider(ModelerOnlyAlgorithmProvider())
8888
Sextante.addProvider(GdalAlgorithmProvider())
89+
Sextante.addProvider(LasToolsAlgorithmProvider())
8990
if SextanteUtils.isWindows():
90-
Sextante.addProvider(LasToolsAlgorithmProvider())
9191
Sextante.addProvider(FusionAlgorithmProvider())
9292
Sextante.addProvider(OTBAlgorithmProvider())
9393
Sextante.addProvider(RAlgorithmProvider())

src/sextante/ftools/FToolsAlgorithmProvider.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
from sextante.ftools.RandomSelection import RandomSelection
3030
from sextante.ftools.SelectByLocation import SelectByLocation
3131
from sextante.ftools.RandomSelectionWithinSubsets import RandomSelectionWithinSubsets
32+
from sextante.ftools.MultipartToSingleparts import MultipartTosingleparts
3233

3334
class FToolsAlgorithmProvider(AlgorithmProvider):
3435

@@ -41,7 +42,8 @@ def __init__(self):
4142
NearestNeighbourAnalysis(), MeanCoords(), LinesIntersection(),
4243
ConvexHull(), FixedDistanceBuffer(), VariableDistanceBuffer(),
4344
Dissolve(), Difference(), Intersection(), Union(), Clip(), ExtentFromLayer(),
44-
RandomSelection(), RandomSelectionWithinSubsets(), SelectByLocation()]
45+
RandomSelection(), RandomSelectionWithinSubsets(), SelectByLocation(),
46+
MultipartTosingleparts()]
4547

4648
def getDescription(self):
4749
return "fTools (Vector analysis)"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
from sextante.core.GeoAlgorithm import GeoAlgorithm
2+
import os.path
3+
from PyQt4 import QtGui
4+
from PyQt4.QtCore import *
5+
from PyQt4.QtGui import *
6+
from qgis.core import *
7+
from sextante.parameters.ParameterVector import ParameterVector
8+
from sextante.core.QGisLayers import QGisLayers
9+
from sextante.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
10+
from sextante.outputs.OutputVector import OutputVector
11+
12+
class MultipartTosingleparts(GeoAlgorithm):
13+
14+
INPUT = "INPUT"
15+
OUTPUT = "OUTPUT"
16+
17+
def getIcon(self):
18+
return QtGui.QIcon(os.path.dirname(__file__) + "/icons/multi_to_single.png")
19+
20+
def processAlgorithm(self, progress):
21+
settings = QSettings()
22+
systemEncoding = settings.value( "/UI/encoding", "System" ).toString()
23+
vlayer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT))
24+
output = self.getOutputValue(self.OUTPUT)
25+
vprovider = vlayer.dataProvider()
26+
allAttrs = vprovider.attributeIndexes()
27+
vprovider.select( allAttrs )
28+
fields = vprovider.fields()
29+
geomType = self.multiToSingleGeom(vprovider.geometryType())
30+
writer = QgsVectorFileWriter( output, systemEncoding,
31+
fields, geomType, vprovider.crs() )
32+
inFeat = QgsFeature()
33+
outFeat = QgsFeature()
34+
inGeom = QgsGeometry()
35+
nFeat = vprovider.featureCount()
36+
nElement = 0
37+
while vprovider.nextFeature( inFeat ):
38+
nElement += 1
39+
progress.setPercentage((nElement*100)/nFeat)
40+
inGeom = inFeat.geometry()
41+
atMap = inFeat.attributeMap()
42+
featList = self.extractAsSingle( inGeom )
43+
outFeat.setAttributeMap( atMap )
44+
for i in featList:
45+
outFeat.setGeometry( i )
46+
writer.addFeature( outFeat )
47+
del writer
48+
49+
50+
def multiToSingleGeom(self, wkbType):
51+
try:
52+
if wkbType in (QGis.WKBPoint, QGis.WKBMultiPoint,
53+
QGis.WKBPoint25D, QGis.WKBMultiPoint25D):
54+
return QGis.WKBPoint
55+
elif wkbType in (QGis.WKBLineString, QGis.WKBMultiLineString,
56+
QGis.WKBMultiLineString25D, QGis.WKBLineString25D):
57+
return QGis.WKBLineString
58+
elif wkbType in (QGis.WKBPolygon, QGis.WKBMultiPolygon,
59+
QGis.WKBMultiPolygon25D, QGis.WKBPolygon25D):
60+
return QGis.WKBPolygon
61+
else:
62+
return QGis.WKBUnknown
63+
except Exception, err:
64+
raise GeoAlgorithmExecutionException(str(err))
65+
66+
67+
def extractAsSingle( self, geom ):
68+
multi_geom = QgsGeometry()
69+
temp_geom = []
70+
if geom.type() == 0:
71+
if geom.isMultipart():
72+
multi_geom = geom.asMultiPoint()
73+
for i in multi_geom:
74+
temp_geom.append( QgsGeometry().fromPoint ( i ) )
75+
else:
76+
temp_geom.append( geom )
77+
elif geom.type() == 1:
78+
if geom.isMultipart():
79+
multi_geom = geom.asMultiPolyline()
80+
for i in multi_geom:
81+
temp_geom.append( QgsGeometry().fromPolyline( i ) )
82+
else:
83+
temp_geom.append( geom )
84+
elif geom.type() == 2:
85+
if geom.isMultipart():
86+
multi_geom = geom.asMultiPolygon()
87+
for i in multi_geom:
88+
temp_geom.append( QgsGeometry().fromPolygon( i ) )
89+
else:
90+
temp_geom.append( geom )
91+
return temp_geom
92+
93+
94+
def defineCharacteristics(self):
95+
self.name = "Multipart to singleparts"
96+
self.group = "Geometry tools"
97+
self.addParameter(ParameterVector(self.INPUT, "Input layer"))
98+
self.addOutput(OutputVector(self.OUTPUT, "Output layer"))
99+

src/sextante/ftools/SinglePartsToMultiparts.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ def singleToMultiGeom(self, wkbType):
8686
print str(err)
8787

8888
def defineCharacteristics(self):
89-
self.name = "Singleparts to multi parts"
89+
self.name = "Singleparts to multipart"
9090
self.group = "Geometry tools"
9191
self.addParameter(ParameterVector(SinglePartsToMultiparts.INPUT, "Input layer"))
9292
self.addParameter(ParameterTableField(SinglePartsToMultiparts.FIELD,

src/sextante/fusion/ClipData.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import os
22
from sextante.parameters.ParameterFile import ParameterFile
3-
from sextante.core.GeoAlgorithm import GeoAlgorithm
43
from sextante.fusion.FusionUtils import FusionUtils
54
from PyQt4 import QtGui
65
import subprocess
@@ -27,7 +26,7 @@ def defineCharacteristics(self):
2726
self.addAdvancedModifiers()
2827

2928
def processAlgorithm(self, progress):
30-
commands = [os.path.join(FusionUtils.FusionPath(), "ClipData.exe")]
29+
commands = [os.path.join(FusionUtils.FusionPath(), "FilterData.exe")]
3130
commands.append("/verbose")
3231
self.addAdvancedModifiersToCommand(commands)
3332
commands.append("/shape:" + str(self.getParameterValue(self.SHAPE)))
@@ -37,7 +36,7 @@ def processAlgorithm(self, progress):
3736
else:
3837
FusionUtils.createFileList(files)
3938
commands.append(FusionUtils.tempFileListFilepath())
40-
outFile = self.getOutputValue(self.OUTPUT)
39+
outFile = self.getOutputValue(self.OUTPUT) + ".lda"
4140
commands.append(outFile)
4241
extent = str(self.getParameterValue(self.EXTENT)).split(",")
4342
commands.append(extent[0])

src/sextante/fusion/DensityMetrics.py

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
'''
2+
Created on 07/05/2012
3+
4+
@author: Volaya
5+
'''

src/sextante/fusion/FilterData.py

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import os
2+
from sextante.parameters.ParameterFile import ParameterFile
3+
from sextante.fusion.FusionUtils import FusionUtils
4+
from PyQt4 import QtGui
5+
import subprocess
6+
from sextante.outputs.OutputFile import OutputFile
7+
from sextante.fusion.FusionAlgorithm import FusionAlgorithm
8+
from sextante.parameters.ParameterNumber import ParameterNumber
9+
10+
class FilterData(FusionAlgorithm):
11+
12+
INPUT = "INPUT"
13+
OUTPUT = "OUTPUT"
14+
VALUE = "VALUE"
15+
SHAPE = "SHAPE"
16+
WINDOWSIZE = "WINDOWSIZE"
17+
18+
19+
def defineCharacteristics(self):
20+
self.name = "Filter Data outliers"
21+
self.group = "Points"
22+
self.addParameter(ParameterFile(self.INPUT, "Input las layer"))
23+
self.addParameter(ParameterNumber(self.VALUE, "Standard Deviation multiplier"))
24+
self.addParameter(ParameterNumber(self.VALUE, "Window size", None, None, 10))
25+
self.addOutput(OutputFile(self.OUTPUT, "Output filtered las file"))
26+
self.addAdvancedModifiers()
27+
28+
def processAlgorithm(self, progress):
29+
commands = [os.path.join(FusionUtils.FusionPath(), "FilterData.exe")]
30+
commands.append("/verbose")
31+
self.addAdvancedModifiersToCommand(commands)
32+
commands.append("outlier")
33+
commands.append(self.getParameterValue(self.VALUE))
34+
commands.append(self.getParameterValue(self.WINDOWSIZE))
35+
outFile = self.getOutputValue(self.OUTPUT) + ".lda"
36+
commands.append(outFile)
37+
files = self.getParameterValue(self.INPUT).split(";")
38+
if len(files) == 1:
39+
commands.append(self.getParameterValue(self.INPUT))
40+
else:
41+
FusionUtils.createFileList(files)
42+
commands.append(FusionUtils.tempFileListFilepath())
43+
FusionUtils.runFusion(commands, progress)
44+
commands = [os.path.join(FusionUtils.FusionPath(), "LDA2LAS.exe")]
45+
commands.append(outFile)
46+
commands.append(self.getOutputValue(self.OUTPUT))
47+
p = subprocess.Popen(commands, shell=True)
48+
p.wait()

src/sextante/fusion/FusionAlgorithmProvider.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,15 @@
1010
from sextante.fusion.CanopyModel import CanopyModel
1111
from sextante.fusion.ClipData import ClipData
1212
from sextante.fusion.Cover import Cover
13+
from sextante.fusion.FilterData import FilterData
1314

1415

1516
class FusionAlgorithmProvider(AlgorithmProvider):
1617

1718
def __init__(self):
1819
AlgorithmProvider.__init__(self)
1920
self.actions.append(OpenViewerAction())
20-
self.algsList = [CloudMetrics(), CanopyMaxima(), CanopyModel(), ClipData(), Cover()]
21+
self.algsList = [CloudMetrics(), CanopyMaxima(), CanopyModel(), ClipData(), Cover(), FilterData()]
2122

2223
def initializeSettings(self):
2324
AlgorithmProvider.initializeSettings(self)

src/sextante/grass/GrassAlgorithmProvider.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,9 @@ def createAlgsList(self):
5555
self.preloadedAlgs.append(alg)
5656
else:
5757
SextanteLog.addToLog(SextanteLog.LOG_ERROR, "Could not open GRASS algorithm: " + descriptionFile)
58-
except Exception,e:
58+
except Exception:
5959
SextanteLog.addToLog(SextanteLog.LOG_ERROR, "Could not open GRASS algorithm: " + descriptionFile)
60-
self.preloadedAlgs.append(nviz())
60+
#self.preloadedAlgs.append(nviz())
6161
#self.createDescriptionFiles()
6262

6363
def _loadAlgorithms(self):
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
v.surf.idw
22
v.surf.idw
33
Vector (v.*)
4-
ParameterVector|input|input|-1|False
4+
ParameterVector|input|input|0|False
55
ParameterNumber|npoints|npoints|None|None|12
66
ParameterNumber|power|power|None|None|2.0
7-
ParameterNumber|layer|layer|None|None|1
87
ParameterTableField|column|column|input
98
ParameterBoolean|-n|-n|True
109
OutputRaster|output|output

src/sextante/lastools/LasToolsAlgorithmProvider.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,18 @@
1616
from sextante.lastools.lassplit import lassplit
1717
from sextante.lastools.lasclassify import lasclassify
1818
from sextante.lastools.lasclip import lasclip
19+
from sextante.core.SextanteUtils import SextanteUtils
1920

2021

2122
class LasToolsAlgorithmProvider(AlgorithmProvider):
2223

2324
def __init__(self):
2425
AlgorithmProvider.__init__(self)
25-
self.algsList = [las2shp(), lasboundary(), las2dem(), las2iso(), lasgrid(), lasground(),
26+
if SextanteUtils.isWindows():
27+
self.algsList = [las2shp(), lasboundary(), las2dem(), las2iso(), lasgrid(), lasground(),
2628
lasinfo(), lasheight(), lasprecision(), lassplit(), lasclassify(), lasclip()]
29+
else:
30+
self.algsList = [lasinfo(), lasprecision()]
2731

2832
def initializeSettings(self):
2933
AlgorithmProvider.initializeSettings(self)

src/sextante/lastools/LasToolsUtils.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ def LasToolsPath():
2020
def runLasTools(commands, progress):
2121
loglines = []
2222
loglines.append("LasTools execution console output")
23-
proc = subprocess.Popen(commands, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE,stderr=subprocess.STDOUT, universal_newlines=False).stdout
23+
commandline = " ".join(commands)
24+
proc = subprocess.Popen(commandline, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE,stderr=subprocess.STDOUT, universal_newlines=False).stdout
2425
for line in iter(proc.readline, ""):
2526
loglines.append(line)
2627
SextanteLog.addToLog(SextanteLog.LOG_INFO, loglines)

0 commit comments

Comments
 (0)