def compute(self, inVect, inField, value, perc, progressBar): mlayer = ftools_utils.getMapLayerByName(inVect) mlayer.removeSelection() vlayer = ftools_utils.getVectorLayerByName(inVect) vprovider = vlayer.dataProvider() index = vprovider.fieldNameIndex(inField) unique = ftools_utils.getUniqueValues(vprovider, int(index)) inFeat = QgsFeature() selran = [] nFeat = vprovider.featureCount() * len(unique) nElement = 0 self.progressBar.setValue(0) self.progressBar.setRange(0, nFeat) fit = vprovider.getFeatures() if not len(unique) == mlayer.featureCount(): for i in unique: fit.rewind() FIDs = [] while fit.nextFeature(inFeat): atMap = inFeat.attributes() if atMap[index] == i: FID = inFeat.id() FIDs.append(FID) nElement += 1 self.progressBar.setValue(nElement) if perc: selVal = int(round((value / 100.0000) * len(FIDs), 0)) else: selVal = value if selVal >= len(FIDs): selFeat = FIDs else: selFeat = random.sample(FIDs, selVal) selran.extend(selFeat) mlayer.setSelectedFeatures(selran) else: mlayer.setSelectedFeatures(range(0, mlayer.featureCount()))
def run(self): self.mutex.lock() self.stopMe = 0 self.mutex.unlock() interrupted = False outPath = QString(self.outDir) if outPath.contains("\\"): outPath.replace("\\", "/") if not outPath.endsWith("/"): outPath = outPath + "/" provider = self.layer.dataProvider() 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)) for i in unique: check = QFile(baseName + "_" + unicode(i.toString().trimmed()) + ".shp") fName = check.fileName() if check.exists(): if not QgsVectorFileWriter.deleteShapeFile(fName): self.errors.append(fName) continue writer = QgsVectorFileWriter(fName, self.encoding, fieldList, geom, sRs) provider.rewind() while provider.nextFeature(inFeat): atMap = inFeat.attributeMap() if atMap[index] == i: writer.addFeature(inFeat) del writer self.emit(SIGNAL("valueProcessed()")) self.mutex.lock() s = self.stopMe self.mutex.unlock() if s == 1: interrupted = True break if not interrupted: self.emit(SIGNAL("processFinished( PyQt_PyObject )"), self.errors) else: self.emit(SIGNAL("processInterrupted()"))
def compute(self, inVect, inField, value, perc, progressBar): mlayer = ftools_utils.getMapLayerByName(inVect) mlayer.removeSelection() vlayer = ftools_utils.getVectorLayerByName(inVect) vprovider = vlayer.dataProvider() index = vprovider.fieldNameIndex(inField) unique = ftools_utils.getUniqueValues(vprovider, int(index)) inFeat = QgsFeature() selran = [] nFeat = vprovider.featureCount() * len(unique) nElement = 0 self.progressBar.setValue(0) self.progressBar.setRange(0, nFeat) if not len(unique) == mlayer.featureCount(): for i in unique: fit = vprovider.getFeatures() FIDs= [] while fit.nextFeature(inFeat): atMap = inFeat.attributes() if atMap[index] == i: FID = inFeat.id() FIDs.append(FID) nElement += 1 self.progressBar.setValue(nElement) if perc: selVal = int(round((value / 100.0000) * len(FIDs), 0)) else: selVal = value if selVal >= len(FIDs): selFeat = FIDs else: selFeat = random.sample(FIDs, selVal) selran.extend(selFeat) mlayer.setSelectedFeatures(selran) else: mlayer.setSelectedFeatures(range(0, mlayer.featureCount()))
def split(self, vlayer, outPath, inField, progressBar): provider = vlayer.dataProvider() #unique = [] index = provider.fieldNameIndex(inField) #provider.uniqueValues(index, unique) unique = ftools_utils.getUniqueValues(vlayer.dataProvider(), int(index)) baseName = unicode( outPath + vlayer.name() + "_" + inField + "_" ) allAttrs = provider.attributeIndexes() provider.select(allAttrs) fieldList = ftools_utils.getFieldList(vlayer) sRs = provider.crs() inFeat = QgsFeature() progressBar.setValue(20) start = 20.00 add = 80.00 / len(unique) for i in unique: check = QFile(baseName + "_" + unicode(i) + ".shp") if check.exists(): if not QgsVectorFileWriter.deleteShapeFile(baseName + "_" + unicode(i.toString().trimmed()) + ".shp"): return writer = QgsVectorFileWriter(baseName + "_" + unicode(i.toString().trimmed()) + ".shp", self.encoding, fieldList, vlayer.dataProvider().geometryType(), sRs) provider.rewind() while provider.nextFeature(inFeat): atMap = inFeat.attributeMap() #changed from QVariant(i) to below: if atMap[index] == i: writer.addFeature(inFeat) del writer start = start + add progressBar.setValue(start)
def run(self): self.mutex.lock() self.stopMe = 0 self.mutex.unlock() interrupted = False outPath = QString(self.outDir) if outPath.contains("\\"): outPath.replace("\\", "/") if not outPath.endsWith("/"): outPath = outPath + "/" provider = self.layer.dataProvider() index = provider.fieldNameIndex(self.field) unique = ftools_utils.getUniqueValues(provider, int(index)) baseName = unicode( outPath + self.layer.name() + "_" + self.field + "_" ) 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() if check.exists(): if not QgsVectorFileWriter.deleteShapeFile(fName): self.errors.append( fName ) continue writer = QgsVectorFileWriter(fName, self.encoding, fieldList, geom, sRs) fit.rewind() while fit.nextFeature(inFeat): atMap = inFeat.attributes() if atMap[index] == i: writer.addFeature(inFeat) del writer self.emit(SIGNAL("valueProcessed()")) self.mutex.lock() s = self.stopMe self.mutex.unlock() if s == 1: interrupted = True break if not interrupted: self.emit(SIGNAL("processFinished( PyQt_PyObject )"), self.errors) else: self.emit(SIGNAL("processInterrupted()"))
def single_to_multi(self): vprovider = self.vlayer.dataProvider() allAttrs = vprovider.attributeIndexes() vprovider.select(allAttrs) fields = vprovider.fields() allValid = True geomType = self.singleToMultiGeom(vprovider.geometryType()) writer = QgsVectorFileWriter(self.myName, self.myEncoding, fields, geomType, vprovider.crs()) inFeat = QgsFeature() outFeat = QgsFeature() inGeom = QgsGeometry() outGeom = QgsGeometry() index = vprovider.fieldNameIndex(self.myField) if not index == -1: unique = ftools_utils.getUniqueValues(vprovider, int(index)) else: unique = [QVariant(QString())] nFeat = vprovider.featureCount() * len(unique) nElement = 0 self.emit(SIGNAL("runStatus(PyQt_PyObject)"), 0) self.emit(SIGNAL("runRange(PyQt_PyObject)"), (0, nFeat)) merge_all = self.myField == QString("--- " + self.tr("Merge all") + " ---") if not len( unique ) == self.vlayer.featureCount() \ or merge_all: for i in unique: vprovider.rewind() multi_feature = [] first = True vprovider.select(allAttrs) while vprovider.nextFeature(inFeat): atMap = inFeat.attributeMap() if not merge_all: idVar = atMap[index] else: idVar = QVariant(QString()) if idVar.toString().trimmed() == i.toString().trimmed() \ or merge_all: if first: atts = atMap first = False inGeom = QgsGeometry(inFeat.geometry()) vType = inGeom.type() feature_list = self.extractAsMulti(inGeom) multi_feature.extend(feature_list) nElement += 1 self.emit(SIGNAL("runStatus(PyQt_PyObject)"), nElement) outFeat.setAttributeMap(atts) outGeom = QgsGeometry( self.convertGeometry(multi_feature, vType)) if not outGeom.isGeosValid(): allValid = "valid_error" outFeat.setGeometry(outGeom) writer.addFeature(outFeat) del writer else: return "attr_error" return allValid
def single_to_multi( self ): vprovider = self.vlayer.dataProvider() allAttrs = vprovider.attributeIndexes() vprovider.select( allAttrs ) fields = vprovider.fields() allValid = True geomType = self.singleToMultiGeom(vprovider.geometryType()) writer = QgsVectorFileWriter( self.myName, self.myEncoding, fields, geomType, vprovider.crs() ) inFeat = QgsFeature() outFeat = QgsFeature() inGeom = QgsGeometry() outGeom = QgsGeometry() index = vprovider.fieldNameIndex( self.myField ) if not index == -1: unique = ftools_utils.getUniqueValues( vprovider, int( index ) ) else: unique = [QVariant(QString())] nFeat = vprovider.featureCount() * len( unique ) nElement = 0 self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), 0 ) self.emit( SIGNAL( "runRange(PyQt_PyObject)" ), ( 0, nFeat ) ) merge_all = self.myField == QString("--- " + self.tr( "Merge all" ) + " ---") if not len( unique ) == self.vlayer.featureCount() \ or merge_all: for i in unique: vprovider.rewind() multi_feature= [] first = True vprovider.select(allAttrs) while vprovider.nextFeature( inFeat ): atMap = inFeat.attributeMap() if not merge_all: idVar = atMap[ index ] else: idVar = QVariant(QString()) if idVar.toString().trimmed() == i.toString().trimmed() \ or merge_all: if first: atts = atMap first = False inGeom = QgsGeometry( inFeat.geometry() ) vType = inGeom.type() feature_list = self.extractAsMulti( inGeom ) multi_feature.extend( feature_list ) nElement += 1 self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), nElement ) outFeat.setAttributeMap( atts ) outGeom = QgsGeometry( self.convertGeometry(multi_feature, vType) ) if not outGeom.isGeosValid(): allValid = "valid_error" outFeat.setGeometry(outGeom) writer.addFeature(outFeat) del writer else: return "attr_error" return allValid
def list_unique_values(self, vlayer, myField): vprovider = vlayer.dataProvider() index = vprovider.fieldNameIndex(myField) unique = ftools_utils.getUniqueValues(vprovider, int(index)) lstUnique = [] nFeat = len(unique) nElement = 0 if nFeat > 0: self.emit(SIGNAL("runStatus(PyQt_PyObject)"), 0) self.emit(SIGNAL("runRange(PyQt_PyObject)"), (0, nFeat)) for item in unique: nElement += 1 self.emit(SIGNAL("runStatus(PyQt_PyObject)"), nElement) lstUnique.append(unicode(item).strip()) lstCount = len(unique) return (lstUnique, lstCount)
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 = [] nFeat = len( unique ) nElement = 0 if nFeat > 0: self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), 0 ) self.emit( SIGNAL( "runRange(PyQt_PyObject)" ), ( 0, nFeat ) ) for item in unique: nElement += 1 self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), nElement ) lstUnique.append(item.toString().trimmed()) lstCount = len( unique ) return ( lstUnique, lstCount )
def split(self, vlayer, outPath, inField, progressBar): provider = vlayer.dataProvider() #unique = [] index = provider.fieldNameIndex(inField) #provider.uniqueValues(index, unique) unique = ftools_utils.getUniqueValues(vlayer.dataProvider(), int(index)) baseName = unicode(outPath + vlayer.name() + "_" + inField + "_") allAttrs = provider.attributeIndexes() provider.select(allAttrs) fieldList = ftools_utils.getFieldList(vlayer) sRs = provider.crs() inFeat = QgsFeature() progressBar.setValue(20) start = 20.00 add = 80.00 / len(unique) for i in unique: check = QFile(baseName + "_" + unicode(i) + ".shp") if check.exists(): if not QgsVectorFileWriter.deleteShapeFile( baseName + "_" + unicode(i.toString().trimmed()) + ".shp"): return writer = QgsVectorFileWriter( baseName + "_" + unicode(i.toString().trimmed()) + ".shp", self.encoding, fieldList, vlayer.dataProvider().geometryType(), sRs) provider.rewind() while provider.nextFeature(inFeat): atMap = inFeat.attributeMap() #changed from QVariant(i) to below: if atMap[index] == i: writer.addFeature(inFeat) del writer start = start + add progressBar.setValue(start)
def compute(self, inName, outName, weightField="", times=1, uniqueField=""): vlayer = ftools_utils.getVectorLayerByName(inName) provider = vlayer.dataProvider() weightIndex = provider.fieldNameIndex(weightField) uniqueIndex = provider.fieldNameIndex(uniqueField) feat = QgsFeature() sRs = provider.crs() check = QFile(self.shapefileName) if check.exists(): if not QgsVectorFileWriter.deleteShapeFile(self.shapefileName): return if uniqueIndex <> -1: uniqueValues = ftools_utils.getUniqueValues( provider, int(uniqueIndex)) single = False else: uniqueValues = [QVariant(1)] single = True if self.function == 2: fieldList = QgsFields() fieldList.append(QgsField("STD_DIST", QVariant.Double)) fieldList.append(QgsField("UID", QVariant.String)) writer = QgsVectorFileWriter(self.shapefileName, self.encoding, fieldList, QGis.WKBPolygon, sRs) else: fieldList = QgsFields() fieldList.append(QgsField("MEAN_X", QVariant.Double)) fieldList.append(QgsField("MEAN_Y", QVariant.Double)) fieldList.append(QgsField("UID", QVariant.String)) writer = QgsVectorFileWriter(self.shapefileName, self.encoding, fieldList, QGis.WKBPoint, sRs) outfeat = QgsFeature() points = [] weights = [] nFeat = provider.featureCount() * len(uniqueValues) nElement = 0 self.progressBar.setValue(0) self.progressBar.setRange(0, nFeat) for j in uniqueValues: cx = 0.00 cy = 0.00 points = [] weights = [] fit = provider.getFeatures() while fit.nextFeature(feat): nElement += 1 self.progressBar.setValue(nElement) if single: check = j.toString().trimmed() else: 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.attributes()[weightIndex].toDouble()[0]) geom = QgsGeometry(feat.geometry()) geom = ftools_utils.extractPoints(geom) for i in geom: cx += i.x() cy += i.y() points.append(QgsPoint((cx / len(geom)), (cy / len(geom)))) weights.append(weight) sumWeight = sum(weights) cx = 0.00 cy = 0.00 item = 0 for item, i in enumerate(points): cx += i.x() * weights[item] cy += i.y() * weights[item] cx = cx / sumWeight cy = cy / sumWeight meanPoint = QgsPoint(cx, cy) if self.function == 2: values = [] md = 0.00 sd = 0.00 dist = QgsDistanceArea() item = 0 for i in points: tempDist = dist.measureLine(i, meanPoint) values.append(tempDist) item += 1 md += tempDist md = md / item for i in values: sd += (i - md) * (i - md) sd = sqrt(sd / item) outfeat.setGeometry( QgsGeometry.fromPoint(meanPoint).buffer(sd * times, 10)) outfeat.setAttribute(0, QVariant(sd)) outfeat.setAttribute(1, QVariant(j)) else: outfeat.setGeometry(QgsGeometry.fromPoint(meanPoint)) outfeat.setAttribute(0, QVariant(cx)) outfeat.setAttribute(1, QVariant(cy)) outfeat.setAttribute(2, QVariant(j)) writer.addFeature(outfeat) if single: break del writer
def compute(self, inName, outName, weightField="", times=1, uniqueField=""): vlayer = ftools_utils.getVectorLayerByName(inName) provider = vlayer.dataProvider() 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(): if not QgsVectorFileWriter.deleteShapeFile(self.shapefileName): return if uniqueIndex <> -1: uniqueValues = ftools_utils.getUniqueValues(provider, int( uniqueIndex ) ) single = False else: uniqueValues = [QVariant(1)] single = True if self.function == 2: fieldList = { 0 : QgsField("STD_DIST", QVariant.Double), 1 : QgsField("UID", QVariant.String) } writer = QgsVectorFileWriter(self.shapefileName, self.encoding, fieldList, QGis.WKBPolygon, sRs) else: fieldList = { 0 : QgsField("MEAN_X", QVariant.Double), 1 : QgsField("MEAN_Y", QVariant.Double), 2 : QgsField("UID", QVariant.String) } writer = QgsVectorFileWriter(self.shapefileName, self.encoding, fieldList, QGis.WKBPoint, sRs) outfeat = QgsFeature() points = [] weights = [] nFeat = provider.featureCount() * len(uniqueValues) nElement = 0 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): nElement += 1 self.progressBar.setValue(nElement) if single: check = j.toString().trimmed() else: check = feat.attributeMap()[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]) geom = QgsGeometry(feat.geometry()) geom = ftools_utils.extractPoints(geom) for i in geom: cx += i.x() cy += i.y() points.append(QgsPoint((cx / len(geom)), (cy / len(geom)))) weights.append(weight) sumWeight = sum(weights) cx = 0.00 cy = 0.00 item = 0 for item, i in enumerate(points): cx += i.x() * weights[item] cy += i.y() * weights[item] cx = cx / sumWeight cy = cy / sumWeight meanPoint = QgsPoint(cx, cy) if self.function == 2: values = [] md = 0.00 sd = 0.00 dist = QgsDistanceArea() item = 0 for i in points: tempDist = dist.measureLine(i, meanPoint) values.append(tempDist) item += 1 md += tempDist md = md / item for i in values: sd += (i-md)*(i-md) sd = sqrt(sd/item) outfeat.setGeometry(QgsGeometry.fromPoint(meanPoint).buffer(sd * times, 10)) outfeat.addAttribute(0, QVariant(sd)) outfeat.addAttribute(1, QVariant(j)) else: outfeat.setGeometry(QgsGeometry.fromPoint(meanPoint)) outfeat.addAttribute(0, QVariant(cx)) outfeat.addAttribute(1, QVariant(cy)) outfeat.addAttribute(2, QVariant(j)) writer.addFeature(outfeat) if single: break del writer
def single_to_multi( self ): vprovider = self.vlayer.dataProvider() allValid = True geomType = self.singleToMultiGeom( vprovider.geometryType() ) writer = QgsVectorFileWriter( self.myName, self.myEncoding, vprovider.fields(), geomType, vprovider.crs() ) inFeat = QgsFeature() outFeat = QgsFeature() inGeom = QgsGeometry() outGeom = QgsGeometry() index = vprovider.fieldNameIndex( self.myField ) if not index == -1: unique = ftools_utils.getUniqueValues( vprovider, int( index ) ) else: unique = [ "" ] nFeat = vprovider.featureCount() * len( unique ) nElement = 0 self.emit( SIGNAL( "runStatus( PyQt_PyObject )" ), 0 ) self.emit( SIGNAL( "runRange( PyQt_PyObject )" ), ( 0, nFeat ) ) merge_all = self.myField == "--- " + self.tr( "Merge all" ) + " ---" if not len( unique ) == self.vlayer.featureCount() or merge_all: for i in unique: # Strip spaces for strings, so " A " and "A" will be grouped # TODO: Make this optional (opt-out to keep it easy for beginners) if isinstance( i, basestring ): iMod = i.strip() else: iMod = i multi_feature= [] first = True fit = vprovider.getFeatures() while fit.nextFeature( inFeat ): atMap = inFeat.attributes() if not merge_all: idVar = atMap[ index ] if isinstance( idVar, basestring ): idVarMod = idVar.strip() else: idVarMod = idVar else: idVarMod = "" if idVarMod == iMod or merge_all: if first: atts = atMap first = False inGeom = QgsGeometry( inFeat.geometry() ) vType = inGeom.type() feature_list = self.extractAsMulti( inGeom ) multi_feature.extend( feature_list ) nElement += 1 self.emit( SIGNAL( "runStatus( PyQt_PyObject )" ), nElement ) if not first: outFeat.setAttributes( atts ) outGeom = QgsGeometry( self.convertGeometry( multi_feature, vType ) ) if not outGeom.isGeosValid(): allValid = "valid_error" outFeat.setGeometry( outGeom ) writer.addFeature( outFeat ) del writer else: return "attr_error" return allValid
def single_to_multi(self): vprovider = self.vlayer.dataProvider() allValid = True geomType = self.singleToMultiGeom(vprovider.geometryType()) writer = QgsVectorFileWriter(self.myName, self.myEncoding, vprovider.fields(), geomType, vprovider.crs()) inFeat = QgsFeature() outFeat = QgsFeature() inGeom = QgsGeometry() outGeom = QgsGeometry() index = vprovider.fieldNameIndex(self.myField) if not index == -1: unique = ftools_utils.getUniqueValues(vprovider, int(index)) else: unique = [""] nFeat = vprovider.featureCount() * len(unique) nElement = 0 self.emit(SIGNAL("runStatus( PyQt_PyObject )"), 0) self.emit(SIGNAL("runRange( PyQt_PyObject )"), (0, nFeat)) merge_all = self.myField == "--- " + self.tr("Merge all") + " ---" if not len(unique) == self.vlayer.featureCount() or merge_all: for i in unique: # Strip spaces for strings, so " A " and "A" will be grouped # TODO: Make this optional (opt-out to keep it easy for beginners) if isinstance(i, basestring): iMod = i.strip() else: iMod = i multi_feature = [] first = True fit = vprovider.getFeatures() while fit.nextFeature(inFeat): atMap = inFeat.attributes() if not merge_all: idVar = atMap[index] if isinstance(idVar, basestring): idVarMod = idVar.strip() else: idVarMod = idVar else: idVarMod = "" if idVarMod == iMod or merge_all: if first: atts = atMap first = False inGeom = QgsGeometry(inFeat.geometry()) vType = inGeom.type() feature_list = self.extractAsMulti(inGeom) multi_feature.extend(feature_list) nElement += 1 self.emit(SIGNAL("runStatus( PyQt_PyObject )"), nElement) if not first: outFeat.setAttributes(atts) outGeom = QgsGeometry(self.convertGeometry(multi_feature, vType)) if not outGeom.isGeosValid(): allValid = "valid_error" outFeat.setGeometry(outGeom) writer.addFeature(outFeat) del writer else: return "attr_error" return allValid