194 changes: 90 additions & 104 deletions python/plugins/fTools/tools/doGeometry.py

Large diffs are not rendered by default.

274 changes: 115 additions & 159 deletions python/plugins/fTools/tools/doGeoprocessing.py

Large diffs are not rendered by default.

12 changes: 5 additions & 7 deletions python/plugins/fTools/tools/doIntersectLines.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,15 +114,13 @@ def compute(self, line1, line2, field1, field2, outPath, progressBar):

layer1 = ftools_utils.getVectorLayerByName(line1)
provider1 = layer1.dataProvider()
allAttrs = provider1.attributeIndexes()
fieldList = ftools_utils.getFieldList(layer1)
index1 = provider1.fieldNameIndex(field1)
field1 = fieldList[index1]
field1.setName(unicode(field1.name()) + "_1")

layer2 = ftools_utils.getVectorLayerByName(line2)
provider2 = layer2.dataProvider()
allAttrs = provider2.attributeIndexes()
fieldList = ftools_utils.getFieldList(layer2)
index2 = provider2.fieldNameIndex(field2)
field2 = fieldList[index2]
Expand All @@ -145,16 +143,16 @@ def compute(self, line1, line2, field1, field2, outPath, progressBar):

index = ftools_utils.createIndex( provider2 )

provider1.select([index1])
while provider1.nextFeature(inFeat):
fit1 = vprovider.getFeatures( QgsFeatureRequest().setSubsetOfAttributes([index1]) )
while fit1.nextFeature(inFeat):
inGeom = inFeat.geometry()
v1 = inFeat.attributeMap()[index1]
v1 = inFeat.attributes()[index1]

lineList = index.intersects( inGeom.boundingBox() )
for i in lineList:
provider2.featureAtId( int( i ), inFeatB , True, [index2] )
provider2.getFeatures( QgsFeatureRequest().setFilterFid( int( i ) ).setSubsetOfAttributes([index2]) ).nextFeature( inFeatB )
tmpGeom = QgsGeometry( inFeatB.geometry() )
v2 = inFeatB.attributeMap()[index2]
v2 = inFeatB.attributes()[index2]

if inGeom.intersects(tmpGeom):
tempGeom = inGeom.intersection(tmpGeom)
Expand Down
11 changes: 4 additions & 7 deletions python/plugins/fTools/tools/doMeanCoords.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,8 +116,6 @@ def compute(self, inName, outName, weightField="", times=1, uniqueField=""):
weightIndex = provider.fieldNameIndex(weightField)
uniqueIndex = provider.fieldNameIndex(uniqueField)
feat = QgsFeature()
allAttrs = provider.attributeIndexes()
provider.select(allAttrs)
sRs = provider.crs()
check = QFile(self.shapefileName)
if check.exists():
Expand All @@ -143,26 +141,25 @@ def compute(self, inName, outName, weightField="", times=1, uniqueField=""):
self.progressBar.setValue(0)
self.progressBar.setRange(0, nFeat)
for j in uniqueValues:
provider.rewind()
provider.select(allAttrs)
cx = 0.00
cy = 0.00
points = []
weights = []
while provider.nextFeature(feat):
fit = provider.getFeatures()
while fit.nextFeature(feat):
nElement += 1
self.progressBar.setValue(nElement)
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
cy = 0.00
if weightIndex == -1:
weight = 1.00
else:
weight = float(feat.attributeMap()[weightIndex].toDouble()[0])
weight = float(feat.attributes()[weightIndex].toDouble()[0])
geom = QgsGeometry(feat.geometry())
geom = ftools_utils.extractPoints(geom)
for i in geom:
Expand Down
57 changes: 37 additions & 20 deletions python/plugins/fTools/tools/doMergeShapes.py
Original file line number Diff line number Diff line change
Expand Up @@ -240,26 +240,39 @@ def run( self ):

# create attribute list with uniquie fields
# from all selected layers
mergedFields = {}
count = 0
mergedFields = []
self.emit( SIGNAL( "rangeChanged( PyQt_PyObject )" ), len( self.shapes ) )
self.emit( SIGNAL( "checkStarted()" ) )

shapeIndex = 0
fieldMap = {}
for fileName in self.shapes:
layerPath = QFileInfo( self.baseDir + "/" + fileName ).absoluteFilePath()
newLayer = QgsVectorLayer( layerPath, QFileInfo( layerPath ).baseName(), "ogr" )
if not newLayer.isValid():
continue

vprovider = newLayer.dataProvider()
layerFields = vprovider.fields()
for layerIndex, layerField in layerFields.iteritems():

fieldIndex = 0
for layerField in vprovider.fields():
fieldFound = False
for mergedIndex, mergedField in mergedFields.iteritems():
if ( mergedField.name() == layerField.name() ) and ( mergedField.type() == layerField.type() ):
for mergedField in mergedFields:
if mergedField.name() == layerField.name() and mergedField.type() == layerField.type():
fieldFound = True
break

if not fieldFound:
mergedFields[ count ] = layerField
count += 1
if not fieldMap.has_key(shapeIndex):
fieldMap[shapeIndex]={}

fieldMap[shapeIndex][fieldIndex] = len(mergedFields)

mergedFields.append( layerField )

fieldIndex += 1

shapeIndex += 1
self.emit( SIGNAL( "featureProcessed()" ) )
self.emit( SIGNAL( "checkFinished()" ) )

Expand All @@ -269,11 +282,11 @@ def run( self ):
self.crs = newLayer.crs()
self.geom = newLayer.wkbType()
vprovider = newLayer.dataProvider()
self.fields = mergedFields

writer = QgsVectorFileWriter( self.outputFileName, self.outputEncoding,
self.fields, self.geom, self.crs )
mergedFields, self.geom, self.crs )

shapeIndex = 0
for fileName in self.shapes:
layerPath = QFileInfo( self.baseDir + "/" + fileName ).absoluteFilePath()
newLayer = QgsVectorLayer( layerPath, QFileInfo( layerPath ).baseName(), "ogr" )
Expand All @@ -282,36 +295,40 @@ def run( self ):
vprovider = newLayer.dataProvider()
vprovider.setEncoding( self.inputEncoding )
layerFields = vprovider.fields()
allAttrs = vprovider.attributeIndexes()
vprovider.select( allAttrs )
nFeat = vprovider.featureCount()
self.emit( SIGNAL( "rangeChanged( PyQt_PyObject )" ), nFeat )
self.emit( SIGNAL( "fileNameChanged( PyQt_PyObject )" ), fileName )
inFeat = QgsFeature()
outFeat = QgsFeature()
inGeom = QgsGeometry()
while vprovider.nextFeature( inFeat ):
atMap = inFeat.attributeMap()
mergedAttrs = {}
fit = vprovider.getFeatures()
while fit.nextFeature( inFeat ):
mergedAttrs = [QVariant()] * len(mergedFields)

# fill available attributes with values
for layerIndex, layerField in layerFields.iteritems():
for mergedIndex, mergedField in self.fields.iteritems():
if ( mergedField.name() == layerField.name() ) and ( mergedField.type() == layerField.type() ):
mergedAttrs[ mergedIndex ] = atMap[ layerIndex ]
fieldIndex = 0
for v in inFeat.attributes():
if fieldMap.has_key(shapeIndex) and fieldMap[shapeIndex].has_key(layerIndex):
mergedAttrs[ fieldMap[shapeIndex][layerIndex] ] = v
fieldIndex += 1

inGeom = QgsGeometry( inFeat.geometry() )
outFeat.setGeometry( inGeom )
outFeat.setAttributeMap( mergedAttrs )
outFeat.setAttributes( mergedAttrs )
writer.addFeature( outFeat )
self.emit( SIGNAL( "featureProcessed()" ) )

self.emit( SIGNAL( "shapeProcessed()" ) )
self.mutex.lock()
s = self.stopMe
self.mutex.unlock()

if s == 1:
interrupted = True
break

shapeIndex += 1

del writer

if not interrupted:
Expand Down
30 changes: 14 additions & 16 deletions python/plugins/fTools/tools/doPointDistance.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# -*- coding: utf-8 -*-

#-----------------------------------------------------------
#
# fTools
Expand Down Expand Up @@ -158,15 +158,11 @@ def compute(self, line1, line2, field1, field2, outPath, matType, nearest, progr
layer2 = ftools_utils.getVectorLayerByName(line2)
provider1 = layer1.dataProvider()
provider2 = layer2.dataProvider()
allAttrs = provider1.attributeIndexes()
provider1.select(allAttrs)
allAttrs = provider2.attributeIndexes()
provider2.select(allAttrs)
sindex = QgsSpatialIndex()
inFeat = QgsFeature()
while provider2.nextFeature(inFeat):
fit2 = provider2.getFeatures()
while fit2.nextFeature(inFeat):
sindex.insertFeature(inFeat)
provider2.rewind()
if nearest < 1: nearest = layer2.featureCount()
else: nearest = nearest
index1 = provider1.fieldNameIndex(field1)
Expand Down Expand Up @@ -196,20 +192,21 @@ def regularMatrix(self, writer, provider1, provider2, index1, index2, nearest, d
first = True
start = 15.00
add = 85.00 / provider1.featureCount()
while provider1.nextFeature(inFeat):
fit1 = provider1.getFeatures()
while fit1.nextFeature(inFeat):
inGeom = inFeat.geometry()
inID = inFeat.attributeMap()[index1].toString()
inID = inFeat.attributes()[index1].toString()
if first:
featList = sindex.nearestNeighbor(inGeom.asPoint(), nearest)
first = False
data = ["ID"]
for i in featList:
provider2.featureAtId(int(i), outFeat, True, [index2])
data.append(unicode(outFeat.attributeMap()[index2].toString()))
provider2.getFeatures( QgsFeatureRequest().setFilterFid( int(i) ).setSubsetOfAttributes([index2]) ).nextFeature( outFeat )
data.append(unicode(outFeat.attributes()[index2].toString()))
writer.writerow(data)
data = [unicode(inID)]
for j in featList:
provider2.featureAtId(int(j), outFeat, True)
provider2.getFeatures( QgsFeatureRequest().setFilterFid( int(j) ) ).nextFeature( outFeat )
outGeom = outFeat.geometry()
dist = distArea.measureLine(inGeom.asPoint(), outGeom.asPoint())
data.append(str(float(dist)))
Expand All @@ -225,15 +222,16 @@ def linearMatrix(self, writer, provider1, provider2, index1, index2, nearest, di
outGeom = QgsGeometry()
start = 15.00
add = 85.00 / provider1.featureCount()
while provider1.nextFeature(inFeat):
fit1 = provider1.getFeatures()
while fit1.nextFeature(inFeat):
inGeom = inFeat.geometry()
inID = inFeat.attributeMap()[index1].toString()
inID = inFeat.attributes()[index1].toString()
featList = sindex.nearestNeighbor(inGeom.asPoint(), nearest)
distList = []
vari = 0.00
for i in featList:
provider2.featureAtId(int(i), outFeat, True, [index2])
outID = outFeat.attributeMap()[index2].toString()
provider2.getFeatures( QgsFeatureRequest().setFilterFid( int(i) ).setSubsetOfAttributes([index2]) ).nextFeature( outFeat )
outID = outFeat.attributes()[index2].toString()
outGeom = outFeat.geometry()
dist = distArea.measureLine(inGeom.asPoint(), outGeom.asPoint())
if dist > 0:
Expand Down
14 changes: 5 additions & 9 deletions python/plugins/fTools/tools/doPointsInPolygon.py
Original file line number Diff line number Diff line change
Expand Up @@ -166,9 +166,6 @@ def run(self):
polyProvider = self.layerPoly.dataProvider()
pointProvider = self.layerPoints.dataProvider()

allAttrs = polyProvider.attributeIndexes()
polyProvider.select(allAttrs)

fieldList = ftools_utils.getFieldList(self.layerPoly)
index = polyProvider.fieldNameIndex(unicode(self.fieldName))
if index == -1:
Expand All @@ -185,19 +182,18 @@ def run(self):
polyProvider.geometryType(), sRs)

spatialIndex = ftools_utils.createIndex( pointProvider )
pointProvider.rewind()
pointProvider.select()

self.emit(SIGNAL("rangeChanged(int)"), polyProvider.featureCount() )

polyFeat = QgsFeature()
pntFeat = QgsFeature()
outFeat = QgsFeature()
inGeom = QgsGeometry()
while polyProvider.nextFeature(polyFeat):
polyFit = polyProvider.getFeatures()
while polyFit.nextFeature(polyFeat):
inGeom = polyFeat.geometry()
atMap = polyFeat.attributeMap()
outFeat.setAttributeMap(atMap)
atMap = polyFeat.attributes()
outFeat.setAttributes(atMap)
outFeat.setGeometry(inGeom)

count = 0
Expand All @@ -211,7 +207,7 @@ def run(self):

if hasIntersection:
for p in pointList:
pointProvider.featureAtId(p, pntFeat , True)
pointProvider.getFeatures( QgsFeatureRequest().setFilterFid( p ) ).nextFeature( pntFeat )
tmpGeom = QgsGeometry(pntFeat.geometry())
if inGeom.intersects(tmpGeom):
count += 1
Expand Down
18 changes: 7 additions & 11 deletions python/plugins/fTools/tools/doRandPoints.py
Original file line number Diff line number Diff line change
Expand Up @@ -143,19 +143,16 @@ def outFile(self):
# combine all polygons in layer to create single polygon (slow for complex polygons)
def createSinglePolygon(self, vlayer):
provider = vlayer.dataProvider()
allAttrs = provider.attributeIndexes()
provider.select(allAttrs)
feat = QgsFeature()
geom = QgsGeometry()
#geom2 = QgsGeometry()
provider.nextFeature(feat)
fit = provider.getFeatures()
fit.nextFeature(feat)
geom = QgsGeometry(feat.geometry())
count = 10.00
add = ( 40.00 - 10.00 ) / provider.featureCount()
#provider.rewind()
#provider.nextFeature(feat)
#geom = QgsGeometry(feat.geometry())
while provider.nextFeature(feat):
while fit.nextFeature(feat):
geom = geom.combine(QgsGeometry( feat.geometry() ))
count = count + add
self.progressBar.setValue(count)
Expand Down Expand Up @@ -194,7 +191,7 @@ def vectorRandom(self, n, layer, xmin, xmax, ymin, ymax):
pGeom = QgsGeometry().fromPoint(point)
ids = index.intersects(pGeom.buffer(5,5).boundingBox())
for id in ids:
provider.featureAtId(int(id),feat,True)
provider.getFeatures( QgsFeatureRequest().setFilterFid( int(id) ) ).nextFeature( feat )
tGeom = QgsGeometry(feat.geometry())
if pGeom.intersects(tGeom):
points.append(pGeom)
Expand Down Expand Up @@ -238,8 +235,6 @@ def randomize(self, inLayer, outPath, minimum, design, value):
#
def loopThruPolygons(self, inLayer, numRand, design):
sProvider = inLayer.dataProvider()
sAllAttrs = sProvider.attributeIndexes()
sProvider.select(sAllAttrs)
sFeat = QgsFeature()
sGeom = QgsGeometry()
sPoints = []
Expand All @@ -250,13 +245,14 @@ def loopThruPolygons(self, inLayer, numRand, design):
break
count = 10.00
add = 60.00 / sProvider.featureCount()
while sProvider.nextFeature(sFeat):
sFit = sProvider.getFeatures()
while sFit.nextFeature(sFeat):
sGeom = sFeat.geometry()
if design == self.tr("density"):
sDistArea = QgsDistanceArea()
value = int(round(numRand * sDistArea.measure(sGeom)))
elif design == self.tr("field"):
sAtMap = sFeat.attributeMap()
sAtMap = sFeat.attributes()
value = sAtMap[index].toInt()[0]
else:
value = numRand
Expand Down
11 changes: 4 additions & 7 deletions python/plugins/fTools/tools/doSelectByLocation.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,11 +97,7 @@ def compute(self, inPoly, inPts, modify, selection):
inputLayer = ftools_utils.getVectorLayerByName(inPoly)
selectLayer = ftools_utils.getVectorLayerByName(inPts)
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()
Expand All @@ -116,18 +112,19 @@ def compute(self, inPoly, inPts, modify, selection):
geom = QgsGeometry(feat.geometry())
intersects = index.intersects(geom.boundingBox())
for id in intersects:
inputProvider.featureAtId(int(id), infeat, True)
inputProvider.getFeatures( QgsFeatureRequest().setFilterFid( int(id) ) ).nextFeature( infeat )
tmpGeom = QgsGeometry(infeat.geometry())
if geom.intersects(tmpGeom):
selectedSet.append(infeat.id())
self.progressBar.setValue(self.progressBar.value()+1)
else:
self.progressBar.setMaximum(selectProvider.featureCount())
while selectProvider.nextFeature(feat):
selectFit = selectProvider.getFeatures()
while selectFit.nextFeature(feat):
geom = QgsGeometry(feat.geometry())
intersects = index.intersects(geom.boundingBox())
for id in intersects:
inputProvider.featureAtId(int(id), infeat, True)
inputProvider.getFeatures( QgsFeatureRequest().setFilterFid( int(id) ) ).nextFeature( infeat )
tmpGeom = QgsGeometry( infeat.geometry() )
if geom.intersects(tmpGeom):
selectedSet.append(infeat.id())
Expand Down
32 changes: 16 additions & 16 deletions python/plugins/fTools/tools/doSimplify.py
Original file line number Diff line number Diff line change
Expand Up @@ -270,8 +270,6 @@ def runSimplify( self ):

if self.writeShape:
vProvider = self.inputLayer.dataProvider()
allAttrs = vProvider.attributeIndexes()
vProvider.select( allAttrs )
shapeFields = vProvider.fields()
crs = vProvider.crs()
wkbType = self.inputLayer.wkbType()
Expand All @@ -284,15 +282,15 @@ def runSimplify( self ):
self.emit( SIGNAL( "rangeCalculated( PyQt_PyObject )" ), len( selection ) )
for f in selection:
featGeometry = QgsGeometry( f.geometry() )
attrMap = f.attributeMap()
attrMap = f.attributes()

pointsBefore += geomVertexCount( featGeometry )
newGeometry = featGeometry.simplify( self.tolerance )
pointsAfter += geomVertexCount( newGeometry )

feature = QgsFeature()
feature.setGeometry( newGeometry )
feature.setAttributeMap( attrMap )
feature.setAttributes( attrMap )
shapeFileWriter.addFeature( feature )
featureId += 1
self.emit( SIGNAL( "featureProcessed()" ) )
Expand All @@ -306,17 +304,18 @@ def runSimplify( self ):
else:
self.emit( SIGNAL( "rangeCalculated( PyQt_PyObject )" ), vProvider.featureCount() )
f = QgsFeature()
while vProvider.nextFeature( f ):
fit = vProvider.getFeatures()
while fit.nextFeature( f ):
featGeometry = QgsGeometry( f.geometry() )
attrMap = f.attributeMap()
attrMap = f.attributes()

pointsBefore += geomVertexCount( featGeometry )
newGeometry = featGeometry.simplify( self.tolerance )
pointsAfter += geomVertexCount( newGeometry )

feature = QgsFeature()
feature.setGeometry( newGeometry )
feature.setAttributeMap( attrMap )
feature.setAttributes( attrMap )
shapeFileWriter.addFeature( feature )
featureId += 1
self.emit( SIGNAL( "featureProcessed()" ) )
Expand Down Expand Up @@ -355,7 +354,8 @@ def runSimplify( self ):
vProvider = self.inputLayer.dataProvider()
self.emit( SIGNAL( "rangeCalculated( PyQt_PyObject )" ), vProvider.featureCount() )
f = QgsFeature()
while vProvider.nextFeature( f ):
fit = vProvider.getFeatures()
while fit.nextFeature( f ):
featureId = f.id()
featGeometry = QgsGeometry( f.geometry() )

Expand Down Expand Up @@ -399,8 +399,6 @@ def runDensify( self ):
if self.writeShape:
# prepare writer
vProvider = self.inputLayer.dataProvider()
allAttrs = vProvider.attributeIndexes()
vProvider.select( allAttrs )
shapeFields = vProvider.fields()
crs = vProvider.crs()
wkbType = self.inputLayer.wkbType()
Expand All @@ -414,12 +412,12 @@ def runDensify( self ):
self.emit( SIGNAL( "rangeCalculated( PyQt_PyObject )" ), len( selection ) )
for f in selection:
featGeometry = QgsGeometry( f.geometry() )
attrMap = f.attributeMap()
attrMap = f.attributes()
newGeometry = densifyGeometry( featGeometry, int( self.tolerance ), isPolygon )

feature = QgsFeature()
feature.setGeometry( newGeometry )
feature.setAttributeMap( attrMap )
feature.setAttributes( attrMap )
shapeFileWriter.addFeature( feature )
featureId += 1
self.emit( SIGNAL( "featureProcessed()" ) )
Expand All @@ -433,14 +431,15 @@ def runDensify( self ):
else:
self.emit( SIGNAL( "rangeCalculated( PyQt_PyObject )" ), vProvider.featureCount() )
f = QgsFeature()
while vProvider.nextFeature( f ):
fit = vProvider.getFeatures()
while fit.nextFeature( f ):
featGeometry = QgsGeometry( f.geometry() )
attrMap = f.attributeMap()
attrMap = f.attributes()
newGeometry = densifyGeometry( featGeometry, int( self.tolerance ), isPolygon )

feature = QgsFeature()
feature.setGeometry( newGeometry )
feature.setAttributeMap( attrMap )
feature.setAttributes( attrMap )
shapeFileWriter.addFeature( feature )
featureId += 1
self.emit( SIGNAL( "featureProcessed()" ) )
Expand Down Expand Up @@ -478,7 +477,8 @@ def runDensify( self ):
vProvider = self.inputLayer.dataProvider()
self.emit( SIGNAL( "rangeCalculated( PyQt_PyObject )" ), vProvider.featureCount() )
f = QgsFeature()
while vProvider.nextFeature( f ):
fit = vProvider.getFeatures()
while fit.nextFeature( f ):
featureId = f.id()
featGeometry = QgsGeometry( f.geometry() )
newGeometry = densifyGeometry( featGeometry, int( self.tolerance ), isPolygon )
Expand Down
20 changes: 9 additions & 11 deletions python/plugins/fTools/tools/doSpatialJoin.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,14 +123,11 @@ def outFile(self):
def compute(self, inName, joinName, outName, summary, sumList, keep, progressBar):
layer1 = ftools_utils.getVectorLayerByName(inName)
provider1 = layer1.dataProvider()
allAttrs = provider1.attributeIndexes()
provider1.select(allAttrs)
fieldList1 = ftools_utils.getFieldList(layer1).values()

layer2 = ftools_utils.getVectorLayerByName(joinName)
provider2 = layer2.dataProvider()
allAttrs = provider2.attributeIndexes()
provider2.select(allAttrs)

fieldList2 = ftools_utils.getFieldList(layer2)
fieldList = []
if provider1.crs() != provider2.crs():
Expand Down Expand Up @@ -180,11 +177,12 @@ def compute(self, inName, joinName, outName, summary, sumList, keep, progressBar
progressBar.setValue(15)
start = 15.00
add = 85.00 / provider1.featureCount()
provider1.rewind()

index = ftools_utils.createIndex(provider2)
while provider1.nextFeature(inFeat):
fit1 = provider1.getFeatures()
while fit1.nextFeature(inFeat):
inGeom = inFeat.geometry()
atMap1 = inFeat.attributeMap()
atMap1 = inFeat.attributes()
outFeat.setGeometry(inGeom)
none = True
joinList = []
Expand All @@ -206,12 +204,12 @@ def compute(self, inName, joinName, outName, summary, sumList, keep, progressBar
count = 0
for i in joinList:
#tempGeom = i.geometry()
provider2.featureAtId(int(i), inFeatB , True, allAttrs)
provider2.getFeatures( QgsFeatureRequest().setFilterFid( int(i) ) ).nextFeature( inFeatB )
tmpGeom = QgsGeometry( inFeatB.geometry() )
if inGeom.intersects(tmpGeom):
count = count + 1
none = False
atMap2 = inFeatB.attributeMap()
atMap2 = inFeatB.attributes()
if not summary:
atMap = atMap1.values()
atMap2 = atMap2.values()
Expand All @@ -234,9 +232,9 @@ def compute(self, inName, joinName, outName, summary, sumList, keep, progressBar
atMap.append(QVariant(count))
atMap = dict(zip(seq, atMap))
if none:
outFeat.setAttributeMap(atMap1)
outFeat.setAttributes(atMap1)
else:
outFeat.setAttributeMap(atMap)
outFeat.setAttributes(atMap)
if keep: # keep all records
writer.addFeature(outFeat)
else: # keep only matching records
Expand Down
10 changes: 4 additions & 6 deletions python/plugins/fTools/tools/doSubsetSelect.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,9 +83,6 @@ def compute(self, inVect, inField, value, perc, progressBar):
mlayer = ftools_utils.getMapLayerByName(inVect)
mlayer.removeSelection(True)
vlayer = ftools_utils.getVectorLayerByName(inVect)
vprovider = vlayer.dataProvider()
allAttrs = vprovider.attributeIndexes()
vprovider.select(allAttrs)
index = vprovider.fieldNameIndex(inField)
#unique = []
#vprovider.uniqueValues(index, unique)
Expand All @@ -96,12 +93,13 @@ def compute(self, inVect, inField, value, perc, progressBar):
nElement = 0
self.progressBar.setValue(0)
self.progressBar.setRange(0, nFeat)
fit = vprovider.getFeatures()
if not len(unique) == mlayer.featureCount():
for i in unique:
vprovider.rewind()
fit.rewind()
FIDs= []
while vprovider.nextFeature(inFeat):
atMap = inFeat.attributeMap()
while fit.nextFeature(inFeat):
atMap = inFeat.attributes()
if atMap[index] == QVariant(i):
FID = inFeat.id()
FIDs.append(FID)
Expand Down
14 changes: 5 additions & 9 deletions python/plugins/fTools/tools/doSumLines.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,10 +100,6 @@ def compute(self, inPoly, inLns, inField, outPath, progressBar):
lineProvider = lineLayer.dataProvider()
if polyProvider.crs() <> lineProvider.crs():
QMessageBox.warning(self, self.tr("CRS warning!"), self.tr("Warning: Input layers have non-matching CRS.\nThis may cause unexpected results."))
allAttrs = polyProvider.attributeIndexes()
polyProvider.select(allAttrs)
allAttrs = lineProvider.attributeIndexes()
lineProvider.select(allAttrs)
fieldList = ftools_utils.getFieldList(polyLayer)
index = polyProvider.fieldNameIndex(unicode(inField))
if index == -1:
Expand All @@ -117,7 +113,6 @@ def compute(self, inPoly, inLns, inField, outPath, progressBar):
inGeom = QgsGeometry()
outGeom = QgsGeometry()
distArea = QgsDistanceArea()
lineProvider.rewind()
start = 15.00
add = 85.00 / polyProvider.featureCount()
check = QFile(self.shapefileName)
Expand All @@ -127,9 +122,10 @@ def compute(self, inPoly, inLns, inField, outPath, progressBar):
writer = QgsVectorFileWriter(self.shapefileName, self.encoding, fieldList, polyProvider.geometryType(), sRs)
#writer = QgsVectorFileWriter(outPath, "UTF-8", fieldList, polyProvider.geometryType(), sRs)
spatialIndex = ftools_utils.createIndex( lineProvider )
while polyProvider.nextFeature(inFeat):
polyFit = polyProvider.getFeatures()
while polyFit.nextFeature(inFeat):
inGeom = QgsGeometry(inFeat.geometry())
atMap = inFeat.attributeMap()
atMap = inFeat.attributes()
lineList = []
length = 0
#(check, lineList) = lineLayer.featuresInRectangle(inGeom.boundingBox(), True, False)
Expand All @@ -140,13 +136,13 @@ def compute(self, inPoly, inLns, inField, outPath, progressBar):
else: check = 1
if check == 0:
for i in lineList:
lineProvider.featureAtId( int( i ), inFeatB , True, allAttrs )
lineProvider.getFeatures( QgsFeatureRequest().setFilterFid( int(i) ) ).nextFeature( inFeatB )
tmpGeom = QgsGeometry( inFeatB.geometry() )
if inGeom.intersects(tmpGeom):
outGeom = inGeom.intersection(tmpGeom)
length = length + distArea.measure(outGeom)
outFeat.setGeometry(inGeom)
outFeat.setAttributeMap(atMap)
outFeat.setAttributes(atMap)
outFeat.addAttribute(index, QVariant(length))
writer.addFeature(outFeat)
start = start + 1
Expand Down
12 changes: 6 additions & 6 deletions python/plugins/fTools/tools/doValidate.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ def zoomToError(self, curr, prev):

ft = QgsFeature()
(fid,ok) = self.tblUnique.item(row, 0).text().toInt()
if not ok or not self.vlayer.featureAtId( fid, ft, True):
if not ok or not self.vlayer.getFeatures( QgsFeatureRequest().setFilterFid( fid ) ).nextFeature( ft ):
return

rect = mc.mapRenderer().layerExtentToOutputExtent( self.vlayer, ft.geometry().boundingBox() )
Expand Down Expand Up @@ -298,7 +298,8 @@ def check_geometry( self, vlayer ):
layer = []
vlayer.select([]) # select all features, and ignore attributes
ft = QgsFeature()
while vlayer.nextFeature(ft):
fit = vlayer.getFeatures()
while fit.nextFeature(ft):
layer.append(QgsFeature(ft))
nFeat = len(layer)
nElement = 0
Expand All @@ -317,8 +318,8 @@ def check_geometry( self, vlayer ):
self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), nFeat )

if self.writeShape:
fields = { 0 : QgsField( "FEAT_ID", QVariant.Int ),
1 : QgsField( "ERROR", QVariant.String ) }
fields = [ QgsField( "FEAT_ID", QVariant.Int ),
QgsField( "ERROR", QVariant.String ) ]
writer = QgsVectorFileWriter( self.myName, self.myEncoding, fields,
QGis.WKBPoint, vlayer.crs() )
for rec in lstErrors:
Expand All @@ -335,8 +336,7 @@ def check_geometry( self, vlayer ):
geometry = QgsGeometry().fromPoint( myPoint )
ft = QgsFeature()
ft.setGeometry( geometry )
ft.setAttributeMap( { 0 : QVariant( fidItem ),
1 : QVariant( message ) } )
ft.setAttributes( [ QVariant( fidItem ), QVariant( message ) ] )
writer.addFeature( ft )
del writer
return "writeShape"
Expand Down
12 changes: 7 additions & 5 deletions python/plugins/fTools/tools/doVectorSplit.py
Original file line number Diff line number Diff line change
Expand Up @@ -162,15 +162,16 @@ def run(self):
index = provider.fieldNameIndex(self.field)
unique = ftools_utils.getUniqueValues(provider, int(index))
baseName = unicode( outPath + self.layer.name() + "_" + self.field + "_" )
allAttrs = provider.attributeIndexes()
provider.select(allAttrs)

fieldList = ftools_utils.getFieldList(self.layer)
sRs = provider.crs()
geom = self.layer.wkbType()
inFeat = QgsFeature()

self.emit(SIGNAL("rangeCalculated(PyQt_PyObject)"), len(unique))

fit = provider.getFeatures()

for i in unique:
check = QFile(baseName + "_" + unicode(i.toString().trimmed()) + ".shp")
fName = check.fileName()
Expand All @@ -180,9 +181,10 @@ def run(self):
continue

writer = QgsVectorFileWriter(fName, self.encoding, fieldList, geom, sRs)
provider.rewind()
while provider.nextFeature(inFeat):
atMap = inFeat.attributeMap()

fit.rewind()
while fit.nextFeature(inFeat):
atMap = inFeat.attributes()
if atMap[index] == i:
writer.addFeature(inFeat)
del writer
Expand Down
33 changes: 13 additions & 20 deletions python/plugins/fTools/tools/doVisual.py
Original file line number Diff line number Diff line change
Expand Up @@ -236,9 +236,6 @@ def stop(self):

def list_unique_values( self, vlayer, myField ):
vprovider = vlayer.dataProvider()
allAttrs = vprovider.attributeIndexes()
vprovider.select( allAttrs )
fields = vprovider.fields()
index = vprovider.fieldNameIndex( myField )
unique = ftools_utils.getUniqueValues( vprovider, int( index ) )
lstUnique = []
Expand All @@ -256,9 +253,6 @@ def list_unique_values( self, vlayer, myField ):

def basic_statistics( self, vlayer, myField ):
vprovider = vlayer.dataProvider()
allAttrs = vprovider.attributeIndexes()
vprovider.select( allAttrs )
fields = vprovider.fields()
index = vprovider.fieldNameIndex( myField )
feat = QgsFeature()
sumVal = 0.0
Expand All @@ -279,7 +273,7 @@ def basic_statistics( self, vlayer, myField ):
self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), 0 )
self.emit( SIGNAL( "runRange(PyQt_PyObject)" ), ( 0, nFeat ) )
for f in selection:
atMap = f.attributeMap()
atMap = f.attributes()
lenVal = float( len( atMap[ index ].toString() ) )
if first:
minVal = lenVal
Expand All @@ -301,9 +295,9 @@ def basic_statistics( self, vlayer, myField ):
if nFeat > 0:
self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), 0 )
self.emit( SIGNAL( "runRange(PyQt_PyObject)" ), ( 0, nFeat ) )
vprovider.select( allAttrs )
while vprovider.nextFeature( feat ):
atMap = feat.attributeMap()
fit = vprovider.getFeatures()
while fit.nextFeature( feat ):
atMap = feat.attributes()
lenVal = float( len( atMap[ index ].toString() ) )
if first:
minVal = lenVal
Expand Down Expand Up @@ -348,7 +342,7 @@ def basic_statistics( self, vlayer, myField ):
self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), 0 )
self.emit( SIGNAL( "runRange(PyQt_PyObject)" ), ( 0, nFeat ) )
for f in selection:
atMap = f.attributeMap()
atMap = f.attributes()
value = float( atMap[ index ].toDouble()[ 0 ] )
if first:
minVal = value
Expand All @@ -367,9 +361,9 @@ def basic_statistics( self, vlayer, myField ):
if nFeat > 0:
self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), 0 )
self.emit( SIGNAL( "runRange(PyQt_PyObject)" ), ( 0, nFeat ) )
vprovider.select( allAttrs )
while vprovider.nextFeature( feat ):
atMap = feat.attributeMap()
fit = vprovider.getFeatures()
while fit.nextFeature( feat ):
atMap = feat.attributes()
value = float( atMap[ index ].toDouble()[ 0 ] )
if first:
minVal = value
Expand Down Expand Up @@ -415,10 +409,6 @@ def basic_statistics( self, vlayer, myField ):

def nearest_neighbour_analysis( self, vlayer ):
vprovider = vlayer.dataProvider()
allAttrs = vprovider.attributeIndexes()
vprovider.select( allAttrs )
feat = QgsFeature()
neighbour = QgsFeature()
sumDist = 0.00
distance = QgsDistanceArea()
A = vlayer.extent()
Expand All @@ -430,9 +420,12 @@ def nearest_neighbour_analysis( self, vlayer ):
if nFeat > 0:
self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), 0 )
self.emit( SIGNAL( "runRange(PyQt_PyObject)" ), ( 0, nFeat ) )
while vprovider.nextFeature( feat ):
feat = QgsFeature()
neighbour = QgsFeature()
fit = vprovider.getFeatures()
while fit.nextFeature( feat ):
neighbourID = index.nearestNeighbor( feat.geometry().asPoint(), 2 )[ 1 ]
vprovider.featureAtId( neighbourID, neighbour, True, [] )
vprovider.getFeatures( QgsFeatureRequest().setFilterFid( neighbourID ).setSubsetOfAttributes( [] ) ).nextFeature( neighbour )
nearDist = distance.measureLine( neighbour.geometry().asPoint(), feat.geometry().asPoint() )
sumDist += nearDist
nElement += 1
Expand Down
50 changes: 15 additions & 35 deletions python/plugins/fTools/tools/ftools_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@
# Utility functions
# -------------------------------------------------
#
# combineVectorAttributes( QgsAttributeMap, QgsAttributeMap )
# convertFieldNameType( QgsField.name() )
# combineVectorFields( QgsVectorLayer, QgsVectorLayer )
# checkCRSCompatibility( QgsCoordinateReferenceSystem, QgsCoordinateReferenceSystem )
Expand Down Expand Up @@ -63,15 +62,6 @@

import locale

# From two input attribute maps, create single attribute map
def combineVectorAttributes( atMapA, atMapB ):
attribA = atMapA.values()
lengthA = len(attribA)
attribB = atMapB.values()
lengthB = len(attribB)
attribA.extend( attribB )
return dict( zip( range( 0, lengthB + lengthA ), attribA ) )

# For use with memory provider/layer, converts full field type to simple string
def convertFieldNameType( inName ):
if inName == "Integer":
Expand All @@ -83,12 +73,10 @@ def convertFieldNameType( inName ):

# From two input field maps, create single field map
def combineVectorFields( layerA, layerB ):
fieldsA = layerA.dataProvider().fields().values()
fieldsB = layerB.dataProvider().fields().values()
fieldsA = layerA.dataProvider().fields()
fieldsB = layerB.dataProvider().fields()
fieldsB = testForUniqueness( fieldsA, fieldsB )
seq = range( 0, len( fieldsA ) + len( fieldsB ) )
fieldsA.extend( fieldsB )
fieldsA = dict( zip ( seq, fieldsA ) )
return fieldsA

# Check if two input CRSs are identical
Expand Down Expand Up @@ -258,20 +246,14 @@ def getMapLayerByName( myName ):

# Return the field list of a vector layer
def getFieldList( vlayer ):
vprovider = vlayer.dataProvider()
feat = QgsFeature()
allAttrs = vprovider.attributeIndexes()
vprovider.select( allAttrs )
myFields = vprovider.fields()
return myFields
return vlayer.dataProvider().fields()

# Convinience function to create a spatial index for input QgsVectorDataProvider
def createIndex( provider ):
feat = QgsFeature()
index = QgsSpatialIndex()
provider.rewind()
provider.select()
while provider.nextFeature( feat ):
fit = provider.getFeatures()
while fit.nextFeature( feat ):
index.insertFeature( feat )
return index

Expand All @@ -292,8 +274,7 @@ def addShapeToCanvas( shapefile_path ):

# Return all unique values in field based on field index
def getUniqueValues( provider, index ):
values = provider.uniqueValues( index )
return values
return provider.uniqueValues( index )

# Generate a save file dialog with a dropdown box for choosing encoding style
def saveDialog( parent, filtering="Shapefiles (*.shp *.SHP)"):
Expand Down Expand Up @@ -348,29 +329,28 @@ def dirDialog( parent ):

# Return field type from it's name
def getFieldType(vlayer, fieldName):
fields = vlayer.dataProvider().fields()
for name, field in fields.iteritems():
for field in vlayer.dataProvider().fields():
if field.name() == fieldName:
return field.typeName()

# return the number of unique values in field
def getUniqueValuesCount( vlayer, fieldIndex, useSelection ):
vprovider = vlayer.dataProvider()
allAttrs = vprovider.attributeIndexes()
vprovider.select( allAttrs )
count = 0
values = []
if useSelection:
selection = vlayer.selectedFeatures()
for f in selection:
if f.attributeMap()[ fieldIndex ].toString() not in values:
values.append( f.attributeMap()[ fieldIndex ].toString() )
v = f.attributes()[ fieldIndex ].toString()
if v not in values:
values.append( v )
count += 1
else:
feat = QgsFeature()
while vprovider.nextFeature( feat ):
if feat.attributeMap()[ fieldIndex ].toString() not in values:
values.append( feat.attributeMap()[ fieldIndex ].toString() )
fit = vlayer.dataProvider().getFeatures()
while fit.nextFeature( feat ):
v = feat.attributes()[ fieldIndex ].toString()
if v not in values:
values.append( v )
count += 1
return count

Expand Down