Exemple #1
0
    def processAlgorithm(self, parameters, context, feedback):
        layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT), context)
        fieldName = self.getParameterValue(self.FIELD)
        directory = self.getOutputValue(self.OUTPUT)

        mkdir(directory)

        fieldIndex = layer.fields().lookupField(fieldName)
        uniqueValues = QgsProcessingUtils.uniqueValues(layer, fieldIndex, context)
        baseName = os.path.join(directory, '{0}_{1}'.format(layer.name(), fieldName))

        fields = layer.fields()
        crs = layer.crs()
        geomType = layer.wkbType()

        total = 100.0 / len(uniqueValues)

        for current, i in enumerate(uniqueValues):
            fName = u'{0}_{1}.shp'.format(baseName, str(i).strip())

            writer, dest = QgsProcessingUtils.createFeatureSink(fName, context, fields, geomType, crs)
            for f in QgsProcessingUtils.getFeatures(layer, context):
                if f[fieldName] == i:
                    writer.addFeature(f)
            del writer

            feedback.setProgress(int(current * total))
Exemple #2
0
    def processAlgorithm(self, parameters, context, feedback):
        filename = self.getParameterValue(self.INPUT)

        layer = QgsProcessingUtils.mapLayerFromString(filename, context)
        field = self.getParameterValue(self.FIELD)
        method = self.getParameterValue(self.METHOD)

        layer.removeSelection()
        index = layer.fields().lookupField(field)

        unique = QgsProcessingUtils.uniqueValues(layer, index, context)
        featureCount = layer.featureCount()

        value = int(self.getParameterValue(self.NUMBER))
        if method == 0:
            if value > featureCount:
                raise GeoAlgorithmExecutionException(
                    self.tr('Selected number is greater that feature count. '
                            'Choose lesser value and try again.'))
        else:
            if value > 100:
                raise GeoAlgorithmExecutionException(
                    self.tr("Percentage can't be greater than 100. Set a "
                            "different value and try again."))
            value = value / 100.0

        selran = []
        inFeat = QgsFeature()

        current = 0
        total = 100.0 / (featureCount * len(unique)) if featureCount else 1

        if not len(unique) == featureCount:
            for i in unique:
                features = QgsProcessingUtils.getFeatures(layer, context)
                FIDs = []
                for inFeat in features:
                    attrs = inFeat.attributes()
                    if attrs[index] == i:
                        FIDs.append(inFeat.id())
                    current += 1
                    feedback.setProgress(int(current * total))

                if method == 1:
                    selValue = int(round(value * len(FIDs), 0))
                else:
                    selValue = value

                if selValue >= len(FIDs):
                    selFeat = FIDs
                else:
                    selFeat = random.sample(FIDs, selValue)

                selran.extend(selFeat)
            layer.selectByIds(selran)
        else:
            layer.selectByIds(list(
                range(featureCount)))  # FIXME: implies continuous feature ids

        self.setOutputValue(self.OUTPUT, filename)
    def processAlgorithm(self, parameters, context, feedback):
        filename = self.getParameterValue(self.INPUT)

        layer = QgsProcessingUtils.mapLayerFromString(filename, context)
        field = self.getParameterValue(self.FIELD)
        method = self.getParameterValue(self.METHOD)

        layer.removeSelection()
        index = layer.fields().lookupField(field)

        unique = QgsProcessingUtils.uniqueValues(layer, index, context)
        featureCount = layer.featureCount()

        value = int(self.getParameterValue(self.NUMBER))
        if method == 0:
            if value > featureCount:
                raise GeoAlgorithmExecutionException(
                    self.tr('Selected number is greater that feature count. '
                            'Choose lesser value and try again.'))
        else:
            if value > 100:
                raise GeoAlgorithmExecutionException(
                    self.tr("Percentage can't be greater than 100. Set a "
                            "different value and try again."))
            value = value / 100.0

        selran = []
        inFeat = QgsFeature()

        current = 0
        total = 100.0 / (featureCount * len(unique))

        if not len(unique) == featureCount:
            for i in unique:
                features = QgsProcessingUtils.getFeatures(layer, context)
                FIDs = []
                for inFeat in features:
                    attrs = inFeat.attributes()
                    if attrs[index] == i:
                        FIDs.append(inFeat.id())
                    current += 1
                    feedback.setProgress(int(current * total))

                if method == 1:
                    selValue = int(round(value * len(FIDs), 0))
                else:
                    selValue = value

                if selValue >= len(FIDs):
                    selFeat = FIDs
                else:
                    selFeat = random.sample(FIDs, selValue)

                selran.extend(selFeat)
            layer.selectByIds(selran)
        else:
            layer.selectByIds(list(range(featureCount)))  # FIXME: implies continuous feature ids

        self.setOutputValue(self.OUTPUT, filename)
Exemple #4
0
 def processAlgorithm(self, parameters, context, feedback):
     layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT_LAYER), context)
     fieldName = self.getParameterValue(self.FIELD_NAME)
     outputFile = self.getOutputValue(self.OUTPUT)
     values = QgsProcessingUtils.uniqueValues(layer, layer.fields().lookupField(fieldName), context)
     self.createHTML(outputFile, values)
     self.setOutputValue(self.TOTAL_VALUES, len(values))
     self.setOutputValue(self.UNIQUE_VALUES, ';'.join([str(v) for v in
                                                       values]))
Exemple #5
0
 def processAlgorithm(self, parameters, context, feedback):
     layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT_LAYER), context)
     fieldName = self.getParameterValue(self.FIELD_NAME)
     outputFile = self.getOutputValue(self.OUTPUT)
     values = QgsProcessingUtils.uniqueValues(layer, layer.fields().lookupField(fieldName), context)
     self.createHTML(outputFile, values)
     self.setOutputValue(self.TOTAL_VALUES, len(values))
     self.setOutputValue(self.UNIQUE_VALUES, ';'.join([str(v) for v in
                                                       values]))
Exemple #6
0
    def processAlgorithm(self, context, feedback):
        filename = self.getParameterValue(self.INPUT)

        layer = dataobjects.getLayerFromString(filename)
        field = self.getParameterValue(self.FIELD)
        method = self.getParameterValue(self.METHOD)

        index = layer.fields().lookupField(field)

        features = QgsProcessingUtils.getFeatures(layer, context)
        featureCount = QgsProcessingUtils.featureCount(layer, context)
        unique = QgsProcessingUtils.uniqueValues(layer, index, context)
        value = int(self.getParameterValue(self.NUMBER))
        if method == 0:
            if value > featureCount:
                raise GeoAlgorithmExecutionException(
                    self.tr('Selected number is greater that feature count. '
                            'Choose lesser value and try again.'))
        else:
            if value > 100:
                raise GeoAlgorithmExecutionException(
                    self.tr("Percentage can't be greater than 100. Set "
                            "correct value and try again."))
            value = value / 100.0

        writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(
            layer.fields().toList(), layer.wkbType(), layer.crs(), context)

        selran = []
        total = 100.0 / (featureCount * len(unique))
        features = QgsProcessingUtils.getFeatures(layer, context)

        classes = defaultdict(list)
        for i, feature in enumerate(features):
            attrs = feature.attributes()
            classes[attrs[index]].append(feature)
            feedback.setProgress(int(i * total))

        for subset in classes.values():
            selValue = value if method != 1 else int(
                round(value * len(subset), 0))
            selran.extend(random.sample(subset, selValue))

        features = QgsProcessingUtils.getFeatures(layer, context)
        total = 100.0 / QgsProcessingUtils.featureCount(layer, context)
        for (i, feat) in enumerate(selran):
            writer.addFeature(feat)
            feedback.setProgress(int(i * total))
        del writer
    def processAlgorithm(self, parameters, context, feedback):
        filename = self.getParameterValue(self.INPUT)

        layer = QgsProcessingUtils.mapLayerFromString(filename, context)
        field = self.getParameterValue(self.FIELD)
        method = self.getParameterValue(self.METHOD)

        index = layer.fields().lookupField(field)

        features = QgsProcessingUtils.getFeatures(layer, context)
        featureCount = QgsProcessingUtils.featureCount(layer, context)
        unique = QgsProcessingUtils.uniqueValues(layer, index, context)
        value = int(self.getParameterValue(self.NUMBER))
        if method == 0:
            if value > featureCount:
                raise GeoAlgorithmExecutionException(
                    self.tr('Selected number is greater that feature count. '
                            'Choose lesser value and try again.'))
        else:
            if value > 100:
                raise GeoAlgorithmExecutionException(
                    self.tr("Percentage can't be greater than 100. Set "
                            "correct value and try again."))
            value = value / 100.0

        writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.fields(), layer.wkbType(),
                                                                     layer.crs(), context)

        selran = []
        total = 100.0 / (featureCount * len(unique))
        features = QgsProcessingUtils.getFeatures(layer, context)

        classes = defaultdict(list)
        for i, feature in enumerate(features):
            attrs = feature.attributes()
            classes[attrs[index]].append(feature)
            feedback.setProgress(int(i * total))

        for subset in classes.values():
            selValue = value if method != 1 else int(round(value * len(subset), 0))
            selran.extend(random.sample(subset, selValue))

        features = QgsProcessingUtils.getFeatures(layer, context)
        total = 100.0 / QgsProcessingUtils.featureCount(layer, context)
        for (i, feat) in enumerate(selran):
            writer.addFeature(feat)
            feedback.setProgress(int(i * total))
        del writer