Beispiel #1
0
 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()))
Beispiel #2
0
    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()))
Beispiel #3
0
 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()))   
Beispiel #4
0
 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)
Beispiel #5
0
 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()))
Beispiel #6
0
 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()))
Beispiel #7
0
 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
Beispiel #8
0
 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()"))
Beispiel #10
0
    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()"))
Beispiel #11
0
 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
Beispiel #12
0
 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()))
Beispiel #13
0
 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)
Beispiel #14
0
 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()))
Beispiel #15
0
 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)
Beispiel #16
0
 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()))
Beispiel #17
0
 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" ) + " ---" )
Beispiel #18
0
 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" ) + " ---" )
Beispiel #19
0
 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()))
Beispiel #22
0
 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()))
Beispiel #23
0
 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()))
Beispiel #24
0
 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()))
Beispiel #25
0
 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()))
Beispiel #26
0
 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()))
Beispiel #27
0
 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()))
Beispiel #28
0
    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)
Beispiel #30
0
 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)
Beispiel #31
0
 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)
Beispiel #32
0
 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)
Beispiel #33
0
    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
Beispiel #34
0
 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()))
Beispiel #35
0
    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)
Beispiel #36
0
    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)
Beispiel #37
0
 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
Beispiel #38
0
    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
Beispiel #39
0
    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()"))
Beispiel #40
0
    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()" ) )
Beispiel #41
0
 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
Beispiel #42
0
    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()"))
Beispiel #43
0
 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()))
Beispiel #44
0
    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
Beispiel #45
0
 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
Beispiel #46
0
 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()))
Beispiel #47
0
 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
Beispiel #48
0
 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()" ) )
Beispiel #50
0
    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