Exemple #1
0
 def compute(self, inVect, inField, value, perc, progressBar):
     mlayer = ftools_utils.getMapLayerByName(inVect)
     mlayer.removeSelection()
     vlayer = ftools_utils.getVectorLayerByName(inVect)
     vprovider = vlayer.dataProvider()
     index = vprovider.fieldNameIndex(inField)
     unique = ftools_utils.getUniqueValues(vprovider, int(index))
     inFeat = QgsFeature()
     selran = []
     nFeat = vprovider.featureCount() * len(unique)
     nElement = 0
     self.progressBar.setValue(0)
     self.progressBar.setRange(0, nFeat)
     fit = vprovider.getFeatures()
     if not len(unique) == mlayer.featureCount():
         for i in unique:
             fit.rewind()
             FIDs = []
             while fit.nextFeature(inFeat):
                 atMap = inFeat.attributes()
                 if atMap[index] == i:
                     FID = inFeat.id()
                     FIDs.append(FID)
                 nElement += 1
                 self.progressBar.setValue(nElement)
             if perc: selVal = int(round((value / 100.0000) * len(FIDs), 0))
             else: selVal = value
             if selVal >= len(FIDs): selFeat = FIDs
             else: selFeat = random.sample(FIDs, selVal)
             selran.extend(selFeat)
         mlayer.setSelectedFeatures(selran)
     else:
         mlayer.setSelectedFeatures(range(0, mlayer.featureCount()))
    def run(self):
        self.mutex.lock()
        self.stopMe = 0
        self.mutex.unlock()

        interrupted = False

        outPath = QString(self.outDir)

        if outPath.contains("\\"):
            outPath.replace("\\", "/")

        if not outPath.endsWith("/"):
            outPath = outPath + "/"

        provider = self.layer.dataProvider()
        index = provider.fieldNameIndex(self.field)
        unique = ftools_utils.getUniqueValues(provider, int(index))
        baseName = unicode(outPath + self.layer.name() + "_" + self.field +
                           "_")
        allAttrs = provider.attributeIndexes()
        provider.select(allAttrs)
        fieldList = ftools_utils.getFieldList(self.layer)
        sRs = provider.crs()
        geom = self.layer.wkbType()
        inFeat = QgsFeature()

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

        for i in unique:
            check = QFile(baseName + "_" + unicode(i.toString().trimmed()) +
                          ".shp")
            fName = check.fileName()
            if check.exists():
                if not QgsVectorFileWriter.deleteShapeFile(fName):
                    self.errors.append(fName)
                    continue

            writer = QgsVectorFileWriter(fName, self.encoding, fieldList, geom,
                                         sRs)
            provider.rewind()
            while provider.nextFeature(inFeat):
                atMap = inFeat.attributeMap()
                if atMap[index] == i:
                    writer.addFeature(inFeat)
            del writer

            self.emit(SIGNAL("valueProcessed()"))

            self.mutex.lock()
            s = self.stopMe
            self.mutex.unlock()
            if s == 1:
                interrupted = True
                break

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