8 changes: 4 additions & 4 deletions python/plugins/sextante/algs/ftools/Centroids.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
__author__ = 'Victor Olaya'
__date__ = 'August 2012'
__copyright__ = '(C) 2012, Victor Olaya'
# This will get replaced with a git SHA1 when you do a git archive
# This will get replaced with a git SHA1 when you do a git archive323
__revision__ = '$Format:%H$'

from PyQt4.QtCore import *
Expand Down Expand Up @@ -58,7 +58,7 @@ def processAlgorithm(self, progress):
writer = self.getOutputFromName(self.OUTPUT_LAYER).getVectorWriter(layer.pendingFields(),
QGis.WKBPoint, layer.dataProvider().crs())

layer.select(layer.pendingAllAttributesList())
#layer.select(layer.pendingAllAttributesList())

outFeat = QgsFeature()

Expand All @@ -68,14 +68,14 @@ def processAlgorithm(self, progress):

for inFeat in features:
inGeom = inFeat.geometry()
attrMap = inFeat.attributeMap()
attrs = inFeat.attributes()

outGeom = QgsGeometry(inGeom.centroid())
if outGeom is None:
raise GeoAlgorithmExecutionException("Error calculating centroid")

outFeat.setGeometry(outGeom)
outFeat.setAttributeMap(attrMap)
outFeat.setAttributes(attrs)
writer.addFeature(outFeat)
current += 1
progress.setPercentage(int(current * total))
Expand Down
96 changes: 48 additions & 48 deletions python/plugins/sextante/algs/ftools/Clip.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
from sextante.parameters.ParameterVector import ParameterVector
from sextante.core.QGisLayers import QGisLayers
from sextante.outputs.OutputVector import OutputVector
from sextante.algs.ftools import ftools_utils
from sextante.algs.ftools import FToolsUtils as utils
from sextante.core.SextanteLog import SextanteLog

class Clip(GeoAlgorithm):
Expand All @@ -53,11 +53,12 @@ def processAlgorithm(self, progress):
GEOS_EXCEPT = True
FEATURE_EXCEPT = True
vproviderA = vlayerA.dataProvider()
allAttrsA = vproviderA.attributeIndexes()
vproviderA.select( allAttrsA )
#allAttrsA = vproviderA.attributeIndexes()
#vproviderA.select( allAttrsA )
vproviderB = vlayerB.dataProvider()
allAttrsB = vproviderB.attributeIndexes()
vproviderB.select( allAttrsB )
#allAttrsB = vproviderB.attributeIndexes()
#vproviderB.select( allAttrsB )

# check for crs compatibility
crsA = vproviderA.crs()
crsB = vproviderB.crs()
Expand All @@ -72,55 +73,54 @@ def processAlgorithm(self, progress):
inFeatA = QgsFeature()
inFeatB = QgsFeature()
outFeat = QgsFeature()
index = ftools_utils.createIndex(QGisLayers.features(vlayerB))
vproviderA.rewind()
index = utils.createSpatialIndex(vlayerB)
#vproviderA.rewind()
nElement = 0
selectionA = QGisLayers.features(vlayerA)
nFeat = len(selectionA)
for inFeatA in selectionA:
nElement += 1
progress.setPercentage(nElement/float(nFeat) * 100)
geom = QgsGeometry( inFeatA.geometry() )
int_geom = QgsGeometry( geom )
atMap = inFeatA.attributeMap()
intersects = index.intersects( geom.boundingBox() )
found = False
first = True
for id in intersects:
vproviderB.featureAtId( int( id ), inFeatB , True, allAttrsB )
tmpGeom = QgsGeometry( inFeatB.geometry() )
if tmpGeom.intersects( geom ):
found = True
if first:
outFeat.setGeometry( QgsGeometry( tmpGeom ) )
first = False
else:
try:
nElement += 1
progress.setPercentage(nElement/float(nFeat) * 100)
geom = QgsGeometry( inFeatA.geometry() )
int_geom = QgsGeometry( geom )
atMap = inFeatA.attributes()
intersects = index.intersects(geom.boundingBox())
found = False
first = True
for id in intersects:
vlayerB.featureAtId(int(id), inFeatB)
tmpGeom = QgsGeometry(inFeatB.geometry())
if tmpGeom.intersects(geom):
found = True
if first:
outFeat.setGeometry(QgsGeometry(tmpGeom))
first = False
else:
try:
cur_geom = QgsGeometry( outFeat.geometry() )
new_geom = QgsGeometry( cur_geom.combine( tmpGeom ) )
outFeat.setGeometry( QgsGeometry( new_geom ) )
except:
GEOS_EXCEPT = False
break
if found:
try:
cur_geom = QgsGeometry( outFeat.geometry() )
new_geom = QgsGeometry( cur_geom.combine( tmpGeom ) )
outFeat.setGeometry( QgsGeometry( new_geom ) )
except:
new_geom = QgsGeometry( geom.intersection( cur_geom ) )
if new_geom.wkbType() == 7:
int_com = QgsGeometry( geom.combine( cur_geom ) )
int_sym = QgsGeometry( geom.symDifference( cur_geom ) )
new_geom = QgsGeometry( int_com.difference( int_sym ) )
try:
outFeat.setGeometry( new_geom )
outFeat.setAttributes( atMap )
writer.addFeature( outFeat )
except:
FEATURE_EXCEPT = False
continue
except:
GEOS_EXCEPT = False
break
if found:
try:
cur_geom = QgsGeometry( outFeat.geometry() )
new_geom = QgsGeometry( geom.intersection( cur_geom ) )
if new_geom.wkbType() == 7:
int_com = QgsGeometry( geom.combine( cur_geom ) )
int_sym = QgsGeometry( geom.symDifference( cur_geom ) )
new_geom = QgsGeometry( int_com.difference( int_sym ) )
try:
outFeat.setGeometry( new_geom )
outFeat.setAttributeMap( atMap )
writer.addFeature( outFeat )
except:
FEAT_EXCEPT = False
continue
except:
GEOS_EXCEPT = False
continue

continue

if not GEOS_EXCEPT:
SextanteLog.addToLog(SextanteLog.LOG_WARNING, "Geometry exception while computing clip")
Expand Down
28 changes: 16 additions & 12 deletions python/plugins/sextante/algs/ftools/ConvexHull.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
from sextante.parameters.ParameterVector import ParameterVector
from sextante.core.QGisLayers import QGisLayers
from sextante.outputs.OutputVector import OutputVector
from sextante.algs.ftools import ftools_utils
from sextante.algs.ftools import FToolsUtils as utils
from sextante.core.SextanteLog import SextanteLog
from sextante.parameters.ParameterTableField import ParameterTableField
from sextante.parameters.ParameterSelection import ParameterSelection
Expand All @@ -55,11 +55,11 @@ def processAlgorithm(self, progress):
GEOS_EXCEPT = True
FEATURE_EXCEPT = True
vproviderA = vlayerA.dataProvider()
allAttrsA = vproviderA.attributeIndexes()
vproviderA.select(allAttrsA)
fields = { 0 : QgsField("ID", QVariant.Int),
1 : QgsField("Area", QVariant.Double),
2 : QgsField("Perim", QVariant.Double) }
#allAttrsA = vproviderA.attributeIndexes()
#vproviderA.select(allAttrsA)
fields = [QgsField("ID", QVariant.Int),
QgsField("Area", QVariant.Double),
QgsField("Perim", QVariant.Double)]
writer = self.getOutputFromName(ConvexHull.OUTPUT).getVectorWriter(fields, QGis.WKBPolygon, vproviderA.crs())
inFeat = QgsFeature()
outFeat = QgsFeature()
Expand All @@ -72,23 +72,23 @@ def processAlgorithm(self, progress):
nFeat = len(features)

if useField:
unique = ftools_utils.getUniqueValues(vproviderA, index)
unique = utils.getUniqueValues(vproviderA, index)
nFeat = nFeat * len(unique)
for i in unique:
hull = []
first = True
outID = 0
vproviderA.select(allAttrsA)
#vproviderA.select(allAttrsA)
features = QGisLayers.features(vlayerA)
for inFeat in features:
atMap = inFeat.attributeMap()
atMap = inFeat.attributes()
idVar = atMap[ index ]
if idVar.toString().trimmed() == i.toString().trimmed():
if first:
outID = idVar
first = False
inGeom = QgsGeometry(inFeat.geometry())
points = ftools_utils.extractPoints(inGeom)
points = utils.extractPoints(inGeom)
hull.extend(points)
nElement += 1
progress.setPercentage(int(nElement / nFeat * 100))
Expand All @@ -107,18 +107,22 @@ def processAlgorithm(self, progress):
continue
else:
hull = []
vproviderA.select(allAttrsA)
#vproviderA.select(allAttrsA)
features = QGisLayers.features(vlayerA)
for inFeat in features:
inGeom = QgsGeometry(inFeat.geometry())
points = ftools_utils.extractPoints(inGeom)
points = utils.extractPoints(inGeom)
hull.extend(points)
nElement += 1
progress.setPercentage(int(nElement / nFeat * 100))
tmpGeom = QgsGeometry(outGeom.fromMultiPoint(hull))
try:
outGeom = tmpGeom.convexHull()
outFeat.setGeometry(outGeom)
(area, perim) = self.simpleMeasure(outGeom)
#outFeat.addAttribute(0, QVariant("1"))
#outFeat.addAttribute(1, QVariant(area))
#outFeat.addAttribute(2, QVariant(perim))
writer.addFeature(outFeat)
except:
GEOS_EXCEPT = False
Expand Down
21 changes: 10 additions & 11 deletions python/plugins/sextante/algs/ftools/Delaunay.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,17 +55,15 @@ def defineCharacteristics(self):

def processAlgorithm(self, progress):
layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT))


provider = layer.dataProvider()
provider.select()

fields = {0 : QgsField("POINTA", QVariant.Double, "", 24, 15),
1 : QgsField("POINTB", QVariant.Double, "", 24, 15),
2 : QgsField("POINTC", QVariant.Double, "", 24, 15)
}
fields = [ QgsField("POINTA", QVariant.Double, "", 24, 15),
QgsField("POINTB", QVariant.Double, "", 24, 15),
QgsField("POINTC", QVariant.Double, "", 24, 15)
]

writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields,
QGis.WKBPolygon, provider.crs())
QGis.WKBPolygon, layer.dataProvider().crs())

pts = []
ptDict = {}
Expand Down Expand Up @@ -99,16 +97,17 @@ def processAlgorithm(self, progress):
indicies = list(triangle)
indicies.append(indicies[0])
polygon = []
attrs = []
step = 0
for index in indicies:
provider.featureAtId(ptDict[ids[index]], inFeat, True)
layer.featureAtId(ptDict[ids[index]], inFeat, True)
geom = QgsGeometry(inFeat.geometry())
point = QgsPoint(geom.asPoint())
polygon.append(point)
if step <= 3:
feat.addAttribute(step, QVariant(ids[index]))
attrs.append(QVariant(ids[index]))
step += 1

feat.setAttributes(attrs)
geometry = QgsGeometry().fromPolygon([polygon])
feat.setGeometry(geometry)
writer.addFeature(feat)
Expand Down
10 changes: 3 additions & 7 deletions python/plugins/sextante/algs/ftools/DensifyGeometries.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@

from sextante.parameters.ParameterVector import ParameterVector
from sextante.parameters.ParameterNumber import ParameterNumber
from sextante.parameters.ParameterBoolean import ParameterBoolean

from sextante.outputs.OutputVector import OutputVector

Expand Down Expand Up @@ -61,22 +60,19 @@ def processAlgorithm(self, progress):

isPolygon = layer.geometryType() == QGis.Polygon

provider = layer.dataProvider()
layer.select(layer.pendingAllAttributesList())

writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.pendingFields(),
layer.wkbType(), provider.crs())
layer.wkbType(), layer.crs())

features = QGisLayers.features(layer)
total = 100.0 / float(len(features))
current = 0
for f in features:
featGeometry = QgsGeometry(f.geometry())
attrMap = f.attributeMap()
attrMap = f.attributes()
newGeometry = self.densifyGeometry(featGeometry, int(vertices), isPolygon)
feature = QgsFeature()
feature.setGeometry(newGeometry)
feature.setAttributeMap(attrMap)
feature.setAttributes(attrMap)
writer.addFeature(feature)
current += 1
progress.setPercentage(int(current * total))
Expand Down
12 changes: 4 additions & 8 deletions python/plugins/sextante/algs/ftools/DensifyGeometriesInterval.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,26 +56,22 @@ def processAlgorithm(self, progress):
layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT))
interval = self.getParameterValue(self.INTERVAL)

isPolygon = layer.geometryType() == QGis.Polygon

provider = layer.dataProvider()
layer.select(layer.pendingAllAttributesList())
isPolygon = layer.geometryType() == QGis.Polygon

writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.pendingFields(),
layer.wkbType(), provider.crs())
layer.wkbType(), layer.crs())


features = QGisLayers.features(layer)
total = 100.0 / float(len(features))
current = 0
for f in features:
featGeometry = QgsGeometry(f.geometry())
attrMap = f.attributeMap()
attrMap = f.attributes()
newGeometry = self.densifyGeometry(featGeometry, interval, isPolygon)

feature = QgsFeature()
feature.setGeometry(newGeometry)
feature.setAttributeMap(attrMap)
feature.setAttributes(attrMap)
writer.addFeature(feature)

current += 1
Expand Down
17 changes: 6 additions & 11 deletions python/plugins/sextante/algs/ftools/Difference.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,8 @@
from sextante.parameters.ParameterVector import ParameterVector
from sextante.core.QGisLayers import QGisLayers
from sextante.outputs.OutputVector import OutputVector
from sextante.algs.ftools import ftools_utils
from sextante.algs.ftools import FToolsUtils as utils
from sextante.core.SextanteLog import SextanteLog
from sextante.core.SextanteConfig import SextanteConfig
from sextante.core.GeoAlgorithm import GeoAlgorithm


Expand All @@ -52,11 +51,7 @@ def processAlgorithm(self, progress):
GEOS_EXCEPT = True
FEATURE_EXCEPT = True
vproviderA = vlayerA.dataProvider()
allAttrsA = vproviderA.attributeIndexes()
vproviderA.select( allAttrsA )
vproviderB = vlayerB.dataProvider()
allAttrsB = vproviderB.attributeIndexes()
vproviderB.select( allAttrsB )
vproviderB = vlayerB.dataProvider()
fields = vproviderA.fields()
# check for crs compatibility
crsA = vproviderA.crs()
Expand All @@ -70,7 +65,7 @@ def processAlgorithm(self, progress):
inFeatA = QgsFeature()
inFeatB = QgsFeature()
outFeat = QgsFeature()
index = ftools_utils.createIndex( QGisLayers.features(vlayerB) )
index = utils.createSpatialIndex(vlayerB)
nElement = 0
selectionA = QGisLayers.features(vlayerA)
nFeat = len(selectionA)
Expand All @@ -80,10 +75,10 @@ def processAlgorithm(self, progress):
add = True
geom = QgsGeometry( inFeatA.geometry() )
diff_geom = QgsGeometry( geom )
atMap = inFeatA.attributeMap()
atMap = inFeatA.attributes()
intersects = index.intersects( geom.boundingBox() )
for id in intersects:
vproviderB.featureAtId( int( id ), inFeatB , True, allAttrsB )
vlayerB.featureAtId( int( id ), inFeatB , True, allAttrsB )
tmpGeom = QgsGeometry( inFeatB.geometry() )
try:
if diff_geom.intersects( tmpGeom ):
Expand All @@ -95,7 +90,7 @@ def processAlgorithm(self, progress):
if add:
try:
outFeat.setGeometry( diff_geom )
outFeat.setAttributeMap( atMap )
outFeat.setAttributes( atMap )
writer.addFeature( outFeat )
except:
FEATURE_EXCEPT = False
Expand Down
25 changes: 10 additions & 15 deletions python/plugins/sextante/algs/ftools/Dissolve.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,10 @@
__revision__ = '$Format:%H$'

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.algs.ftools import FToolsUtils as utils
from sextante.parameters.ParameterVector import ParameterVector
from sextante.core.QGisLayers import QGisLayers
from sextante.outputs.OutputVector import OutputVector
Expand All @@ -52,15 +51,13 @@ def processAlgorithm(self, progress):
useField = not self.getParameterValue(Dissolve.DISSOLVE_ALL)
fieldname = self.getParameterValue(Dissolve.FIELD)
vlayerA = QGisLayers.getObjectFromUri(self.getParameterValue(Dissolve.INPUT))
field = vlayerA.dataProvider().fieldNameIndex(fieldname)
field = vlayerA.fieldNameIndex(fieldname)
GEOS_EXCEPT = True
vproviderA = vlayerA.dataProvider()
allAttrsA = vproviderA.attributeIndexes()
vproviderA = vlayerA.dataProvider()
fields = vproviderA.fields()
writer = self.getOutputFromName(Dissolve.OUTPUT).getVectorWriter(fields, vproviderA.geometryType(), vproviderA.crs() )
#inFeat = QgsFeature()
outFeat = QgsFeature()
vproviderA.rewind()
outFeat = QgsFeature()
nElement = 0
nFeat = vproviderA.featureCount()
if not useField:
Expand All @@ -70,7 +67,7 @@ def processAlgorithm(self, progress):
nElement += 1
progress.setPercentage(int(nElement/nFeat * 100))
if first:
attrs = inFeat.attributeMap()
attrs = inFeat.attributes()
tmpInGeom = QgsGeometry( inFeat.geometry() )
outFeat.setGeometry( tmpInGeom )
first = False
Expand All @@ -83,29 +80,27 @@ def processAlgorithm(self, progress):
except:
GEOS_EXCEPT = False
continue
outFeat.setAttributeMap( attrs )
outFeat.setAttributes( attrs )
writer.addFeature( outFeat )
else:
unique = vproviderA.uniqueValues( int( field ) )
unique = utils.getUniqueValues( vlayerA, int( field ) )
nFeat = nFeat * len( unique )
for item in unique:
first = True
add = True
vproviderA.select( allAttrsA )
vproviderA.rewind()
features = QGisLayers.features(vlayerA)
for inFeat in features:
nElement += 1
progress.setPercentage(int(nElement/nFeat * 100))
atMap = inFeat.attributeMap()
atMap = inFeat.attributes()
tempItem = atMap[ field ]
if tempItem.toString().trimmed() == item.toString().trimmed():
if first:
QgsGeometry( inFeat.geometry() )
tmpInGeom = QgsGeometry( inFeat.geometry() )
outFeat.setGeometry( tmpInGeom )
first = False
attrs = inFeat.attributeMap()
attrs = inFeat.attributes()
else:
tmpInGeom = QgsGeometry( inFeat.geometry() )
tmpOutGeom = QgsGeometry( outFeat.geometry() )
Expand All @@ -116,7 +111,7 @@ def processAlgorithm(self, progress):
GEOS_EXCEPT = False
add = False
if add:
outFeat.setAttributeMap( attrs )
outFeat.setAttributes( attrs )
writer.addFeature( outFeat )
del writer
if not GEOS_EXCEPT:
Expand Down
86 changes: 43 additions & 43 deletions python/plugins/sextante/algs/ftools/ExtentFromLayer.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
* *
***************************************************************************
"""
from PyQt4 import QtGui

__author__ = 'Victor Olaya'
__date__ = 'August 2012'
Expand Down Expand Up @@ -57,17 +58,17 @@ def processAlgorithm(self, progress):
layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT_LAYER))
byFeature = self.getParameterValue(self.BY_FEATURE)

fields = {0 : QgsField("MINX", QVariant.Double),
1 : QgsField("MINY", QVariant.Double),
2 : QgsField("MAXX", QVariant.Double),
3 : QgsField("MAXY", QVariant.Double),
4 : QgsField("CNTX", QVariant.Double),
5 : QgsField("CNTY", QVariant.Double),
6 : QgsField("AREA", QVariant.Double),
7 : QgsField("PERIM", QVariant.Double),
8 : QgsField("HEIGHT", QVariant.Double),
9 : QgsField("WIDTH", QVariant.Double)
}
fields = [ QgsField("MINX", QVariant.Double),
QgsField("MINY", QVariant.Double),
QgsField("MAXX", QVariant.Double),
QgsField("MAXY", QVariant.Double),
QgsField("CNTX", QVariant.Double),
QgsField("CNTY", QVariant.Double),
QgsField("AREA", QVariant.Double),
QgsField("PERIM", QVariant.Double),
QgsField("HEIGHT", QVariant.Double),
QgsField("WIDTH", QVariant.Double)
]

writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields,
QGis.WKBPolygon, layer.crs())
Expand All @@ -76,10 +77,10 @@ def processAlgorithm(self, progress):
self.featureExtent(layer, writer, progress)
else:
self.layerExtent(layer, writer, progress)

del writer

del writer

def layerExtent(self, layer, writer, progress):
def layerExtent(self, layer, writer, progress):
rect = layer.extent()
minx = rect.xMinimum()
miny = rect.yMinimum()
Expand All @@ -97,27 +98,26 @@ def layerExtent(self, layer, writer, progress):
QgsPoint(maxx, maxy),
QgsPoint(maxx, miny),
QgsPoint(minx, miny)
]

]
geometry = QgsGeometry().fromPolygon([rect])
feat = QgsFeature()
feat.setGeometry(geometry)
feat.setAttributeMap({0 : QVariant(minx),
1 : QVariant(miny),
2 : QVariant(maxx),
3 : QVariant(maxy),
4 : QVariant(cntx),
5 : QVariant(cnty),
6 : QVariant(area),
7 : QVariant(perim),
8 : QVariant(height),
9 : QVariant(width)
})
feat.setGeometry(geometry)
attrs = [QVariant(minx),
QVariant(miny),
QVariant(maxx),
QVariant(maxy),
QVariant(cntx),
QVariant(cnty),
QVariant(area),
QVariant(perim),
QVariant(height),
QVariant(width) ]
feat.setAttributes(attrs)
writer.addFeature(feat)

def featureExtent(self, layer, writer, progress):
current = 0
outFeat = QgsFeature()
feat = QgsFeature()

provider = layer.dataProvider()
provider.select()
Expand All @@ -143,19 +143,19 @@ def featureExtent(self, layer, writer, progress):
]

geometry = QgsGeometry().fromPolygon([rect])

outFeat.setGeometry(geometry)
outFeat.setAttributeMap({0 : QVariant(minx),
1 : QVariant(miny),
2 : QVariant(maxx),
3 : QVariant(maxy),
4 : QVariant(cntx),
5 : QVariant(cnty),
6 : QVariant(area),
7 : QVariant(perim),
8 : QVariant(height),
9 : QVariant(width)
})
writer.addFeature(outFeat)
feat.setGeometry(geometry)
attrs = [QVariant(minx),
QVariant(miny),
QVariant(maxx),
QVariant(maxy),
QVariant(cntx),
QVariant(cnty),
QVariant(area),
QVariant(perim),
QVariant(height),
QVariant(width) ]
feat.setAttributes(attrs)

writer.addFeature(feat)
current += 1
progress.setPercentage(int(current * total))
1 change: 0 additions & 1 deletion python/plugins/sextante/algs/ftools/ExtractNodes.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@ def processAlgorithm(self, progress):
layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT))

provider = layer.dataProvider()
layer.select(layer.pendingAllAttributesList())

writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.pendingFields(),
QGis.WKBPoint, provider.crs())
Expand Down
70 changes: 51 additions & 19 deletions python/plugins/sextante/algs/ftools/FToolsUtils.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,23 +16,18 @@
* *
***************************************************************************
"""
from sextante.core.QGisLayers import QGisLayers

__author__ = 'Carson, Farmer, Victor Olaya'
__date__ = 'September 2012'
__copyright__ = '(C) 2012, Carson Farmer, Victor Olaya'
# This will get replaced with a git SHA1 when you do a git archive
__revision__ = '$Format:%H$'

from PyQt4.QtCore import *

from sextante.core.QGisLayers import QGisLayers
from qgis.core import *

def createSpatialIndex(layer):
provider = layer.provider()
idx = QgsSpatialIndex()
provider.rewind()
provider.select()
idx = QgsSpatialIndex()
features = QGisLayers.features(layer)
for ft in features:
idx.insertFeature(ft)
Expand Down Expand Up @@ -66,13 +61,12 @@ def createUniqueFieldName(fieldName, fieldList):

def findOrCreateField(layer, fieldList, fieldName, fieldLen=24, fieldPrec=15):
idx = layer.fieldNameIndex(fieldName)
if idx == -1:
idx = len(fieldList)
if idx == max(fieldList.keys()):
idx += 1
if idx == -1:
fn = createUniqueFieldName(fieldName, fieldList)
field = QgsField(fn, QVariant.Double, "", fieldLen, fieldPrec)
fieldList[idx] = field
idx = len(fieldList)
fieldList.append(field)

return idx, fieldList

def extractPoints( geom ):
Expand Down Expand Up @@ -102,14 +96,52 @@ def extractPoints( geom ):

return points

def getUniqueValuesCount(layer, fieldIndex):
count = 0
def getUniqueValues(layer, fieldIndex):
values = []
layer.select([fieldIndex], QgsRectangle(), False)

features = QGisLayers.features(layer)
for feat in features:
if feat.attributeMap()[fieldIndex].toString() not in values:
values.append(feat.attributeMap()[fieldIndex].toString())
count += 1
return count
if feat.attributes()[fieldIndex] not in values:
values.append(feat.attributes()[fieldIndex])
return values

def getUniqueValuesCount(layer, fieldIndex):
return len(getUniqueValues(layer, fieldIndex))

# From two input field maps, create single field map
def combineVectorFields( layerA, layerB ):
fieldsA = layerA.fields()
fieldsB = layerB.fields()
fieldsB = testForUniqueness( fieldsA, fieldsB )
fieldsA.extend( fieldsB )
return fieldsA

# Check if two input field maps are unique, and resolve name issues if they aren't
def testForUniqueness( fieldList1, fieldList2 ):
changed = True
while changed:
changed = False
for i in fieldList1:
for j in fieldList2:
if j.name() == i.name():
j = createUniqueFieldNameFromName( j )
changed = True
return fieldList2

# Create a unique field name based on input field name
def createUniqueFieldNameFromName( field ):
check = field.name().right( 2 )
shortName = field.name().left( 8 )
if check.startsWith("_"):
( val, test ) = check.right( 1 ).toInt()
if test:
if val < 2:
val = 2
else:
val = val + 1
field.setName( shortName.left( len( shortName )-1 ) + unicode( val ) )
else:
field.setName( shortName + "_2" )
else:
field.setName( shortName + "_2" )
return field
33 changes: 15 additions & 18 deletions python/plugins/sextante/algs/ftools/Intersection.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,9 @@
from qgis.core import *
from sextante.parameters.ParameterVector import ParameterVector
from sextante.core.QGisLayers import QGisLayers
from sextante.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
from sextante.outputs.OutputVector import OutputVector
from sextante.algs.ftools import ftools_utils
from sextante.algs.ftools import FToolsUtils as utils
from sextante.core.SextanteLog import SextanteLog
from sextante.core.SextanteConfig import SextanteConfig

class Intersection(GeoAlgorithm):

Expand All @@ -50,12 +48,9 @@ def processAlgorithm(self, progress):
vlayerB = QGisLayers.getObjectFromUri(self.getParameterValue(Intersection.INPUT2))
GEOS_EXCEPT = True
FEATURE_EXCEPT = True
vproviderA = vlayerA.dataProvider()
allAttrsA = vproviderA.attributeIndexes()
vproviderA.select( allAttrsA )
vproviderB = vlayerB.dataProvider()
allAttrsB = vproviderB.attributeIndexes()
vproviderB.select(allAttrsB )
vproviderA = vlayerA.dataProvider()
vproviderB = vlayerB.dataProvider()

# check for crs compatibility
crsA = vproviderA.crs()
crsB = vproviderB.crs()
Expand All @@ -64,38 +59,40 @@ def processAlgorithm(self, progress):
else:
if not crsA != crsB:
SextanteLog.addToLog(SextanteLog.LOG_WARNING, "Intersection. Non-matching CRSs. Results might be unexpected")
fields = ftools_utils.combineVectorFields(vlayerA, vlayerB)
longNames = ftools_utils.checkFieldNameLength( fields )
if not longNames.isEmpty():
raise GeoAlgorithmExecutionException("Following field names are longer than 10 characters:\n" + longNames.join('\n') )
fields = utils.combineVectorFields(vlayerA, vlayerB)
#=======================================================================
# longNames = ftools_utils.checkFieldNameLength( fields )
# if not longNames.isEmpty():
# raise GeoAlgorithmExecutionException("Following field names are longer than 10 characters:\n" + longNames.join('\n') )
#=======================================================================
writer = self.getOutputFromName(Intersection.OUTPUT).getVectorWriter(fields, vproviderA.geometryType(), vproviderA.crs() )
inFeatA = QgsFeature()
inFeatB = QgsFeature()
outFeat = QgsFeature()
index = ftools_utils.createIndex(QGisLayers.features(vlayerB))
index = utils.createSpatialIndex(vlayerB)
nElement = 0
selectionA = QGisLayers.features(vlayerA)
nFeat = len(selectionA)
for inFeatA in selectionA:
nElement += 1
progress.setPercentage(nElement/float(nFeat) * 100)
geom = QgsGeometry( inFeatA.geometry() )
atMapA = inFeatA.attributeMap()
atMapA = inFeatA.attributes()
intersects = index.intersects( geom.boundingBox() )
for id in intersects:
vproviderB.featureAtId( int( id ), inFeatB , True, allAttrsB )
vlayerB.featureAtId( int( id ), inFeatB , True)
tmpGeom = QgsGeometry( inFeatB.geometry() )
try:
if geom.intersects( tmpGeom ):
atMapB = inFeatB.attributeMap()
atMapB = inFeatB.attributes()
int_geom = QgsGeometry( geom.intersection( tmpGeom ) )
if int_geom.wkbType() == 7:
int_com = geom.combine( tmpGeom )
int_sym = geom.symDifference( tmpGeom )
int_geom = QgsGeometry( int_com.difference( int_sym ) )
try:
outFeat.setGeometry( int_geom )
outFeat.setAttributeMap( atMapA.extend( atMapB ) )
outFeat.setAttributes( atMapA.extend( atMapB ) )
writer.addFeature( outFeat )
except:
FEATURE_EXCEPT = False
Expand Down
19 changes: 6 additions & 13 deletions python/plugins/sextante/algs/ftools/LinesIntersection.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,24 +67,18 @@ def processAlgorithm(self, progress):
providerA = layerA.dataProvider()
providerB = layerB.dataProvider()


idxA = layerA.fieldNameIndex(fieldA)
idxB = layerB.fieldNameIndex(fieldB)

fieldList = {0 : layerA.pendingFields()[idxA],
1 : layerB.pendingFields()[idxB]
}
fieldList = [layerA.pendingFields()[idxA],
layerB.pendingFields()[idxB]
]

writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fieldList,
QGis.WKBPoint, providerA.crs())

spatialIndex = utils.createSpatialIndex(layerB)

providerA.rewind()
layerA.select([idxA])
providerB.rewind()
layerB.select([idxB])

inFeatA = QgsFeature()
inFeatB = QgsFeature()
outFeat = QgsFeature()
Expand All @@ -110,8 +104,8 @@ def processAlgorithm(self, progress):
tmpGeom = QgsGeometry(inFeatB.geometry())

points = []
atMapA = inFeatA.attributeMap()
atMapB = inFeatB.attributeMap()
atMapA = inFeatA.attributes()
atMapB = inFeatB.attributes()

if inGeom.intersects(tmpGeom):
tempGeom = inGeom.intersection(tmpGeom)
Expand All @@ -123,8 +117,7 @@ def processAlgorithm(self, progress):

for j in points:
outFeat.setGeometry(tempGeom.fromPoint(j))
outFeat.addAttribute(0, atMapA[idxA])
outFeat.addAttribute(1, atMapB[idxB])
outFeat.setAttributes([atMapA[idxA], atMapB[idxB]])
writer.addFeature(outFeat)

current += 1
Expand Down
5 changes: 2 additions & 3 deletions python/plugins/sextante/algs/ftools/LinesToPolygons.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ def processAlgorithm(self, progress):
layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT))

provider = layer.dataProvider()
layer.select(layer.pendingAllAttributesList())

writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.pendingFields(),
QGis.WKBPolygon, provider.crs())
Expand All @@ -70,8 +69,8 @@ def processAlgorithm(self, progress):
polyGeom = self.removeBadLines(outGeomList)
if len(polyGeom) <> 0:
outFeat.setGeometry(QgsGeometry.fromPolygon(polyGeom))
atMap = inFeat.attributeMap()
outFeat.setAttributeMap(atMap)
atMap = inFeat.attributes()
outFeat.setAttributes(atMap)
writer.addFeature(outFeat)

current += 1
Expand Down
33 changes: 12 additions & 21 deletions python/plugins/sextante/algs/ftools/MeanCoords.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,17 +24,12 @@
__revision__ = '$Format:%H$'

from PyQt4.QtCore import *

from qgis.core import *

from sextante.core.GeoAlgorithm import GeoAlgorithm
from sextante.core.QGisLayers import QGisLayers

from sextante.parameters.ParameterTableField import ParameterTableField
from sextante.parameters.ParameterVector import ParameterVector

from sextante.outputs.OutputVector import OutputVector

from sextante.algs.ftools import FToolsUtils as utils


Expand Down Expand Up @@ -71,41 +66,39 @@ def processAlgorithm(self, progress):
uniqueIndex = layer.fieldNameIndex(uniqueField)

if uniqueIndex <> -1:
uniqueValues = layer.uniqueValues(uniqueIndex)
uniqueValues = utils.getUniqueValues(layer, uniqueIndex)
single = False
else:
uniqueValues = [QVariant(1)]
single = True

fieldList = {0 : QgsField("MEAN_X", QVariant.Double, "", 24, 15),
1 : QgsField("MEAN_Y", QVariant.Double, "", 24, 15),
2 : QgsField("UID", QVariant.String, "", 255)
}
fieldList = [QgsField("MEAN_X", QVariant.Double, "", 24, 15),
QgsField("MEAN_Y", QVariant.Double, "", 24, 15),
QgsField("UID", QVariant.String, "", 255)
]

writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fieldList,
QGis.WKBPoint, provider.crs())

current = 0
total = 100.0 / float(provider.featureCount() * len(uniqueValues))

feat = QgsFeature()

outFeat = QgsFeature()

for j in uniqueValues:
provider.rewind()
layer.select([weightIndex, uniqueIndex])
for j in uniqueValues:
cx = 0.00
cy = 0.00
points = []
weights = []
while layer.nextFeature(feat):
features = QGisLayers.features(layer)
for feat in features:
current += 1
progress.setPercentage(current * total)

if single:
check = j.toString().trimmed()
else:
check = feat.attributeMap()[uniqueIndex].toString().trimmed()
check = feat.attributes()[uniqueIndex].toString().trimmed()

if check == j.toString().trimmed():
cx = 0.00
Expand All @@ -114,7 +107,7 @@ def processAlgorithm(self, progress):
weight = 1.00
else:
try:
weight = float(feat.attributeMap()[weightIndex].toDouble()[0])
weight = float(feat.attributes()[weightIndex].toDouble()[0])
except:
weight = 1.00

Expand All @@ -139,9 +132,7 @@ def processAlgorithm(self, progress):
meanPoint = QgsPoint(cx, cy)

outFeat.setGeometry(QgsGeometry.fromPoint(meanPoint))
outFeat.addAttribute(0, QVariant(cx))
outFeat.addAttribute(1, QVariant(cy))
outFeat.addAttribute(2, QVariant(j))
outFeat.setAttributes([QVariant(cx), QVariant(cy), QVariant(j)])
writer.addFeature(outFeat)

if single:
Expand Down
7 changes: 3 additions & 4 deletions python/plugins/sextante/algs/ftools/MultipartToSingleparts.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,7 @@ def defineCharacteristics(self):
def processAlgorithm(self, progress):
layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT))

provider = layer.dataProvider()
layer.select(layer.pendingAllAttributesList())
provider = layer.dataProvider()

geomType = self.multiToSingleGeom(provider.geometryType())

Expand All @@ -71,10 +70,10 @@ def processAlgorithm(self, progress):
total = 100.0 / float(len(features))
for inFeat in features:
inGeom = inFeat.geometry()
atMap = inFeat.attributeMap()
atMap = inFeat.attributes()

features = self.extractAsSingle(inGeom)
outFeat.setAttributeMap(atMap)
outFeat.setAttributes(atMap)

for f in features:
outFeat.setGeometry(f)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,7 @@ def processAlgorithm(self, progress):
layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.POINTS))
output = self.getOutputValue(self.OUTPUT)

provider = layer.dataProvider()
spatialIndex = utils.createSpatialIndex(layer)
provider.rewind()
provider.select()

neighbour = QgsFeature()
distance = QgsDistanceArea()
Expand All @@ -82,16 +79,16 @@ def processAlgorithm(self, progress):

current = 0
features = QGisLayers.features(layer)
count = len(features)
total = 100.0 / float(len(features))
for feat in features:
neighbourID = spatialIndex.nearestNeighbor(feat.geometry().asPoint(), 2)[1]
provider.featureAtId(neighbourID, neighbour, True)
layer.featureAtId(neighbourID, neighbour, True)
sumDist += distance.measureLine(neighbour.geometry().asPoint(), feat.geometry().asPoint())

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

count = provider.featureCount()

do = float(sumDist) / count
de = float(0.5 / math.sqrt(count / A))
d = float(do / de)
Expand Down
50 changes: 17 additions & 33 deletions python/plugins/sextante/algs/ftools/PointDistance.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
from qgis.core import *
from sextante.core.GeoAlgorithm import GeoAlgorithm
from sextante.core.QGisLayers import QGisLayers

from sextante.algs.ftools import FToolsUtils as utils
from sextante.parameters.ParameterNumber import ParameterNumber
from sextante.parameters.ParameterVector import ParameterVector
from sextante.parameters.ParameterSelection import ParameterSelection
Expand Down Expand Up @@ -103,38 +103,30 @@ def linearMatrix(self, inLayer, inField, targetLayer, targetField, matType, nPoi
self.writer.writerow(["InputID", "TargetID", "Distance"])
else:
self.writer.writerow(["InputID", "MEAN", "STDDEV", "MIN", "MAX"])

targetProvider = targetLayer.dataProvider()
targetProvider.select()

index = QgsSpatialIndex()
inFeat = QgsFeature()
while targetProvider.nextFeature(inFeat):
index.insertFeature(inFeat)

index = utils.createSpatialIndex(targetLayer);

inIdx = inLayer.fieldNameIndex(inField)
inLayer.select([inIdx])
outIdx = targetLayer.fieldNameIndex(inField)
targetProvider.rewind()
targetLayer.select([outIdx])

outFeat = QgsFeature()
inGeom = QgsGeometry()
outGeom = QgsGeometry()
distArea = QgsDistanceArea()


features = QGisLayers.features(inLayer)
current = 0
total = 100.0 / float(inLayer.featureCount())

while inLayer.nextFeature(inFeat):
total = 100.0 / float(len(features))
for inFeat in features:
inGeom = inFeat.geometry()
inID = inFeat.attributeMap()[inIdx].toString()
inID = inFeat.attributes()[inIdx].toString()
featList = index.nearestNeighbor(inGeom.asPoint(), nPoints)
distList = []
vari = 0.0
for i in featList:
targetLayer.featureAtId(i, outFeat)
outID = outFeat.attributeMap()[outIdx].toString()
outID = outFeat.attributes()[outIdx].toString()
outGeom = outFeat.geometry()
dist = distArea.measureLine(inGeom.asPoint(), outGeom.asPoint())
if matType == 0:
Expand All @@ -152,21 +144,12 @@ def linearMatrix(self, inLayer, inField, targetLayer, targetField, matType, nPoi
current += 1
progress.setPercentage(int(current * total))

def regularMatrix(self, inLayer, inField, targetLayer, targetField, nPoints, progress):
inProvider = inLayer.dataProvider()
targetProvider = targetLayer.dataProvider()
targetProvider.select()

index = QgsSpatialIndex()
inFeat = QgsFeature()
while targetProvider.nextFeature(inFeat):
index.insertFeature(inFeat)
def regularMatrix(self, inLayer, inField, targetLayer, targetField, nPoints, progress):

inIdx = inLayer.fieldNameIndex(inField)
inLayer.select([inIdx])
outIdx = targetLayer.fieldNameIndex(inField)
targetProvider.rewind()
targetLayer.select([outIdx])
index = utils.createSpatialIndex(targetLayer)

inIdx = inLayer.fieldNameIndex(inField)
outIdx = targetLayer.fieldNameIndex(inField)

outFeat = QgsFeature()
inGeom = QgsGeometry()
Expand All @@ -177,9 +160,10 @@ def regularMatrix(self, inLayer, inField, targetLayer, targetField, nPoints, pro
current = 0
total = 100.0 / float(inLayer.featureCount())

while inLayer.nextFeature(inFeat):
features = QGisLayers.features(inLayer)
for inFeat in features:
inGeom = inFeat.geometry()
inID = inFeat.attributeMap()[inIdx].toString()
inID = inFeat.attributes()[inIdx].toString()
if first:
featList = index.nearestNeighbor(inGeom.asPoint(), nPoints)
first = False
Expand Down
15 changes: 6 additions & 9 deletions python/plugins/sextante/algs/ftools/PointsInPolygon.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,12 +75,6 @@ def processAlgorithm(self, progress):

spatialIndex = utils.createSpatialIndex(pointLayer)

pointProvider.rewind()
pointProvider.select()

allAttrs = polyLayer.pendingAllAttributesList()
polyLayer.select(allAttrs)

ftPoly = QgsFeature()
ftPoint = QgsFeature()
outFeat = QgsFeature()
Expand All @@ -93,7 +87,7 @@ def processAlgorithm(self, progress):
total = 100.0 / float(len(features))
for ftPoly in features:
geom = ftPoly.geometry()
atMap = ftPoly.attributeMap()
atMap = ftPoly.attributes()

count = 0
hasIntersections = False
Expand All @@ -109,8 +103,11 @@ def processAlgorithm(self, progress):
count += 1

outFeat.setGeometry(geom)
outFeat.setAttributeMap(atMap)
outFeat.addAttribute(idxCount, QVariant(count))
if idxCount == len(atMap):
atMap.append(QVariant(count))
else:
atMap[idxCount] = QVariant(count)
outFeat.setAttributes(atMap)
writer.addFeature(outFeat)

current += 1
Expand Down
19 changes: 8 additions & 11 deletions python/plugins/sextante/algs/ftools/PointsInPolygonUnique.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,12 +85,6 @@ def processAlgorithm(self, progress):

spatialIndex = utils.createSpatialIndex(pointLayer)

pointProvider.rewind()
pointProvider.select()

allAttrs = polyLayer.pendingAllAttributesList()
polyLayer.select(allAttrs)

ftPoint = QgsFeature()
outFeat = QgsFeature()
geom = QgsGeometry()
Expand All @@ -102,7 +96,7 @@ def processAlgorithm(self, progress):
total = 100.0 / float(len(features))
for ftPoly in features:
geom = ftPoly.geometry()
atMap = ftPoly.attributeMap()
atMap = ftPoly.attributes()

classes = []
hasIntersections = False
Expand All @@ -115,13 +109,16 @@ def processAlgorithm(self, progress):
pointLayer.featureAtId(int(i), ftPoint, True, True)
tmpGeom = QgsGeometry(ftPoint.geometry())
if geom.contains(tmpGeom):
clazz = ftPoint.attributeMap()[classFieldIndex].toString()
clazz = ftPoint.attributes()[classFieldIndex].toString()
if not clazz in classes:
classes.append(clazz)

outFeat.setGeometry(geom)
outFeat.setAttributeMap(atMap)
outFeat.addAttribute(idxCount, QVariant(len(classes)))
outFeat.setGeometry(geom)
if idxCount == len(atMap):
atMap.append(QVariant(len(classes)))
else:
atMap[idxCount] = QVariant(len(classes))
outFeat.setAttributes(atMap)
writer.addFeature(outFeat)

current += 1
Expand Down
19 changes: 8 additions & 11 deletions python/plugins/sextante/algs/ftools/PointsInPolygonWeighted.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,12 +86,6 @@ def processAlgorithm(self, progress):

spatialIndex = utils.createSpatialIndex(pointLayer)

pointProvider.rewind()
pointProvider.select()

allAttrs = polyLayer.pendingAllAttributesList()
polyLayer.select(allAttrs)

ftPoint = QgsFeature()
outFeat = QgsFeature()
geom = QgsGeometry()
Expand All @@ -103,7 +97,7 @@ def processAlgorithm(self, progress):
total = 100.0 / float(len(features))
for ftPoly in features:
geom = ftPoly.geometry()
atMap = ftPoly.attributeMap()
atMap = ftPoly.attributes()

count = 0
hasIntersections = False
Expand All @@ -117,14 +111,17 @@ def processAlgorithm(self, progress):
tmpGeom = QgsGeometry(ftPoint.geometry())
if geom.contains(tmpGeom):
try:
weight = float(ftPoint.attributeMap()[fieldidx])
weight = float(ftPoint.attributes()[fieldidx])
except:
weight = 1
count += weight

outFeat.setGeometry(geom)
outFeat.setAttributeMap(atMap)
outFeat.addAttribute(idxCount, QVariant(count))
outFeat.setGeometry(geom)
if idxCount == len(atMap):
atMap.append(QVariant(count))
else:
atMap[idxCount] = QVariant(count)
outFeat.setAttributes(atMap)
writer.addFeature(outFeat)

current += 1
Expand Down
9 changes: 3 additions & 6 deletions python/plugins/sextante/algs/ftools/PolygonsToLines.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,11 +56,8 @@ def defineCharacteristics(self):
def processAlgorithm(self, progress):
layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT))

provider = layer.dataProvider()
layer.select(layer.pendingAllAttributesList())

writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.pendingFields(),
QGis.WKBLineString, provider.crs())
QGis.WKBLineString, layer.crs())

inFeat = QgsFeature()
outFeat = QgsFeature()
Expand All @@ -72,9 +69,9 @@ def processAlgorithm(self, progress):
total = 100.0 / float(len(features))
for inFeat in features:
inGeom = inFeat.geometry()
atMap = inFeat.attributeMap()
atMap = inFeat.attributes()
lineList = self.extractAsLine(inGeom)
outFeat.setAttributeMap(atMap)
outFeat.setAttributes(atMap)
for h in lineList:
outFeat.setGeometry(outGeom.fromPolyline(h))
writer.addFeature(outFeat)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,12 @@
__revision__ = '$Format:%H$'

import random

from PyQt4.QtCore import *

from qgis.core import *

from sextante.core.GeoAlgorithm import GeoAlgorithm
from sextante.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
from sextante.core.QGisLayers import QGisLayers

from sextante.algs.ftools import FToolsUtils as utils
from sextante.parameters.ParameterSelection import ParameterSelection
from sextante.parameters.ParameterVector import ParameterVector
from sextante.parameters.ParameterNumber import ParameterNumber
Expand Down Expand Up @@ -77,9 +74,8 @@ def processAlgorithm(self, progress):

layer.removeSelection(True)
index = layer.fieldNameIndex(field)
layer.select([index])

unique = layer.uniqueValues(index)
unique = utils.getUniqueValues(layer, index)
featureCount = layer.featureCount()

value = int(self.getParameterValue(self.NUMBER))
Expand All @@ -102,7 +98,7 @@ def processAlgorithm(self, progress):
FIDs= []
layer.select([index])
while layer.nextFeature(inFeat):
atMap = inFeat.attributeMap()
atMap = inFeat.attributes()
if atMap[index] == QVariant(i):
FIDs.append(inFeat.id())
current += 1
Expand Down
4 changes: 1 addition & 3 deletions python/plugins/sextante/algs/ftools/ReprojectLayer.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,6 @@ def processAlgorithm(self, progress):
writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.pendingFields(),
layer.wkbType(), targetCrs)

layer.select(layer.pendingAllAttributesList())

layerCrs = layer.crs()
crsTransform = QgsCoordinateTransform(layerCrs, targetCrs)

Expand All @@ -74,7 +72,7 @@ def processAlgorithm(self, progress):
geom = f.geometry()
geom.transform(crsTransform)
outFeat.setGeometry(geom)
outFeat.setAttributeMap(f.attributeMap())
outFeat.setAttributes(f.attributes())
writer.addFeature(outFeat)

current += 1
Expand Down
2 changes: 0 additions & 2 deletions python/plugins/sextante/algs/ftools/SelectByLocation.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,6 @@ def processAlgorithm(self, progress):

oldSelection = set(inputLayer.selectedFeaturesIds())
index = QgsSpatialIndex()
inputProvider.rewind()
inputProvider.select()
feat = QgsFeature()
while inputProvider.nextFeature(feat):
index.insertFeature(feat)
Expand Down
5 changes: 2 additions & 3 deletions python/plugins/sextante/algs/ftools/SimplifyGeometries.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ def processAlgorithm(self, progress):
pointsAfter = 0

provider = layer.dataProvider()
layer.select(layer.pendingAllAttributesList())

writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.pendingFields(),
layer.wkbType(), provider.crs())
Expand All @@ -73,13 +72,13 @@ def processAlgorithm(self, progress):
total = 100.0 / float(len(selection))
for f in selection:
featGeometry = QgsGeometry(f.geometry())
attrMap = f.attributeMap()
attrMap = f.attributes()
pointsBefore += self.geomVertexCount(featGeometry)
newGeometry = featGeometry.simplify(tolerance)
pointsAfter += self.geomVertexCount(newGeometry)
feature = QgsFeature()
feature.setGeometry(newGeometry)
feature.setAttributeMap(attrMap)
feature.setAttributes(attrMap)
writer.addFeature(feature)
current += 1
progress.setPercentage(int(current * total))
Expand Down
10 changes: 4 additions & 6 deletions python/plugins/sextante/algs/ftools/SinglePartsToMultiparts.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,11 @@
__revision__ = '$Format:%H$'

from PyQt4.QtCore import *

from qgis.core import *

from sextante.core.GeoAlgorithm import GeoAlgorithm
from sextante.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
from sextante.core.QGisLayers import QGisLayers

from sextante.algs.ftools import FToolsUtils as utils
from sextante.parameters.ParameterVector import ParameterVector
from sextante.parameters.ParameterTableField import ParameterTableField

Expand Down Expand Up @@ -75,7 +73,7 @@ def processAlgorithm(self, progress):
outGeom = QgsGeometry()

index = layer.fieldNameIndex(fieldName)
unique = layer.uniqueValues(index)
unique = utils.getUniqueValues(layer, index)

current = 0
features = QGisLayers.features(layer)
Expand All @@ -89,7 +87,7 @@ def processAlgorithm(self, progress):
layer.select(allAttrs)
features = QGisLayers.features(layer)
for inFeat in features:
atMap = inFeat.attributeMap()
atMap = inFeat.attributes()
idVar = atMap[index]
if idVar.toString().trimmed() == i.toString().trimmed():
if first:
Expand All @@ -104,7 +102,7 @@ def processAlgorithm(self, progress):
current += 1
progress.setPercentage(int(current * total))

outFeat.setAttributeMap(attrs)
outFeat.setAttributes(attrs)
outGeom = QgsGeometry(self.convertGeometry(multi_feature, vType))
outFeat.setGeometry(outGeom)
writer.addFeature(outFeat)
Expand Down
22 changes: 11 additions & 11 deletions python/plugins/sextante/algs/ftools/SumLines.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,12 +84,6 @@ def processAlgorithm(self, progress):

spatialIndex = utils.createSpatialIndex(lineLayer)

lineProvider.rewind()
lineProvider.select()

allAttrs = polyLayer.pendingAllAttributesList()
polyLayer.select(allAttrs)

ftLine = QgsFeature()
ftPoly = QgsFeature()
outFeat = QgsFeature()
Expand All @@ -103,7 +97,7 @@ def processAlgorithm(self, progress):
hasIntersections = False
for ftPoly in features:
inGeom = QgsGeometry(ftPoly.geometry())
atMap = ftPoly.attributeMap()
atMap = ftPoly.attributes()
count = 0
length = 0
hasIntersections = False
Expand All @@ -113,17 +107,23 @@ def processAlgorithm(self, progress):

if hasIntersections:
for i in lines:
lineProvider.featureAtId(int(i), ftLine)
lineLayer.featureAtId(int(i), ftLine)
tmpGeom = QgsGeometry(ftLine.geometry())
if inGeom.intersects(tmpGeom):
outGeom = inGeom.intersection(tmpGeom)
length += distArea.measure(outGeom)
count += 1

outFeat.setGeometry(inGeom)
outFeat.setAttributeMap(atMap)
outFeat.addAttribute(idxLength, QVariant(length))
outFeat.addAttribute(idxCount, QVariant(count))
if idxLength == len(atMap):
atMap.append(QVariant(length))
else:
atMap[idxLength] = QVariant(length)
if idxCount == len(atMap):
atMap.append(QVariant(count))
else:
atMap[idxCount] = QVariant(count)
outFeat.setAttributes(atMap)
writer.addFeature(outFeat)

current += 1
Expand Down
38 changes: 18 additions & 20 deletions python/plugins/sextante/algs/ftools/Union.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,8 @@
from qgis.core import *
from sextante.parameters.ParameterVector import ParameterVector
from sextante.core.QGisLayers import QGisLayers
from sextante.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
from sextante.outputs.OutputVector import OutputVector
from sextante.algs.ftools import ftools_utils
from sextante.algs.ftools import FToolsUtils as utils
from sextante.core.SextanteLog import SextanteLog
from sextante.core.GeoAlgorithm import GeoAlgorithm

Expand Down Expand Up @@ -65,17 +64,16 @@ def processAlgorithm(self, progress):
else:
if not crsA != crsB:
SextanteLog.addToLog(SextanteLog.LOG_WARNING, "Union. Non-matching CRSs. Results might be unexpected")
fields = ftools_utils.combineVectorFields(vlayerA, vlayerB )
longNames = ftools_utils.checkFieldNameLength( fields )
if not longNames.isEmpty():
raise GeoAlgorithmExecutionException("Following field names are longer than 10 characters:\n" + longNames.join('\n') )
fields = utils.combineVectorFields(vlayerA, vlayerB )
#longNames = ftools_utils.checkFieldNameLength( fields )
#if not longNames.isEmpty():
#raise GeoAlgorithmExecutionException("Following field names are longer than 10 characters:\n" + longNames.join('\n') )
writer = self.getOutputFromName(Union.OUTPUT).getVectorWriter(fields, vproviderA.geometryType(), vproviderA.crs() )
inFeatA = QgsFeature()
inFeatB = QgsFeature()
outFeat = QgsFeature()
indexA = ftools_utils.createIndex( QGisLayers.features(vlayerB) )
indexB = ftools_utils.createIndex( QGisLayers.features(vlayerA) )
nFeat = vproviderA.featureCount() + vproviderB.featureCount()
indexA = utils.createSpatialIndex(vlayerB)
indexB = utils.createSpatialIndex(vlayerA)
vproviderA.rewind()
count = 0
nElement = 0
Expand All @@ -88,12 +86,12 @@ def processAlgorithm(self, progress):
found = False
geom = QgsGeometry( inFeatA.geometry() )
diff_geom = QgsGeometry( geom )
atMapA = inFeatA.attributeMap()
atMapA = inFeatA.attributes()
intersects = indexA.intersects( geom.boundingBox() )
if len( intersects ) < 1:
try:
outFeat.setGeometry( geom )
outFeat.setAttributeMap( atMapA )
outFeat.setAttributes( atMapA )
writer.addFeature( outFeat )
except:
# this really shouldn't happen, as we
Expand All @@ -103,7 +101,7 @@ def processAlgorithm(self, progress):
for id in intersects:
count += 1
vproviderB.featureAtId( int( id ), inFeatB , True, allAttrsB )
atMapB = inFeatB.attributeMap()
atMapB = inFeatB.attributes()
tmpGeom = QgsGeometry( inFeatB.geometry() )
try:
if geom.intersects( tmpGeom ):
Expand Down Expand Up @@ -142,7 +140,7 @@ def processAlgorithm(self, progress):
# intersects, but the geometry doesn't
try:
outFeat.setGeometry( geom )
outFeat.setAttributeMap( atMapA )
outFeat.setAttributes( atMapA )
writer.addFeature( outFeat )
except:
# also shoudn't ever happen
Expand All @@ -159,7 +157,7 @@ def processAlgorithm(self, progress):
if i.type() == geom.type():
diff_geom = QgsGeometry( i )
outFeat.setGeometry( diff_geom )
outFeat.setAttributeMap( atMapA )
outFeat.setAttributes( atMapA )
writer.addFeature( outFeat )
except Exception, err:
FEATURE_EXCEPT = False
Expand All @@ -174,21 +172,21 @@ def processAlgorithm(self, progress):
add = False
geom = QgsGeometry( inFeatA.geometry() )
diff_geom = QgsGeometry( geom )
atMap = inFeatA.attributeMap().values()
atMap = inFeatA.attributes()
atMap = dict( zip( range( length, length + len( atMap ) ), atMap ) )
intersects = indexB.intersects( geom.boundingBox() )

if len(intersects) < 1:
try:
outFeat.setGeometry( geom )
outFeat.setAttributeMap( atMap )
outFeat.setAttributes( atMap )
writer.addFeature( outFeat )
except Exception, err:
FEATURE_EXCEPT = False
else:
for id in intersects:
vproviderA.featureAtId( int( id ), inFeatB , True, allAttrsA )
atMapB = inFeatB.attributeMap()
vlayerA.featureAtId( int( id ), inFeatB , True, allAttrsA )
atMapB = inFeatB.attributes()
tmpGeom = QgsGeometry( inFeatB.geometry() )
try:
if diff_geom.intersects( tmpGeom ):
Expand All @@ -198,7 +196,7 @@ def processAlgorithm(self, progress):
# this only happends if the bounding box
# intersects, but the geometry doesn't
outFeat.setGeometry( diff_geom )
outFeat.setAttributeMap( atMap )
outFeat.setAttributes( atMap )
writer.addFeature( outFeat )
except Exception, err:
add = False
Expand All @@ -207,7 +205,7 @@ def processAlgorithm(self, progress):
if add:
try:
outFeat.setGeometry( diff_geom )
outFeat.setAttributeMap( atMapB )
outFeat.setAttributes( atMapB )
writer.addFeature( outFeat )
except Exception, err:
FEATURE_EXCEPT = False
Expand Down
3 changes: 2 additions & 1 deletion python/plugins/sextante/algs/ftools/UniqueValues.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
from sextante.parameters.ParameterTableField import ParameterTableField
from sextante.outputs.OutputHTML import OutputHTML
from sextante.outputs.OutputNumber import OutputNumber
from sextante.algs.ftools import FToolsUtils as utils

class UniqueValues(GeoAlgorithm):

Expand Down Expand Up @@ -59,7 +60,7 @@ def processAlgorithm(self, progress):
layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT_LAYER))
fieldName = self.getParameterValue(self.FIELD_NAME)
outputFile = self.getOutputValue(self.OUTPUT)
values = layer.uniqueValues(layer.fieldNameIndex(fieldName))
values = utils.getUniqueValues(layer, layer.fieldNameIndex(fieldName))
self.createHTML(outputFile, values)
self.setOutputValue(self.TOTAL_VALUES, len(values))
self.setOutputValue(self.UNIQUE_VALUES, ";".join([unicode(v.toString()) for v in values]))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,9 +68,8 @@ def processAlgorithm(self, progress):
field = self.getParameterValue(self.FIELD)
segments = int(self.getParameterValue(self.SEGMENTS))

provider = layer.dataProvider()
writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.pendingFields(),
QGis.WKBPolygon, provider.crs())
QGis.WKBPolygon, layer.crs())

buff.buffering(progress, writer, 0, field, True,
layer, dissolve, segments)
7 changes: 2 additions & 5 deletions python/plugins/sextante/algs/ftools/VoronoiPolygons.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,11 +59,8 @@ def defineCharacteristics(self):
def processAlgorithm(self, progress):
layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT))

provider = layer.dataProvider()
layer.select(layer.pendingAllAttributesList())

writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.pendingFields(),
QGis.WKBPolygon, provider.crs())
QGis.WKBPolygon, layer.crs())

inFeat = QgsFeature()
outFeat = QgsFeature()
Expand Down Expand Up @@ -104,7 +101,7 @@ def processAlgorithm(self, progress):
geom = QgsGeometry.fromMultiPoint(lines)
geom = QgsGeometry(geom.convexHull())
outFeat.setGeometry(geom)
outFeat.setAttributeMap(inFeat.attributeMap())
outFeat.setAttributes(inFeat.attributes())
writer.addFeature(outFeat)

current += 1
Expand Down
1,027 changes: 725 additions & 302 deletions python/plugins/sextante/algs/mmqgisx/MMQGISXAlgorithms.py

Large diffs are not rendered by default.

353 changes: 20 additions & 333 deletions python/plugins/sextante/algs/mmqgisx/mmqgisx_library.py

Large diffs are not rendered by default.

10 changes: 7 additions & 3 deletions python/plugins/sextante/core/QGisLayers.py
Original file line number Diff line number Diff line change
Expand Up @@ -210,8 +210,9 @@ class Features():

def __init__(self, layer):
self.layer = layer
self.iter = layer.getFeatures()
self.selection = False;
self.layer.dataProvider().rewind()
##self.layer.dataProvider().rewind()
if SextanteConfig.getSetting(SextanteConfig.USE_SELECTED):
self.selected = layer.selectedFeatures()
if len(self.selected) > 0:
Expand All @@ -230,17 +231,20 @@ def next(self):
else:
raise StopIteration()
else:
if self.iter.isClosed():
raise StopIteration()
f = QgsFeature()
if self.layer.dataProvider().nextFeature(f):
if self.iter.nextFeature(f):
return f
else:
self.iter.close()
raise StopIteration()

def __len__(self):
if self.selection:
return int(self.layer.selectedFeatureCount())
else:
return int(self.layer.dataProvider().featureCount())
return int(self.layer.featureCount())



Expand Down
7 changes: 6 additions & 1 deletion python/plugins/sextante/core/SextanteVectorWriter.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,12 @@ def __init__(self, fileName, encoding, fields, geometryType, crs, options=None):
if extension not in OGRCodes:
extension = "shp"
self.filename = self.filename + "shp"
self.writer = QgsVectorFileWriter(self.fileName, encoding, fields, geometryType, crs, OGRCodes[extension])

qgsfields = QgsFields()
for field in fields:
qgsfields.append(field)

self.writer = QgsVectorFileWriter(self.fileName, encoding, qgsfields, geometryType, crs, OGRCodes[extension])

def addFeature(self, feature):
if self.isMemory:
Expand Down
2 changes: 1 addition & 1 deletion python/plugins/sextante/outputs/OutputVector.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ def getVectorWriter(self, fields, geomType, crs, options=None):
result in previous data being replaced, thus rendering a previously
obtained writer useless
@param fields a dict of int-QgsField
@param fields a list of QgsField
@param geomType a suitable geometry type, as it would be passed
to a QgsVectorFileWriter constructor
@param crs the crs of the layer to create
Expand Down