def update(self, inputLayer): self.inField.clear() self.idVariable.clear() inputLayer = unicode(self.inShape.currentText()) if inputLayer != "": changedLayer = ftools_utils.getVectorLayerByName(inputLayer) changedField = ftools_utils.getFieldList(changedLayer) changedID = ftools_utils.getFieldList(changedLayer) for i in changedField: if changedField[i].typeName() != "String": self.inField.addItem(unicode(changedField[i].name())) for i in changedID: if changedID[i].typeName() != "String": self.idVariable.addItem(unicode(changedID[i].name()))
def update(self,inputLayer): self.inField.clear() self.idVariable.clear() inputLayer=unicode(self.inShape.currentText()) if inputLayer != "": changedLayer=ftools_utils.getVectorLayerByName(inputLayer) changedField=ftools_utils.getFieldList(changedLayer) changedID=ftools_utils.getFieldList(changedLayer) for i in changedField: if changedField[i].typeName() != "String": self.inField.addItem(unicode(changedField[i].name())) for i in changedID: if changedID[i].typeName() != "String": self.idVariable.addItem(unicode(changedID[i].name()))
def fillInputAttrib(self, inputFile): self.layer = QgsVectorLayer(unicode(self.inputLayerCombo.currentText()).encode('utf8'), inputFile , "ogr") self.lineAttrib.clear() changedField = ftools_utils.getFieldList(self.layer) for f in changedField: if f.type() == QVariant.Int or f.type() == QVariant.String or f.type()==QVariant.Double: self.lineAttrib.addItem(unicode(f.name()))
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 update2(self, inputLayer): self.inField2.clear() changedLayer = ftools_utils.getVectorLayerByName(unicode(inputLayer)) changedField = ftools_utils.getFieldList(changedLayer) for f in changedField: if f.type() == QVariant.Int or f.type() == QVariant.String: self.inField2.addItem(unicode(f.name()))
def update1(self, inputLayer): self.inField1.clear() changedLayer = ftools_utils.getVectorLayerByName(unicode(inputLayer)) changedField = ftools_utils.getFieldList(changedLayer) for f in changedField: if f.type() == QVariant.Int or f.type() == QVariant.String: self.inField1.addItem(unicode(f.name()))
def compute(self, inPoly, inLns, inField, outPath, progressBar): polyLayer = ftools_utils.getVectorLayerByName(inPoly) lineLayer = ftools_utils.getVectorLayerByName(inLns) polyProvider = polyLayer.dataProvider() 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." )) fieldList = ftools_utils.getFieldList(polyLayer) index = polyProvider.fieldNameIndex(unicode(inField)) if index == -1: index = polyProvider.fields().count() fieldList.append( QgsField(unicode(inField), QVariant.Double, "real", 24, 15, self.tr("length field"))) sRs = polyProvider.crs() inFeat = QgsFeature() inFeatB = QgsFeature() outFeat = QgsFeature() inGeom = QgsGeometry() outGeom = QgsGeometry() distArea = QgsDistanceArea() start = 15.00 add = 85.00 / polyProvider.featureCount() check = QFile(self.shapefileName) if check.exists(): if not QgsVectorFileWriter.deleteShapeFile(self.shapefileName): return writer = QgsVectorFileWriter(self.shapefileName, self.encoding, fieldList, polyProvider.geometryType(), sRs) spatialIndex = ftools_utils.createIndex(lineProvider) polyFit = polyProvider.getFeatures() while polyFit.nextFeature(inFeat): inGeom = QgsGeometry(inFeat.geometry()) atMap = inFeat.attributes() lineList = [] length = 0 lineList = spatialIndex.intersects(inGeom.boundingBox()) if len(lineList) > 0: check = 0 else: check = 1 if check == 0: for i in lineList: 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) atMap.append(QVariant(length)) outFeat.setAttributes(atMap) #outFeat.setAttribute(index, QVariant(length)) writer.addFeature(outFeat) start = start + 1 progressBar.setValue(start) del writer
def reProject(self, inName, outPath, outProj, predefined, progressBar): vlayer = ftools_utils.getVectorLayerByName(inName) provider = vlayer.dataProvider() feat = QgsFeature() allAttrs = provider.attributeIndexes() progressBar.setValue(2) provider.select(allAttrs) fieldList = ftools_utils.getFieldList(vlayer) crsDest = QgsCoordinateReferenceSystem() if predefined: crsDest.createFromProj4(outProj) else: destLayer = ftools_utils.getVectorLayerByName(outProj) crsDest = destLayer.dataProvider().crs() if not crsDest.isValid(): QMessageBox.information(self, self.tr("Export to new projection"), self.tr("Output spatial reference system is not valid")) return False else: progressBar.setValue(5) crsSrc = provider.crs() if crsSrc != crsDest: xform = QgsCoordinateTransform(crsSrc, crsDest) progressBar.setValue(10) check = QFile(self.shapefileName) if check.exists(): if not QgsVectorFileWriter.deleteShapeFile(self.shapefileName): return error = QgsVectorFileWriter.writeAsShapefile(vlayer, self.shapefileName, self.encoding, crsDest, False) if error == QgsVectorFileWriter.NoError: return True else: return False else: QMessageBox.information(self, self.tr("Export to new projection"), self.tr("Identical output spatial reference system chosen")) return False
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 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 compute(self, inPoly, inLns, inField, outPath, progressBar): polyLayer = ftools_utils.getVectorLayerByName(inPoly) lineLayer = ftools_utils.getVectorLayerByName(inLns) polyProvider = polyLayer.dataProvider() 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: index = polyProvider.fieldCount() field = QgsField(unicode(inField), QVariant.Double, "real", 24, 15, self.tr("length field")) fieldList[index] = field sRs = polyProvider.crs() inFeat = QgsFeature() inFeatB = QgsFeature() outFeat = QgsFeature() inGeom = QgsGeometry() outGeom = QgsGeometry() distArea = QgsDistanceArea() lineProvider.rewind() start = 15.00 add = 85.00 / polyProvider.featureCount() check = QFile(self.shapefileName) if check.exists(): if not QgsVectorFileWriter.deleteShapeFile(self.shapefileName): return 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): inGeom = QgsGeometry(inFeat.geometry()) atMap = inFeat.attributeMap() lineList = [] length = 0 #(check, lineList) = lineLayer.featuresInRectangle(inGeom.boundingBox(), True, False) #lineLayer.select(inGeom.boundingBox(), False) #lineList = lineLayer.selectedFeatures() lineList = spatialIndex.intersects(inGeom.boundingBox()) if len(lineList) > 0: check = 0 else: check = 1 if check == 0: for i in lineList: lineProvider.featureAtId( int( i ), inFeatB , True, allAttrs ) tmpGeom = QgsGeometry( inFeatB.geometry() ) if inGeom.intersects(tmpGeom): outGeom = inGeom.intersection(tmpGeom) length = length + distArea.measure(outGeom) outFeat.setGeometry(inGeom) outFeat.setAttributeMap(atMap) outFeat.addAttribute(index, QVariant(length)) writer.addFeature(outFeat) start = start + 1 progressBar.setValue(start) del writer
def update2(self, inputLayer): self.inField2.clear() changedLayer = ftools_utils.getVectorLayerByName(unicode(inputLayer)) changedField = ftools_utils.getFieldList(changedLayer) for i in changedField: if changedField[i].type() == QVariant.Int or \ changedField[i].type() == QVariant.String: self.inField2.addItem(unicode(changedField[i].name()))
def update(self, inputLayer): self.inField.clear() changedLayer = ftools_utils.getVectorLayerByName(inputLayer) changedField = ftools_utils.getFieldList(changedLayer) for f in changedField: self.inField.addItem(unicode(f.name())) maxFeatures = changedLayer.dataProvider().featureCount() self.spnNumber.setMaximum(maxFeatures)
def update1(self, inputLayer): self.inField1.clear() changedLayer = ftools_utils.getVectorLayerByName(unicode(inputLayer)) changedField = ftools_utils.getFieldList(changedLayer) for i in changedField: if changedField[i].type() == QVariant.Int or \ changedField[i].type() == QVariant.String: self.inField1.addItem(unicode(changedField[i].name()))
def jupdate(self): inputLayer = self.joinShape.currentText() if inputLayer != "": changedLayer = ftools_utils.getVectorLayerByName(unicode(inputLayer)) changedField = ftools_utils.getFieldList(changedLayer) self.joinField.clear() for i in changedField: self.joinField.addItem(unicode(changedField[i].name()))
def update( self ): self.cmbField.clear() inputLayer = unicode( self.inShape.currentText() ) if inputLayer != "": changedLayer = ftools_utils.getVectorLayerByName( inputLayer ) changedField = ftools_utils.getFieldList( changedLayer ) for f in changedField: self.cmbField.addItem( unicode( f.name() ) ) self.cmbField.addItem( "--- " + self.tr( "Merge all" ) + " ---" )
def compute(self, inPoly, inLns, inField, outPath, progressBar): polyLayer = ftools_utils.getVectorLayerByName(inPoly) lineLayer = ftools_utils.getVectorLayerByName(inLns) polyProvider = polyLayer.dataProvider() 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."), ) fieldList = ftools_utils.getFieldList(polyLayer) index = polyProvider.fieldNameIndex(unicode(inField)) if index == -1: index = polyProvider.fields().count() fieldList.append(QgsField(unicode(inField), QVariant.Double, "real", 24, 15, self.tr("length field"))) sRs = polyProvider.crs() inFeat = QgsFeature() inFeatB = QgsFeature() outFeat = QgsFeature() inGeom = QgsGeometry() outGeom = QgsGeometry() distArea = QgsDistanceArea() start = 0.00 add = 100.00 / polyProvider.featureCount() check = QFile(self.shapefileName) if check.exists(): if not QgsVectorFileWriter.deleteShapeFile(self.shapefileName): return writer = QgsVectorFileWriter(self.shapefileName, self.encoding, fieldList, polyProvider.geometryType(), sRs) spatialIndex = ftools_utils.createIndex(lineProvider) polyFit = polyProvider.getFeatures() while polyFit.nextFeature(inFeat): inGeom = QgsGeometry(inFeat.geometry()) atMap = inFeat.attributes() lineList = [] length = 0 lineList = spatialIndex.intersects(inGeom.boundingBox()) if len(lineList) > 0: check = 0 else: check = 1 if check == 0: for i in lineList: 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) atMap.append(length) outFeat.setAttributes(atMap) writer.addFeature(outFeat) start = start + 1 progressBar.setValue(start * (add)) del writer
def compute(self, inPoly, inPts, inField, outPath, progressBar): polyLayer = ftools_utils.getVectorLayerByName(inPoly) pointLayer = ftools_utils.getVectorLayerByName(inPts) polyProvider = polyLayer.dataProvider() pointProvider = pointLayer.dataProvider() if polyProvider.crs() <> pointProvider.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 = pointProvider.attributeIndexes() pointProvider.select(allAttrs) fieldList = ftools_utils.getFieldList(polyLayer) index = polyProvider.fieldNameIndex(unicode(inField)) if index == -1: index = polyProvider.fieldCount() field = QgsField(unicode(inField), QVariant.Double, "real", 24, 15, self.tr("point count field")) fieldList[index] = field sRs = polyProvider.crs() check = QFile(self.shapefileName) if check.exists(): if not QgsVectorFileWriter.deleteShapeFile(self.shapefileName): return writer = QgsVectorFileWriter(self.shapefileName, self.encoding, fieldList, polyProvider.geometryType(), sRs) inFeat = QgsFeature() inFeatB = QgsFeature() outFeat = QgsFeature() inGeom = QgsGeometry() start = 15.00 add = 85.00 / polyProvider.featureCount() spatialIndex = ftools_utils.createIndex( pointProvider ) while polyProvider.nextFeature(inFeat): inGeom = inFeat.geometry() atMap = inFeat.attributeMap() outFeat.setAttributeMap(atMap) outFeat.setGeometry(inGeom) pointList = [] count = 0 #(check, pointList) = pointLayer.featuresInRectangle(inGeom.boundingBox(), True, True) #pointLayer.select(inGeom.boundingBox(), False) #pointList = pointLayer.selectedFeatures() pointList = spatialIndex.intersects(inGeom.boundingBox()) if len(pointList) > 0: check = 0 else: check = 1 if check == 0: for i in pointList: pointProvider.featureAtId( int( i ), inFeatB , True, allAttrs ) tmpGeom = QgsGeometry( inFeatB.geometry() ) if inGeom.contains(tmpGeom.asPoint()): count = count + 1 outFeat.setAttributeMap(atMap) outFeat.addAttribute(index, QVariant(count)) writer.addFeature(outFeat) start = start + 1 progressBar.setValue(start) del writer
def update(self, inputLayer): self.weightField.clear() self.uniqueField.clear() self.weightField.addItem( self.tr("(Optional) Weight field") ) self.uniqueField.addItem( self.tr("(Optional) Unique ID field") ) self.changedLayer = ftools_utils.getVectorLayerByName(inputLayer) changedField = ftools_utils.getFieldList(self.changedLayer) for i in changedField: if changedField[i].type() == QVariant.Int or changedField[i].type() == QVariant.Double: self.weightField.addItem(unicode(changedField[i].name())) self.uniqueField.addItem(unicode(changedField[i].name()))
def update(self, inputLayer): self.weightField.clear() self.uniqueField.clear() self.weightField.addItem(self.tr("(Optional) Weight field")) self.uniqueField.addItem(self.tr("(Optional) Unique ID field")) self.changedLayer = ftools_utils.getVectorLayerByName(inputLayer) changedField = ftools_utils.getFieldList(self.changedLayer) for f in changedField: if f.type() == QVariant.Int or f.type() == QVariant.Double: self.weightField.addItem(unicode(f.name())) self.uniqueField.addItem(unicode(f.name()))
def setCalcFields(self): import ftools_utils self.ui.cbxCalcField.clear() calcLayer = self.ui.cbxMeasureLayer.currentText() selectedLayer = ftools_utils.getVectorLayerByName(unicode(calcLayer)) if selectedLayer != None: fields = ftools_utils.getFieldList(selectedLayer) for i in fields: if fields[i].type() == QtCore.QVariant.Int or \ fields[i].type() == QtCore.QVariant.Double: self.ui.cbxCalcField.addItem(unicode(fields[i].name()))
def setFields(self, planningGrid): import ftools_utils self.ui.cbxSelectField.clear() self.ui.cbxIdField.clear() selectedLayer = ftools_utils.getVectorLayerByName(unicode(planningGrid)) if selectedLayer != None: self.ui.cbxSelectField.addItem(unicode("--Create New--")) fields = ftools_utils.getFieldList(selectedLayer) for i in fields: if fields[i].type() == QtCore.QVariant.Int or \ fields[i].type() == QtCore.QVariant.Double: self.ui.cbxSelectField.addItem(unicode(fields[i].name())) self.ui.cbxIdField.addItem(unicode(fields[i].name()))
def setIdAndMeasureFields(self, planningGrid): import ftools_utils self.ui.cbxSelectField.clear() self.ui.cbxPuId.clear() selectedLayer = ftools_utils.getVectorLayerByName( unicode(planningGrid)) if selectedLayer != None: self.ui.cbxSelectField.addItem(unicode("--Create New--")) fields = ftools_utils.getFieldList(selectedLayer) for i in fields: if fields[i].type() == QtCore.QVariant.Int or \ fields[i].type() == QtCore.QVariant.Double: self.ui.cbxSelectField.addItem(unicode(fields[i].name())) self.ui.cbxPuId.addItem(unicode(fields[i].name()))
def updateTableFields(self): if self.inTable.text() != "": filePath = self.inTable.text() joinInfo = QFileInfo(filePath) joinPath = joinInfo.absoluteFilePath() joinName = joinInfo.completeBaseName() self.joinField.clear() changedLayer = QgsVectorLayer(joinPath, joinName, 'ogr') try: changedField = ftools_utils.getFieldList(changedLayer) except: QMessageBox.warning(self, self.tr("Join Attributes"), self.tr("Unable to read input table!")) return for i in changedField: self.joinField.addItem(unicode(changedField[i].name()))
def listPointFields(self): if self.inPoint.currentText() == "": pass inPnts = ftools_utils.getVectorLayerByName(self.inPoint.currentText()) if inPnts: pointFieldList = ftools_utils.getFieldList(inPnts) self.attributeList.clear() for field in pointFieldList: if field.type() == QVariant.Int or field.type() ==QVariant.Double: if field.type() == QVariant.Int: global typeInt item = QListWidgetItem(unicode(field.name()), None, typeInt) else: global typeDouble item = QListWidgetItem(unicode(field.name()), None, typeDouble) item.setToolTip("Attribute <%s> of type %s" % (field.name(), field.typeName())) self.attributeList.addItem(item)
def listPointFields(self): if self.inPoint.currentText() == "": pass inPnts = ftools_utils.getVectorLayerByName(self.inPoint.currentText()) if inPnts: pointFieldList = ftools_utils.getFieldList(inPnts) self.attributeList.clear() for field in pointFieldList: if field.type() in [QVariant.Int, QVariant.Double, QVariant.LongLong, QVariant.UInt, QVariant.ULongLong]: if field.type() == QVariant.Double: global typeDouble item = QListWidgetItem(unicode(field.name()), None, typeDouble) else: global typeInt item = QListWidgetItem(unicode(field.name()), None, typeInt) item.setToolTip("Attribute <%s> of type %s" % (field.name(), field.typeName())) self.attributeList.addItem(item)
def update(self, inputLayer): self.cmbField.clear() changedLayer = ftools_utils.getMapLayerByName(unicode(inputLayer)) if changedLayer.type() == changedLayer.VectorLayer: self.rdoStratified.setEnabled(True) self.rdoDensity.setEnabled(True) self.rdoField.setEnabled(True) self.label_4.setEnabled(True) changedLayer = ftools_utils.getVectorLayerByName(inputLayer) changedFields = ftools_utils.getFieldList(changedLayer) for i in changedFields: self.cmbField.addItem(unicode(changedFields[i].name())) else: self.rdoUnstratified.setChecked(True) self.rdoStratified.setEnabled(False) self.rdoDensity.setEnabled(False) self.rdoField.setEnabled(False) self.spnStratified.setEnabled(False) self.spnDensity.setEnabled(False) self.cmbField.setEnabled(False) self.label_4.setEnabled(False)
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, joinName, outName, summary, sumList, keep, progressBar): layer1 = ftools_utils.getVectorLayerByName(inName) provider1 = layer1.dataProvider() fieldList1 = ftools_utils.getFieldList(layer1).toList() layer2 = ftools_utils.getVectorLayerByName(joinName) provider2 = layer2.dataProvider() fieldList2 = ftools_utils.getFieldList(layer2).toList() fieldList = [] if provider1.crs() != provider2.crs(): QMessageBox.warning( self, self.tr("CRS warning!"), self. tr("Warning: Input layers have non-matching CRS.\nThis may cause unexpected results." )) if not summary: fieldList2 = ftools_utils.testForUniqueness(fieldList1, fieldList2) seq = range(0, len(fieldList1) + len(fieldList2)) fieldList1.extend(fieldList2) fieldList1 = dict(zip(seq, fieldList1)) else: numFields = {} for j in xrange(len(fieldList2)): if fieldList2[j].type() == QVariant.Int or fieldList2[j].type( ) == QVariant.Double: numFields[j] = [] for i in sumList: field = QgsField(i + unicode(fieldList2[j].name()), QVariant.Double, "real", 24, 16, self.tr("Summary field")) fieldList.append(field) field = QgsField("COUNT", QVariant.Double, "real", 24, 16, self.tr("Summary field")) fieldList.append(field) fieldList2 = ftools_utils.testForUniqueness(fieldList1, fieldList) fieldList1.extend(fieldList) seq = range(0, len(fieldList1)) fieldList1 = dict(zip(seq, fieldList1)) # check for correct field names print fieldList1 longNames = ftools_utils.checkFieldNameLength(fieldList1.values()) if not longNames.isEmpty(): QMessageBox.warning( self, self.tr('Incorrect field names'), self. tr('No output will be created.\nFollowing field names are longer than 10 characters:\n%1' ).arg(longNames.join('\n'))) return False sRs = provider1.crs() progressBar.setValue(13) check = QFile(self.shapefileName) if check.exists(): if not QgsVectorFileWriter.deleteShapeFile(self.shapefileName): QMessageBox.warning( self, self.tr('Error deleting shapefile'), self.tr("Can't delete existing shapefile\n%1").arg( self.shapefileName)) return False fields = QgsFields() for f in fieldList1.values(): fields.append(f) writer = QgsVectorFileWriter(self.shapefileName, self.encoding, fields, provider1.geometryType(), sRs) #writer = QgsVectorFileWriter(outName, "UTF-8", fieldList1, provider1.geometryType(), sRs) inFeat = QgsFeature() outFeat = QgsFeature() inFeatB = QgsFeature() inGeom = QgsGeometry() progressBar.setValue(15) start = 15.00 add = 85.00 / provider1.featureCount() index = ftools_utils.createIndex(provider2) fit1 = provider1.getFeatures() while fit1.nextFeature(inFeat): inGeom = inFeat.geometry() atMap1 = inFeat.attributes() outFeat.setGeometry(inGeom) none = True joinList = [] if inGeom.type() == QGis.Point: #(check, joinList) = layer2.featuresInRectangle(inGeom.buffer(10,2).boundingBox(), True, True) #layer2.select(inGeom.buffer(10,2).boundingBox(), False) #joinList = layer2.selectedFeatures() joinList = index.intersects(inGeom.buffer(10, 2).boundingBox()) if len(joinList) > 0: check = 0 else: check = 1 else: #(check, joinList) = layer2.featuresInRectangle(inGeom.boundingBox(), True, True) #layer2.select(inGeom.boundingBox(), False) #joinList = layer2.selectedFeatures() joinList = index.intersects(inGeom.boundingBox()) if len(joinList) > 0: check = 0 else: check = 1 if check == 0: count = 0 for i in joinList: #tempGeom = i.geometry() provider2.getFeatures(QgsFeatureRequest().setFilterFid( int(i))).nextFeature(inFeatB) tmpGeom = QgsGeometry(inFeatB.geometry()) if inGeom.intersects(tmpGeom): count = count + 1 none = False atMap2 = inFeatB.attributes() if not summary: atMap = atMap1 atMap2 = atMap2 atMap.extend(atMap2) atMap = dict(zip(seq, atMap)) break else: for j in numFields.keys(): numFields[j].append(atMap2[j].toDouble()[0]) if summary and not none: atMap = atMap1 for j in numFields.keys(): for k in sumList: if k == "SUM": atMap.append(QVariant(sum(numFields[j]))) elif k == "MEAN": atMap.append( QVariant(sum(numFields[j]) / count)) elif k == "MIN": atMap.append(QVariant(min(numFields[j]))) elif k == "MED": atMap.append(QVariant(myself(numFields[j]))) else: atMap.append(QVariant(max(numFields[j]))) numFields[j] = [] atMap.append(QVariant(count)) atMap = dict(zip(seq, atMap)) if none: outFeat.setAttributes(atMap1) else: outFeat.setAttributes(atMap.values()) if keep: # keep all records writer.addFeature(outFeat) else: # keep only matching records if not none: writer.addFeature(outFeat) start = start + add progressBar.setValue(start) del writer return True
def update(self, inputLayer): self.inField.clear() changedLayer = ftools_utils.getVectorLayerByName(inputLayer) changedField = ftools_utils.getFieldList(changedLayer) for f in changedField: self.inField.addItem(unicode(f.name()))
def compute(self, vlayer, tfield, idvar, matType, progressBar): vlayer = qgis.utils.iface.activeLayer() idvar = self.idVariable.currentText() # print type(idvar) tfield = self.inField.currentText() # print type(tfield) provider = vlayer.dataProvider() allAttrs = provider.attributeIndexes() caps = vlayer.dataProvider().capabilities() start = 15.00 if caps & QgsVectorDataProvider.AddAttributes: if matType == "Rook": TestField = tfield[:7] + "_r" else: TestField = tfield[:7] + "_q" res = vlayer.dataProvider().addAttributes( [QgsField(TestField, QVariant.Double)]) wp = str(self.dic[str(self.inShape.currentText())]) if matType == "Rook": w = py.rook_from_shapefile(wp, idVariable=unicode(idvar)) else: w = py.queen_from_shapefile(wp, idVariable=unicode(idvar)) w1 = wp[:-3] + "dbf" db = py.open(w1) y = np.array(db.by_col[unicode(tfield)]) np.random.seed(12345) lm = py.Moran_Local(y, w) l = lm.p_sim # Replace insignificant values with the number 5: for i in range(len(l)): if l[i] > 0.05: l[i] = 5 # Replace the significant values with their quadrant: for i in range(len(l)): if l[i] <= 0.05: l[i] = lm.q[i] a = range(len(l)) l1 = np.array(l).flatten().tolist() d = dict(zip(a, l1)) fieldList = ftools_utils.getFieldList(vlayer) print len(fieldList) n = len(fieldList) - 1 add = 85.00 / len(l) print add vlayer.startEditing() for i in a: fid = int(i) # print fid vlayer.changeAttributeValue(fid, n, d[i]) start = start + add print start # print d[i] #index of the new added field vlayer.commitChanges() self.SAresult.setText( "Significance values have been added to your attribute table!") start = start + 1 progressBar.setValue(start)
def compute(self, vlayer, tfield, idvar,matType,progressBar): vlayer=qgis.utils.iface.activeLayer() idvar=self.idVariable.currentText() # print type(idvar) tfield=self.inField.currentText() # print type(tfield) provider=vlayer.dataProvider() allAttrs=provider.attributeIndexes() caps=vlayer.dataProvider().capabilities() start=15.00 if caps & QgsVectorDataProvider.AddAttributes: if matType == "Rook": TestField = tfield[:7]+"_r" else: TestField = tfield[:7]+"_q" res = vlayer.dataProvider().addAttributes([QgsField(TestField, QVariant.Double)]) wp=str(self.dic[str(self.inShape.currentText())]) if matType == "Rook": w = py.rook_from_shapefile(wp, idVariable=unicode(idvar)) else: w = py.queen_from_shapefile(wp, idVariable=unicode(idvar)) w1=wp[:-3]+"dbf" db=py.open(w1) y=np.array(db.by_col[unicode(tfield)]) np.random.seed(12345) lm=py.Moran_Local(y,w) l=lm.p_sim # Replace insignificant values with the number 5: for i in range(len(l)): if l[i] > 0.05: l[i] = 5 # Replace the significant values with their quadrant: for i in range(len(l)): if l[i] <= 0.05: l[i] =lm.q[i] a=range(len(l)) l1=np.array(l).flatten().tolist() d=dict(zip(a,l1)) fieldList=ftools_utils.getFieldList(vlayer) print len(fieldList) n=len(fieldList)-1 add=85.00/len(l) print add vlayer.startEditing() for i in a: fid=int(i) # print fid vlayer.changeAttributeValue(fid,n,d[i]) start=start+add print start # print d[i] #index of the new added field vlayer.commitChanges() self.SAresult.setText("Significance values have been added to your attribute table!") start=start+1 progressBar.setValue(start)
def compute(self, line1, line2, field1, field2, outPath, progressBar): layer1 = ftools_utils.getVectorLayerByName(line1) layer2 = ftools_utils.getVectorLayerByName(line2) provider1 = layer1.dataProvider() provider2 = layer2.dataProvider() allAttrs = provider1.attributeIndexes() provider1.select(allAttrs) allAttrs = provider2.attributeIndexes() provider2.select(allAttrs) fieldList = ftools_utils.getFieldList(layer1) index1 = provider1.fieldNameIndex(field1) field1 = fieldList[index1] field1.setName(unicode(field1.name()) + "_1") fieldList = ftools_utils.getFieldList(layer2) index2 = provider2.fieldNameIndex(field2) field2 = fieldList[index2] field2.setName(unicode(field2.name()) + "_2") fieldList = {0: field1, 1: field2} sRs = provider1.crs() check = QFile(self.shapefileName) if check.exists(): if not QgsVectorFileWriter.deleteShapeFile(self.shapefileName): return writer = QgsVectorFileWriter(self.shapefileName, self.encoding, fieldList, QGis.WKBPoint, sRs) #writer = QgsVectorFileWriter(outPath, "UTF-8", fieldList, QGis.WKBPoint, sRs) inFeat = QgsFeature() inFeatB = QgsFeature() outFeat = QgsFeature() inGeom = QgsGeometry() tempGeom = QgsGeometry() start = 15.00 add = 85.00 / layer1.featureCount() index = ftools_utils.createIndex(provider2) while provider1.nextFeature(inFeat): inGeom = inFeat.geometry() lineList = [] #(check, lineList) = layer2.featuresInRectangle(inGeom.boundingBox(), True, True) # Below is a work-around for featuresInRectangle # Which appears to have been removed for QGIS version 1.0 #layer2.select(inGeom.boundingBox(), False) #lineList = layer2.selectedFeatures() lineList = index.intersects(inGeom.boundingBox()) if len(lineList) > 0: check = 0 else: check = 1 if check == 0: for i in lineList: provider2.featureAtId(int(i), inFeatB, True, allAttrs) tmpGeom = QgsGeometry(inFeatB.geometry()) #tempGeom = i.geometry() tempList = [] atMap1 = inFeat.attributeMap() atMap2 = inFeatB.attributeMap() if inGeom.intersects(tmpGeom): tempGeom = inGeom.intersection(tmpGeom) if tempGeom.type() == QGis.Point: if tempGeom.isMultipart(): tempList = tempGeom.asMultiPoint() else: tempList.append(tempGeom.asPoint()) for j in tempList: outFeat.setGeometry(tempGeom.fromPoint(j)) outFeat.addAttribute(0, atMap1[index1]) outFeat.addAttribute(1, atMap2[index2]) writer.addFeature(outFeat) start = start + add progressBar.setValue(start) del writer
def compute(self, line1, line2, field1, field2, outPath, progressBar): layer1 = ftools_utils.getVectorLayerByName(line1) provider1 = layer1.dataProvider() 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() fieldList = ftools_utils.getFieldList(layer2) index2 = provider2.fieldNameIndex(field2) field2 = fieldList[index2] field2.setName(unicode(field2.name()) + "_2") fieldList = QgsFields() fieldList.append( field1 ) fieldList.append( field2 ) sRs = provider1.crs() check = QFile(self.shapefileName) if check.exists(): if not QgsVectorFileWriter.deleteShapeFile(self.shapefileName): return writer = QgsVectorFileWriter(self.shapefileName, self.encoding, fieldList, QGis.WKBPoint, sRs) inFeat = QgsFeature() inFeatB = QgsFeature() outFeat = QgsFeature() start = 15.00 add = 85.00 / layer1.featureCount() index = ftools_utils.createIndex( provider2 ) fit1 = vprovider.getFeatures( QgsFeatureRequest().setSubsetOfAttributes([index1]) ) while fit1.nextFeature(inFeat): inGeom = inFeat.geometry() v1 = inFeat.attributes()[index1] lineList = index.intersects( inGeom.boundingBox() ) for i in lineList: provider2.getFeatures( QgsFeatureRequest().setFilterFid( int( i ) ).setSubsetOfAttributes([index2]) ).nextFeature( inFeatB ) tmpGeom = QgsGeometry( inFeatB.geometry() ) v2 = inFeatB.attributes()[index2] if inGeom.intersects(tmpGeom): tempGeom = inGeom.intersection(tmpGeom) if tempGeom.type() == QGis.Point: tempList = [] if tempGeom.isMultipart(): tempList = tempGeom.asMultiPoint() else: tempList.append(tempGeom.asPoint()) for j in tempList: outFeat.setGeometry(tempGeom.fromPoint(j)) outFeat.setAttribute(0, v1) outFeat.setAttribute(1, v2) writer.addFeature(outFeat) start = start + add progressBar.setValue(start) del writer
def run(self): self.mutex.lock() self.stopMe = 0 self.mutex.unlock() interrupted = False polyProvider = self.layerPoly.dataProvider() pointProvider = self.layerPoints.dataProvider() fieldList = ftools_utils.getFieldList(self.layerPoly) index = polyProvider.fieldNameIndex(unicode(self.fieldName)) if index == -1: index = polyProvider.fields().count() fieldList.append( QgsField(unicode(self.fieldName), QVariant.Double, "real", 24, 15, self.tr("point count field"))) sRs = polyProvider.crs() if QFile(self.outPath).exists(): if not QgsVectorFileWriter.deleteShapeFile(self.outPath): return writer = QgsVectorFileWriter(self.outPath, self.encoding, fieldList, polyProvider.geometryType(), sRs) spatialIndex = ftools_utils.createIndex(pointProvider) self.emit(SIGNAL("rangeChanged(int)"), polyProvider.featureCount()) polyFeat = QgsFeature() pntFeat = QgsFeature() outFeat = QgsFeature() inGeom = QgsGeometry() polyFit = polyProvider.getFeatures() while polyFit.nextFeature(polyFeat): inGeom = polyFeat.geometry() atMap = polyFeat.attributes() outFeat.setAttributes(atMap) outFeat.setGeometry(inGeom) count = 0 pointList = [] hasIntersection = True pointList = spatialIndex.intersects(inGeom.boundingBox()) if len(pointList) > 0: hasIntersection = True else: hasIntersection = False if hasIntersection: for p in pointList: pointProvider.getFeatures(QgsFeatureRequest().setFilterFid( p)).nextFeature(pntFeat) tmpGeom = QgsGeometry(pntFeat.geometry()) if inGeom.intersects(tmpGeom): count += 1 self.mutex.lock() s = self.stopMe self.mutex.unlock() if s == 1: interrupted = True break atMap.append(QVariant(count)) outFeat.setAttributes(atMap) writer.addFeature(outFeat) self.emit(SIGNAL("updateProgress()")) self.mutex.lock() s = self.stopMe self.mutex.unlock() if s == 1: interrupted = True break del writer if not interrupted: self.emit(SIGNAL("processingFinished()")) else: self.emit(SIGNAL("processingInterrupted()"))
def run(self): self.mutex.lock() self.stopMe = 0 self.mutex.unlock() interrupted = False polyProvider = self.layerPoly.dataProvider() pointProvider = self.layerPoints.dataProvider() fieldList = ftools_utils.getFieldList(self.layerPoly) index = polyProvider.fieldNameIndex(unicode(self.fieldName)) if index == -1: index = polyProvider.fields().count() fieldList.append( QgsField(unicode(self.fieldName), QVariant.Int, "int", 10, 0, self.tr("point count field")) ) # Add the selected vector fields to the output polygon vector layer selectedItems = self.attributeList.selectedItems() for item in selectedItems: global typeDouble columnName = unicode(item.text() + "_" + self.statistics) index = polyProvider.fieldNameIndex(unicode(columnName)) if index == -1: if item.type() == typeDouble or self.statistics == "mean" or self.statistics == "stddev": fieldList.append( QgsField(columnName, QVariant.Double, "double", 24, 15, "Value") ) else: fieldList.append( QgsField(columnName, QVariant.Int, "int", 10, 0, "Value") ) sRs = polyProvider.crs() if QFile(self.outPath).exists(): if not QgsVectorFileWriter.deleteShapeFile(self.outPath): return writer = QgsVectorFileWriter(self.outPath, self.encoding, fieldList, polyProvider.geometryType(), sRs) spatialIndex = ftools_utils.createIndex( pointProvider ) self.emit(SIGNAL("rangeChanged(int)"), polyProvider.featureCount() ) polyFeat = QgsFeature() pntFeat = QgsFeature() outFeat = QgsFeature() inGeom = QgsGeometry() polyFit = polyProvider.getFeatures() while polyFit.nextFeature(polyFeat): inGeom = polyFeat.geometry() atMap = polyFeat.attributes() outFeat.setAttributes(atMap) outFeat.setGeometry(inGeom) count = 0 pointList = [] hasIntersection = True pointList = spatialIndex.intersects(inGeom.boundingBox()) if len(pointList) > 0: hasIntersection = True else: hasIntersection = False if hasIntersection: valueList = {} for item in selectedItems: valueList[item.text()] = [] for p in pointList: pointProvider.getFeatures( QgsFeatureRequest().setFilterFid( p ) ).nextFeature( pntFeat ) tmpGeom = QgsGeometry(pntFeat.geometry()) if inGeom.intersects(tmpGeom): count += 1 for item in selectedItems: valueList[item.text()].append(pntFeat.attribute(item.text())) self.mutex.lock() s = self.stopMe self.mutex.unlock() if s == 1: interrupted = True break atMap.append(count) # Compute the statistical values for selected vector attributes for item in selectedItems: values = valueList[item.text()] # Check if the input contains non-numeric values non_numeric_values = False for value in values: if not isinstance(value, type(float())) and not isinstance(value, type(int())): non_numeric_values = True break # Jump over invalid values if non_numeric_values is True: continue if values and len(values) > 0: if self.statistics == "sum": value = reduce(myAdder, values) elif self.statistics == "mean": value = reduce(myAdder, values) / float(len(values)) elif self.statistics == "min": values.sort() value = values[0] elif self.statistics == "max": values.sort() value = values[-1] elif self.statistics == "stddev": value = two_pass_variance(values) value = math.sqrt(value) atMap.append(value) outFeat.setAttributes(atMap) writer.addFeature(outFeat) self.emit( SIGNAL( "updateProgress()" ) ) self.mutex.lock() s = self.stopMe self.mutex.unlock() if s == 1: interrupted = True break del writer if not interrupted: self.emit( SIGNAL( "processingFinished()" ) ) else: self.emit( SIGNAL( "processingInterrupted()" ) )
def compute(self, inName, inField, joinName, joinField, outName, keep, useTable, progressBar): layer1 = ftools_utils.getVectorLayerByName(inName) provider1 = layer1.dataProvider() allAttrs = provider1.attributeIndexes() provider1.select(allAttrs) fieldList1 = ftools_utils.getFieldList(layer1).values() index1 = provider1.fieldNameIndex(inField) if useTable: joinInfo = QFileInfo(joinName) joinPath = joinInfo.absoluteFilePath() joinName = joinInfo.completeBaseName() layer2 = QgsVectorLayer(joinPath, joinName, 'ogr') useTable = False else: layer2 = ftools_utils.getVectorLayerByName(joinName) provider2 = layer2.dataProvider() allAttrs = provider2.attributeIndexes() provider2.select(allAttrs, QgsRectangle(), False, False) fieldList2 = ftools_utils.getFieldList(layer2) index2 = provider2.fieldNameIndex(joinField) fieldList2 = ftools_utils.testForUniqueness(fieldList1, fieldList2.values()) seq = range(0, len(fieldList1) + len(fieldList2)) fieldList1.extend(fieldList2) fieldList1 = dict(zip(seq, fieldList1)) # check for correct field names longNames = ftools_utils.checkFieldNameLength( fieldList1 ) if not longNames.isEmpty(): QMessageBox.warning( self, self.tr( 'Incorrect field names' ), self.tr( 'No output will be created.\nFollowing field names are longer than 10 characters:\n%1' ) .arg( longNames.join( '\n' ) ) ) return False sRs = provider1.crs() progressBar.setValue(13) check = QFile(self.shapefileName) if check.exists(): if not QgsVectorFileWriter.deleteShapeFile(self.shapefileName): QMessageBox.warning( self, self.tr( 'Error deleting shapefile' ), self.tr( "Can't delete existing shapefile\n%1" ).arg( self.shapefileName ) ) return False writer = QgsVectorFileWriter(self.shapefileName, self.encoding, fieldList1, provider1.geometryType(), sRs) inFeat = QgsFeature() outFeat = QgsFeature() joinFeat = QgsFeature() inGeom = QgsGeometry() nElement = 0 nFeats = provider1.featureCount() progressBar.setRange(nElement, nFeats) count = 0 provider1.rewind() while provider1.nextFeature(inFeat): inGeom = QgsGeometry(inFeat.geometry()) atMap1 = inFeat.attributeMap() outFeat.setAttributeMap(atMap1) outFeat.setGeometry(inGeom) none = True provider2.select(allAttrs, QgsRectangle(), False, False) while provider2.nextFeature(joinFeat): atMap2 = joinFeat.attributeMap() if atMap1[index1] == atMap2[index2]: none = False atMap = atMap1.values() atMap2 = atMap2.values() atMap.extend(atMap2) atMap = dict(zip(seq, atMap)) break if none: outFeat.setAttributeMap(atMap1) else: outFeat.setAttributeMap(atMap) if keep: # keep all records writer.addFeature(outFeat) else: # keep only matching records if not none: writer.addFeature(outFeat) nElement += 1 progressBar.setValue(nElement) del writer return True
def run(self): self.mutex.lock() self.stopMe = 0 self.mutex.unlock() interrupted = False polyProvider = self.layerPoly.dataProvider() pointProvider = self.layerPoints.dataProvider() fieldList = ftools_utils.getFieldList(self.layerPoly) index = polyProvider.fieldNameIndex(unicode(self.fieldName)) if index == -1: index = polyProvider.fields().count() fieldList.append( QgsField(unicode(self.fieldName), QVariant.Int, "int", 10, 0, self.tr("point count field"))) # Add the selected vector fields to the output polygon vector layer selectedItems = self.attributeList.selectedItems() for item in selectedItems: global typeDouble columnName = unicode(item.text() + "_" + self.statistics) index = polyProvider.fieldNameIndex(unicode(columnName)) if index == -1: if item.type( ) == typeDouble or self.statistics == "mean" or self.statistics == "stddev": fieldList.append( QgsField(columnName, QVariant.Double, "double", 24, 15, "Value")) else: fieldList.append( QgsField(columnName, QVariant.Int, "int", 10, 0, "Value")) sRs = polyProvider.crs() if QFile(self.outPath).exists(): if not QgsVectorFileWriter.deleteShapeFile(self.outPath): return writer = QgsVectorFileWriter(self.outPath, self.encoding, fieldList, polyProvider.geometryType(), sRs) spatialIndex = ftools_utils.createIndex(pointProvider) self.emit(SIGNAL("rangeChanged(int)"), polyProvider.featureCount()) polyFeat = QgsFeature() pntFeat = QgsFeature() outFeat = QgsFeature() inGeom = QgsGeometry() polyFit = polyProvider.getFeatures() while polyFit.nextFeature(polyFeat): inGeom = polyFeat.geometry() atMap = polyFeat.attributes() outFeat.setAttributes(atMap) outFeat.setGeometry(inGeom) count = 0 pointList = [] hasIntersection = True pointList = spatialIndex.intersects(inGeom.boundingBox()) if len(pointList) > 0: hasIntersection = True else: hasIntersection = False if hasIntersection: valueList = {} for item in selectedItems: valueList[item.text()] = [] for p in pointList: pointProvider.getFeatures(QgsFeatureRequest().setFilterFid( p)).nextFeature(pntFeat) tmpGeom = QgsGeometry(pntFeat.geometry()) if inGeom.intersects(tmpGeom): count += 1 for item in selectedItems: valueList[item.text()].append( pntFeat.attribute(item.text())) self.mutex.lock() s = self.stopMe self.mutex.unlock() if s == 1: interrupted = True break atMap.append(count) # Compute the statistical values for selected vector attributes for item in selectedItems: values = valueList[item.text()] # Check if the input contains non-numeric values non_numeric_values = False for value in values: if not isinstance(value, type( float())) and not isinstance( value, type(int())): non_numeric_values = True break # Jump over invalid values if non_numeric_values is True: continue if values and len(values) > 0: if self.statistics == "sum": value = reduce(myAdder, values) elif self.statistics == "mean": value = reduce(myAdder, values) / float( len(values)) elif self.statistics == "min": values.sort() value = values[0] elif self.statistics == "max": values.sort() value = values[-1] elif self.statistics == "stddev": value = two_pass_variance(values) value = math.sqrt(value) atMap.append(value) outFeat.setAttributes(atMap) writer.addFeature(outFeat) self.emit(SIGNAL("updateProgress()")) self.mutex.lock() s = self.stopMe self.mutex.unlock() if s == 1: interrupted = True break del writer if not interrupted: self.emit(SIGNAL("processingFinished()")) else: self.emit(SIGNAL("processingInterrupted()"))
def update2(self, inputLayer): self.inField2.clear() changedLayer = ftools_utils.getVectorLayerByName(unicode(inputLayer)) changedField = ftools_utils.getFieldList(changedLayer) for i in changedField: self.inField2.addItem(unicode(changedField[i].name()))
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(): QMessageBox.warning(self, self.tr("CRS warning!"), self.tr("Warning: Input layers have non-matching CRS.\nThis may cause unexpected results.")) if not summary: fieldList2 = ftools_utils.testForUniqueness(fieldList1, fieldList2.values()) seq = range(0, len(fieldList1) + len(fieldList2)) fieldList1.extend(fieldList2) fieldList1 = dict(zip(seq, fieldList1)) else: numFields = {} for j in fieldList2.keys(): if fieldList2[j].type() == QVariant.Int or fieldList2[j].type() == QVariant.Double: numFields[j] = [] for i in sumList: field = QgsField(i + unicode(fieldList2[j].name()), QVariant.Double, "real", 24, 16, self.tr("Summary field") ) fieldList.append(field) field = QgsField("COUNT", QVariant.Double, "real", 24, 16, self.tr("Summary field") ) fieldList.append(field) fieldList2 = ftools_utils.testForUniqueness(fieldList1, fieldList) fieldList1.extend(fieldList) seq = range(0, len(fieldList1)) fieldList1 = dict(zip(seq, fieldList1)) # check for correct field names longNames = ftools_utils.checkFieldNameLength( fieldList1 ) if not longNames.isEmpty(): QMessageBox.warning( self, self.tr( 'Incorrect field names' ), self.tr( 'No output will be created.\nFollowing field names are longer than 10 characters:\n%1' ) .arg( longNames.join( '\n' ) ) ) return False sRs = provider1.crs() progressBar.setValue(13) check = QFile(self.shapefileName) if check.exists(): if not QgsVectorFileWriter.deleteShapeFile(self.shapefileName): QMessageBox.warning( self, self.tr( 'Error deleting shapefile' ), self.tr( "Can't delete existing shapefile\n%1" ).arg( self.shapefileName ) ) return False writer = QgsVectorFileWriter(self.shapefileName, self.encoding, fieldList1, provider1.geometryType(), sRs) #writer = QgsVectorFileWriter(outName, "UTF-8", fieldList1, provider1.geometryType(), sRs) inFeat = QgsFeature() outFeat = QgsFeature() inFeatB = QgsFeature() inGeom = QgsGeometry() progressBar.setValue(15) start = 15.00 add = 85.00 / provider1.featureCount() provider1.rewind() index = ftools_utils.createIndex(provider2) while provider1.nextFeature(inFeat): inGeom = inFeat.geometry() atMap1 = inFeat.attributeMap() outFeat.setGeometry(inGeom) none = True joinList = [] if inGeom.type() == QGis.Point: #(check, joinList) = layer2.featuresInRectangle(inGeom.buffer(10,2).boundingBox(), True, True) #layer2.select(inGeom.buffer(10,2).boundingBox(), False) #joinList = layer2.selectedFeatures() joinList = index.intersects( inGeom.buffer(10,2).boundingBox() ) if len(joinList) > 0: check = 0 else: check = 1 else: #(check, joinList) = layer2.featuresInRectangle(inGeom.boundingBox(), True, True) #layer2.select(inGeom.boundingBox(), False) #joinList = layer2.selectedFeatures() joinList = index.intersects( inGeom.boundingBox() ) if len(joinList) > 0: check = 0 else: check = 1 if check == 0: count = 0 for i in joinList: #tempGeom = i.geometry() provider2.featureAtId(int(i), inFeatB , True, allAttrs) tmpGeom = QgsGeometry( inFeatB.geometry() ) if inGeom.intersects(tmpGeom): count = count + 1 none = False atMap2 = inFeatB.attributeMap() if not summary: atMap = atMap1.values() atMap2 = atMap2.values() atMap.extend(atMap2) atMap = dict(zip(seq, atMap)) break else: for j in numFields.keys(): numFields[j].append(atMap2[j].toDouble()[0]) if summary and not none: atMap = atMap1.values() for j in numFields.keys(): for k in sumList: if k == "SUM": atMap.append(QVariant(sum(numFields[j]))) elif k == "MEAN": atMap.append(QVariant(sum(numFields[j]) / count)) elif k == "MIN": atMap.append(QVariant(min(numFields[j]))) elif k == "MED": atMap.append(QVariant(myself(numFields[j]))) else: atMap.append(QVariant(max(numFields[j]))) numFields[j] = [] atMap.append(QVariant(count)) atMap = dict(zip(seq, atMap)) if none: outFeat.setAttributeMap(atMap1) else: outFeat.setAttributeMap(atMap) if keep: # keep all records writer.addFeature(outFeat) else: # keep only matching records if not none: writer.addFeature(outFeat) start = start + add progressBar.setValue(start) del writer return True
def compute(self, line1, line2, field1, field2, outPath, progressBar): layer1 = ftools_utils.getVectorLayerByName(line1) layer2 = ftools_utils.getVectorLayerByName(line2) provider1 = layer1.dataProvider() provider2 = layer2.dataProvider() allAttrs = provider1.attributeIndexes() provider1.select(allAttrs) allAttrs = provider2.attributeIndexes() provider2.select(allAttrs) fieldList = ftools_utils.getFieldList(layer1) index1 = provider1.fieldNameIndex(field1) field1 = fieldList[index1] field1.setName(unicode(field1.name()) + "_1") fieldList = ftools_utils.getFieldList(layer2) index2 = provider2.fieldNameIndex(field2) field2 = fieldList[index2] field2.setName(unicode(field2.name()) + "_2") fieldList = {0:field1, 1:field2} sRs = provider1.crs() check = QFile(self.shapefileName) if check.exists(): if not QgsVectorFileWriter.deleteShapeFile(self.shapefileName): return writer = QgsVectorFileWriter(self.shapefileName, self.encoding, fieldList, QGis.WKBPoint, sRs) #writer = QgsVectorFileWriter(outPath, "UTF-8", fieldList, QGis.WKBPoint, sRs) inFeat = QgsFeature() inFeatB = QgsFeature() outFeat = QgsFeature() inGeom = QgsGeometry() tempGeom = QgsGeometry() start = 15.00 add = 85.00 / layer1.featureCount() index = ftools_utils.createIndex( provider2 ) while provider1.nextFeature(inFeat): inGeom = inFeat.geometry() lineList = [] #(check, lineList) = layer2.featuresInRectangle(inGeom.boundingBox(), True, True) # Below is a work-around for featuresInRectangle # Which appears to have been removed for QGIS version 1.0 #layer2.select(inGeom.boundingBox(), False) #lineList = layer2.selectedFeatures() lineList = index.intersects( inGeom.boundingBox() ) if len(lineList) > 0: check = 0 else: check = 1 if check == 0: for i in lineList: provider2.featureAtId( int( i ), inFeatB , True, allAttrs ) tmpGeom = QgsGeometry( inFeatB.geometry() ) #tempGeom = i.geometry() tempList = [] atMap1 = inFeat.attributeMap() atMap2 = inFeatB.attributeMap() if inGeom.intersects(tmpGeom): tempGeom = inGeom.intersection(tmpGeom) if tempGeom.type() == QGis.Point: if tempGeom.isMultipart(): tempList = tempGeom.asMultiPoint() else: tempList.append(tempGeom.asPoint()) for j in tempList: outFeat.setGeometry(tempGeom.fromPoint(j)) outFeat.addAttribute(0, atMap1[index1]) outFeat.addAttribute(1, atMap2[index2]) writer.addFeature(outFeat) start = start + add progressBar.setValue(start) del writer
def compute(self, inPoly, inPts, inField, outPath, progressBar): polyLayer = ftools_utils.getVectorLayerByName(inPoly) pointLayer = ftools_utils.getVectorLayerByName(inPts) polyProvider = polyLayer.dataProvider() pointProvider = pointLayer.dataProvider() if polyProvider.crs() <> pointProvider.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 = pointProvider.attributeIndexes() pointProvider.select(allAttrs) fieldList = ftools_utils.getFieldList(polyLayer) index = polyProvider.fieldNameIndex(unicode(inField)) if index == -1: index = polyProvider.fieldCount() field = QgsField(unicode(inField), QVariant.Double, "real", 24, 15, self.tr("point count field")) fieldList[index] = field sRs = polyProvider.crs() check = QFile(self.shapefileName) if check.exists(): if not QgsVectorFileWriter.deleteShapeFile(self.shapefileName): return writer = QgsVectorFileWriter(self.shapefileName, self.encoding, fieldList, polyProvider.geometryType(), sRs) #writer = QgsVectorFileWriter(outPath, "UTF-8", fieldList, polyProvider.geometryType(), sRs) inFeat = QgsFeature() inFeatB = QgsFeature() outFeat = QgsFeature() inGeom = QgsGeometry() start = 15.00 add = 85.00 / polyProvider.featureCount() spatialIndex = ftools_utils.createIndex(pointProvider) while polyProvider.nextFeature(inFeat): inGeom = inFeat.geometry() atMap = inFeat.attributeMap() outFeat.setAttributeMap(atMap) outFeat.setGeometry(inGeom) pointList = [] count = 0 #(check, pointList) = pointLayer.featuresInRectangle(inGeom.boundingBox(), True, True) #pointLayer.select(inGeom.boundingBox(), False) #pointList = pointLayer.selectedFeatures() pointList = spatialIndex.intersects(inGeom.boundingBox()) if len(pointList) > 0: check = 0 else: check = 1 if check == 0: for i in pointList: pointProvider.featureAtId(int(i), inFeatB, True, allAttrs) tmpGeom = QgsGeometry(inFeatB.geometry()) if inGeom.contains(tmpGeom.asPoint()): count = count + 1 outFeat.setAttributeMap(atMap) outFeat.addAttribute(index, QVariant(count)) writer.addFeature(outFeat) start = start + 1 progressBar.setValue(start) del writer
def setExportFields(self, planningGrid): import ftools_utils def setCheckState(item): item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsUserCheckable) item.setCheckState(QtCore.Qt.Unchecked) def setEditState(item): item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsEditable) def setViewState(item): item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) def addField(fName, x): # field no item = QtGui.QTableWidgetItem() setCheckState(item) item.setText(str(x)) item.setToolTip('Field Number') self.ui.twFields.setItem(x,0,item) # id item = QtGui.QTableWidgetItem() setEditState(item) item.setText(str(x)) item.setToolTip('Custom Id') self.ui.twFields.setItem(x,1,item) # prop item = QtGui.QTableWidgetItem(str(1.0), type=QtCore.QVariant.Double) setEditState(item) item.setToolTip('Target Proportion') self.ui.twFields.setItem(x,2,item) # target item = QtGui.QTableWidgetItem(str(0.0), type=QtCore.QVariant.Double) setEditState(item) item.setToolTip('Target Value') self.ui.twFields.setItem(x,3,item) # target2 item = QtGui.QTableWidgetItem(str(0), type=QtCore.QVariant.Int) setEditState(item) item.setToolTip('Minimum Clump Size') self.ui.twFields.setItem(x,4,item) # spf item = QtGui.QTableWidgetItem(str(1.0), type=QtCore.QVariant.Double) setEditState(item) item.setToolTip('Penalty Factor') self.ui.twFields.setItem(x,5,item) # field name item = QtGui.QTableWidgetItem() setViewState(item) item.setText(fName) item.setToolTip('Field Name') self.ui.twFields.setItem(x,6,item) # clear the grid self.ui.twFields.clear() self.ui.twFields.repaint() # prepare the grid self.ui.twFields.setColumnCount(7) selectedLayer = ftools_utils.getVectorLayerByName(unicode(planningGrid)) if selectedLayer != None: fields = ftools_utils.getFieldList(selectedLayer) else: return() fcount = len(fields) self.ui.twFields.setRowCount(fcount) header = QtCore.QStringList() header.append('field_no') header.append('id') header.append('prop') header.append('target') header.append('target2') header.append('spf') header.append('name') self.ui.twFields.setHorizontalHeaderLabels(header) x = 0 for i in fields.values(): addField(i.name(),x) x = x + 1 # set drop down boxes self.ui.cbxIdField.clear() self.ui.cbxCostField.clear() self.ui.cbxStatusField.clear() self.ui.cbxBoundaryCost.clear() fidx = -1 for i in fields: if fields[i].type() == QtCore.QVariant.Int or \ fields[i].type() == QtCore.QVariant.Double: self.ui.cbxIdField.addItem(fields[i].name()) self.ui.cbxCostField.addItem(fields[i].name()) self.ui.cbxStatusField.addItem(fields[i].name()) self.ui.cbxBoundaryCost.addItem(fields[i].name()) fidx = fidx + 1 if fields[i].name() in ('pu_id', 'puid'): self.ui.cbxIdField.setCurrentIndex(fidx) if fields[i].name() in ('pu_cost', 'pucost'): self.ui.cbxCostField.setCurrentIndex(fidx) if fields[i].name() in ('pu_status', 'pustatus'): self.ui.cbxStatusField.setCurrentIndex(fidx) if fields[i].name() in ('bnd_cost', 'bndcost'): self.ui.cbxBoundaryCost.setCurrentIndex(fidx)
def run(self): self.mutex.lock() self.stopMe = 0 self.mutex.unlock() interrupted = False polyProvider = self.layerPoly.dataProvider() pointProvider = self.layerPoints.dataProvider() fieldList = ftools_utils.getFieldList(self.layerPoly) index = polyProvider.fieldNameIndex(unicode(self.fieldName)) if index == -1: index = polyProvider.fields().count() fieldList.append( QgsField(unicode(self.fieldName), QVariant.Double, "real", 24, 15, self.tr("point count field")) ) sRs = polyProvider.crs() if QFile(self.outPath).exists(): if not QgsVectorFileWriter.deleteShapeFile(self.outPath): return writer = QgsVectorFileWriter(self.outPath, self.encoding, fieldList, polyProvider.geometryType(), sRs) spatialIndex = ftools_utils.createIndex( pointProvider ) self.emit(SIGNAL("rangeChanged(int)"), polyProvider.featureCount() ) polyFeat = QgsFeature() pntFeat = QgsFeature() outFeat = QgsFeature() inGeom = QgsGeometry() polyFit = polyProvider.getFeatures() while polyFit.nextFeature(polyFeat): inGeom = polyFeat.geometry() atMap = polyFeat.attributes() outFeat.setAttributes(atMap) outFeat.setGeometry(inGeom) count = 0 pointList = [] hasIntersection = True pointList = spatialIndex.intersects(inGeom.boundingBox()) if len(pointList) > 0: hasIntersection = True else: hasIntersection = False if hasIntersection: for p in pointList: pointProvider.getFeatures( QgsFeatureRequest().setFilterFid( p ) ).nextFeature( pntFeat ) tmpGeom = QgsGeometry(pntFeat.geometry()) if inGeom.intersects(tmpGeom): count += 1 self.mutex.lock() s = self.stopMe self.mutex.unlock() if s == 1: interrupted = True break atMap.append(count) outFeat.setAttributes(atMap) writer.addFeature(outFeat) self.emit( SIGNAL( "updateProgress()" ) ) self.mutex.lock() s = self.stopMe self.mutex.unlock() if s == 1: interrupted = True break del writer if not interrupted: self.emit( SIGNAL( "processingFinished()" ) ) else: self.emit( SIGNAL( "processingInterrupted()" ) )
def compute(self, inName, joinName, outName, summary, sumList, keep, progressBar): layer1 = ftools_utils.getVectorLayerByName(inName) provider1 = layer1.dataProvider() fieldList1 = ftools_utils.getFieldList(layer1) layer2 = ftools_utils.getVectorLayerByName(joinName) provider2 = layer2.dataProvider() fieldList2 = ftools_utils.getFieldList(layer2) fieldList = QgsFields() if provider1.crs() != provider2.crs(): QMessageBox.warning(self, self.tr("CRS warning!"), self.tr("Warning: Input layers have non-matching CRS.\nThis may cause unexpected results.")) if not summary: fieldList2 = ftools_utils.testForUniqueness(fieldList1, fieldList2) seq = range(0, len(fieldList1) + len(fieldList2)) fieldList1.extend(fieldList2) fieldList1 = dict(zip(seq, fieldList1)) else: numFields = {} for j in xrange(len(fieldList2)): if fieldList2[j].type() == QVariant.Int or fieldList2[j].type() == QVariant.Double: numFields[j] = [] for i in sumList: field = QgsField(i + unicode(fieldList2[j].name()), QVariant.Double, "real", 24, 16, self.tr("Summary field") ) fieldList.append(field) field = QgsField("COUNT", QVariant.Double, "real", 24, 16, self.tr("Summary field") ) fieldList.append(field) fieldList2 = ftools_utils.testForUniqueness(fieldList1, fieldList) fieldList1.extend(fieldList) seq = range(0, len(fieldList1)) fieldList1 = dict(zip(seq, fieldList1)) sRs = provider1.crs() progressBar.setValue(13) check = QFile(self.shapefileName) if check.exists(): if not QgsVectorFileWriter.deleteShapeFile(self.shapefileName): QMessageBox.warning( self, self.tr( 'Error deleting shapefile' ), self.tr( "Can't delete existing shapefile\n%s" ) % ( self.shapefileName ) ) return False fields = QgsFields() for f in fieldList1.values(): fields.append(f) writer = QgsVectorFileWriter(self.shapefileName, self.encoding, fields, provider1.geometryType(), sRs) #writer = QgsVectorFileWriter(outName, "UTF-8", fieldList1, provider1.geometryType(), sRs) inFeat = QgsFeature() outFeat = QgsFeature() inFeatB = QgsFeature() inGeom = QgsGeometry() progressBar.setValue(15) start = 15.00 add = 85.00 / provider1.featureCount() index = ftools_utils.createIndex(provider2) # cache all features from provider2 to avoid huge number of feature requests in the inner loop mapP2 = {} for f in provider2.getFeatures(): mapP2[f.id()] = QgsFeature(f) fit1 = provider1.getFeatures() while fit1.nextFeature(inFeat): inGeom = inFeat.geometry() atMap1 = inFeat.attributes() outFeat.setGeometry(inGeom) none = True joinList = [] if inGeom.type() == QGis.Point: #(check, joinList) = layer2.featuresInRectangle(inGeom.buffer(10,2).boundingBox(), True, True) #layer2.select(inGeom.buffer(10,2).boundingBox(), False) #joinList = layer2.selectedFeatures() joinList = index.intersects( inGeom.buffer(10,2).boundingBox() ) if len(joinList) > 0: check = 0 else: check = 1 else: #(check, joinList) = layer2.featuresInRectangle(inGeom.boundingBox(), True, True) #layer2.select(inGeom.boundingBox(), False) #joinList = layer2.selectedFeatures() joinList = index.intersects( inGeom.boundingBox() ) if len(joinList) > 0: check = 0 else: check = 1 if check == 0: count = 0 for i in joinList: inFeatB = mapP2[i] # cached feature from provider2 if inGeom.intersects(inFeatB.geometry()): count = count + 1 none = False atMap2 = inFeatB.attributes() if not summary: atMap = atMap1 atMap2 = atMap2 atMap.extend(atMap2) atMap = dict(zip(seq, atMap)) break else: for j in numFields.keys(): numFields[j].append(atMap2[j]) if summary and not none: atMap = atMap1 for j in numFields.keys(): for k in sumList: if k == "SUM": atMap.append(sum(filter_null(numFields[j]))) elif k == "MEAN": try: nn_count = sum( 1 for _ in filter_null(numFields[j]) ) atMap.append(sum(filter_null(numFields[j])) / nn_count) except ZeroDivisionError: atMap.append(NULL) elif k == "MIN": try: atMap.append(min(filter_null(numFields[j]))) except ValueError: atMap.append(NULL) elif k == "MED": atMap.append(myself(numFields[j])) else: try: atMap.append(max(filter_null(numFields[j]))) except ValueError: atMap.append(NULL) numFields[j] = [] atMap.append(count) atMap = dict(zip(seq, atMap)) if none: outFeat.setAttributes(atMap1) else: outFeat.setAttributes(atMap.values()) if keep: # keep all records writer.addFeature(outFeat) else: # keep only matching records if not none: writer.addFeature(outFeat) start = start + add progressBar.setValue(start) del writer return True