def process_layers(self):

        download_path = self.dlg.download_path.text()

        if self.dlg.download_path.text() is None or len(
                self.dlg.download_path.text()) == 0:
            QMessageBox.critical(None, self.tr('Error'),
                                 self.tr('Please insert the download folder'))

        elif (int(self.dlg.cbToYear.currentText())) - int(
                self.dlg.cbFromYear.currentText()) < 0:
            QMessageBox.critical(None, self.tr('Error'),
                                 self.tr('Year selection is not valid'))

        else:
            processed_layers = 0
            self.dlg.progressBar.setValue(processed_layers)
            self.dlg.progressText.setText('Fetching Data from the World Bank')

            indicator_name = self.dlg.cbIndicator.currentText()
            indicator = self.indicators[indicator_name]

            from_year = int(self.dlg.cbFromYear.currentText())
            to_year = int(self.dlg.cbToYear.currentText()) + 1
            total_years = to_year - from_year

            layers = []
            layers_not_available = []

            # create tmp layer
            tmp_layer = QgsVectorLayer("Polygon?crs=EPSG:4326", "tmp",
                                       "memory")
            tmp_data_provider = tmp_layer.dataProvider()

            # add fields
            tmp_data_provider.addAttributes(
                [QgsField("value", QVariant.Double)])

            data = get_world_bank_data(indicator, str(from_year),
                                       str(to_year - 1))

            # copy layer
            output_file = copy_layer(download_path, indicator_name)

            layer = QgsVectorLayer(output_file, "layer_name", "ogr")

            # create layer by year
            for index, year in enumerate(range(from_year, to_year)):
                self.dlg.progressText.setText('Processing ' + str(year))

                data_yearly = get_data_by_year(data, year)
                if len(data_yearly) > 0:
                    added = create_layer(layer, tmp_layer, data_yearly, year,
                                         index)
                    layers.append(str(year))
                else:
                    layers_not_available.append(str(year))

                # update procgress bar
                processed_layers += 1
                self.dlg.progressBar.setValue(
                    int((float(processed_layers) / float(total_years)) * 100))

            # commit changed on tmp layer
            tmp_layer.commitChanges()
            layer.commitChanges()

            renderer = create_join_renderer(tmp_layer, 'value', 5,
                                            QgsGraduatedSymbolRendererV2.Jenks)

            if self.dlg.open_in_qgis.isChecked():
                for index, year in enumerate(reversed(layers)):
                    l = QgsVectorLayer(output_file,
                                       indicator_name + ' (' + str(year) + ')',
                                       "ogr")
                    r = renderer.clone()
                    r.setClassAttribute(str(year))
                    l.setRendererV2(r)
                    QgsMapLayerRegistry.instance().addMapLayer(l)
                    self.iface.legendInterface().setLayerVisible(
                        l, (index == 0))

                    # for index, year in enumerate(range(from_year, to_year)):
                    #     if str(year) not in layers_not_available:
                    #         l = QgsVectorLayer(output_file, indicator_name + ' (' + str(year) + ')', "ogr")
                    #         r = renderer.clone()
                    #         r.setClassAttribute(str(year))
                    #         l.setRendererV2(r)
                    #         QgsMapLayerRegistry.instance().addMapLayer(l)
                    #         self.iface.legendInterface().setLayerVisible(l, (index == (to_year - from_year-1)))

            self.iface.mapCanvas().refresh()

            self.dlg.progressText.setText('Process Finished')

            if len(layers_not_available) > 0:
                self.iface.messageBar().pushMessage(
                    indicator_name,
                    'Data are not available for ' +
                    ', '.join(layers_not_available) + '',
                    level=QgsMessageBar.WARNING)
    def process_layers(self):

        download_path = self.dlg.download_path.text()

        if self.dlg.download_path.text() is None or len(self.dlg.download_path.text()) == 0:
            QMessageBox.critical(None, self.tr('Error'), self.tr('Please insert the download folder'))

        elif (int(self.dlg.cbToYear.currentText())) - int(self.dlg.cbFromYear.currentText()) < 0:
            QMessageBox.critical(None, self.tr('Error'), self.tr('Year selection is not valid'))

        else:
            processed_layers = 0
            self.dlg.progressBar.setValue(processed_layers)
            self.dlg.progressText.setText('Fetching Data from the World Bank')

            indicator_name = self.dlg.cbIndicator.currentText()
            indicator = self.indicators[indicator_name]

            from_year = int(self.dlg.cbFromYear.currentText())
            to_year = int(self.dlg.cbToYear.currentText()) + 1
            total_years = to_year - from_year

            layers = []
            layers_not_available = []

            # create tmp layer
            tmp_layer = QgsVectorLayer("Polygon?crs=EPSG:4326", "tmp", "memory")
            tmp_data_provider = tmp_layer.dataProvider()

            # add fields
            tmp_data_provider.addAttributes([QgsField("value", QVariant.Double)])

            data = get_world_bank_data(indicator, str(from_year), str(to_year-1))

            # copy layer
            output_file = copy_layer(download_path, indicator_name)

            layer = QgsVectorLayer(output_file, "layer_name", "ogr")

            # create layer by year
            for index, year in enumerate(range(from_year, to_year)):
                self.dlg.progressText.setText('Processing ' + str(year))

                data_yearly = get_data_by_year(data, year)
                if len(data_yearly) > 0:
                    added = create_layer(layer, tmp_layer, data_yearly, year, index)
                    layers.append(str(year))
                else:
                    layers_not_available.append(str(year))


                # update procgress bar
                processed_layers += 1
                self.dlg.progressBar.setValue(int((float(processed_layers) / float(total_years)) * 100))

            # commit changed on tmp layer
            tmp_layer.commitChanges()
            layer.commitChanges()

            renderer = create_join_renderer(tmp_layer, 'value', 5,  QgsGraduatedSymbolRendererV2.Jenks)

            if self.dlg.open_in_qgis.isChecked():
                for index, year in enumerate(reversed(layers)):
                    l = QgsVectorLayer(output_file, indicator_name + ' (' + str(year) + ')', "ogr")
                    r = renderer.clone()
                    r.setClassAttribute(str(year))
                    l.setRendererV2(r)
                    QgsMapLayerRegistry.instance().addMapLayer(l)
                    self.iface.legendInterface().setLayerVisible(l, (index == 0))

                    # for index, year in enumerate(range(from_year, to_year)):
                    #     if str(year) not in layers_not_available:
                    #         l = QgsVectorLayer(output_file, indicator_name + ' (' + str(year) + ')', "ogr")
                    #         r = renderer.clone()
                    #         r.setClassAttribute(str(year))
                    #         l.setRendererV2(r)
                    #         QgsMapLayerRegistry.instance().addMapLayer(l)
                    #         self.iface.legendInterface().setLayerVisible(l, (index == (to_year - from_year-1)))

            self.iface.mapCanvas().refresh()

            self.dlg.progressText.setText('Process Finished')

            if len(layers_not_available) > 0:
                self.iface.messageBar().pushMessage(indicator_name, 'Data are not available for ' + ', '.join(layers_not_available) + '', level=QgsMessageBar.WARNING)
    def download_data(self):

        # Get user selection
        group_code = self.cbGroups.itemData(self.cbGroups.currentIndex())
        domain_code = self.cbDomains.itemData(self.cbDomains.currentIndex())
        element_code = self.cbElements.itemData(self.cbElements.currentIndex())
        item_code = self.cbItems.itemData(self.cbItems.currentIndex())
        download_folder = self.download_folder.text()

        # Check selection
        if group_code is None:
            self.bar.pushMessage(None, self.tr('Please select a group'), level=QgsMessageBar.CRITICAL)
        elif domain_code is None:
            self.bar.pushMessage(None, self.tr('Please select a domain'), level=QgsMessageBar.CRITICAL)
        elif element_code is None:
            self.bar.pushMessage(None, self.tr('Please select an element'), level=QgsMessageBar.CRITICAL)
        elif item_code is None:
            self.bar.pushMessage(None, self.tr('Please select an item'), level=QgsMessageBar.CRITICAL)
        elif download_folder is None or len(download_folder) == 0:
            self.bar.pushMessage(None, self.tr('Please select a download folder'), level=QgsMessageBar.CRITICAL)
        else:
            # Get data
            data = get_data(domain_code, element_code, item_code)
            # Notify the user
            self.bar.pushMessage(None, self.tr('Downloaded rows: ') + str(len(data)), level=QgsMessageBar.INFO)
            # Layer name
            layer_name = self.cbItems.currentText().replace(' ', '_') + '_' + self.cbElements.currentText().replace(' ', '_')
            folder_name = os.path.join(download_folder, group_code, domain_code)
            if not os.path.exists(folder_name):
                os.makedirs(folder_name)
            # Copy template layer
            output_file = copy_layer(folder_name, layer_name)
            layer = QgsVectorLayer(output_file, 'layer_name', 'ogr')
            # Add all the years to the layer
            feature_idx = 64
            year_to_be_shown = 2014
            number_of_nulls = 0
            for year in range(2014, 1960, -1):
                progress = (1 + (feature_idx - 64)) * 1.86
                self.progress.setValue(progress)
                self.progress_label.setText('<b>' + self.tr('Progress') + ': ' + '</b> ' + self.tr('Adding Year ') + str(year))
                year_data = self.get_year_data(data, year)
                layer.dataProvider().addAttributes([QgsField(str(year), QVariant.Double)])
                if len(year_data) > 0:
                    layer.startEditing()
                    for feature in layer.getFeatures():
                        if feature['FAOSTAT'] is not None:
                            feature_code = str(feature['FAOSTAT'])
                            for d in year_data:
                                data_code = str(d['code'])
                                if data_code == feature_code:
                                    value = d['value']
                                    layer.changeAttributeValue(feature.id(), (feature_idx), float(value))
                                    tmp_feature = QgsFeature()
                                    tmp_feature.setAttributes([float(value)])
                                    layer.dataProvider().addFeatures([tmp_feature])
                                    if value is None:
                                        number_of_nulls += 1
                    layer.commitChanges()
                else:
                    year_to_be_shown -= 1
                feature_idx += 1
            # Add layer to canvas
            if self.add_to_canvas.isChecked():
                renderer = self.create_join_renderer(layer, str(year_to_be_shown), 11, QgsGraduatedSymbolRendererV2.Pretty)
                l = QgsVectorLayer(output_file, layer_name + '(' + str(year_to_be_shown) + ')', 'ogr')
                r = renderer.clone()
                r.setClassAttribute(str(year_to_be_shown))
                l.setRendererV2(r)
                QgsMapLayerRegistry.instance().addMapLayer(l)
                self.iface.legendInterface().setLayerVisible(l, True)
            # Close pop-up
            self.dlg.close()
Exemplo n.º 4
0
    def download_data(self):

        # Get user selection
        group_code = self.cbGroups.itemData(self.cbGroups.currentIndex())
        domain_code = self.cbDomains.itemData(self.cbDomains.currentIndex())
        element_code = self.cbElements.itemData(self.cbElements.currentIndex())
        item_code = self.cbItems.itemData(self.cbItems.currentIndex())
        download_folder = self.download_folder.text()

        # Check selection
        if group_code is None:
            self.bar.pushMessage(None,
                                 self.tr('Please select a group'),
                                 level=QgsMessageBar.CRITICAL)
        elif domain_code is None:
            self.bar.pushMessage(None,
                                 self.tr('Please select a domain'),
                                 level=QgsMessageBar.CRITICAL)
        elif element_code is None:
            self.bar.pushMessage(None,
                                 self.tr('Please select an element'),
                                 level=QgsMessageBar.CRITICAL)
        elif item_code is None:
            self.bar.pushMessage(None,
                                 self.tr('Please select an item'),
                                 level=QgsMessageBar.CRITICAL)
        elif download_folder is None or len(download_folder) == 0:
            self.bar.pushMessage(None,
                                 self.tr('Please select a download folder'),
                                 level=QgsMessageBar.CRITICAL)
        else:
            # Get data
            data = get_data(domain_code, element_code, item_code)
            # Notify the user
            self.bar.pushMessage(None,
                                 self.tr('Downloaded rows: ') + str(len(data)),
                                 level=QgsMessageBar.INFO)
            # Layer name
            layer_name = self.cbItems.currentText().replace(
                ' ', '_') + '_' + self.cbElements.currentText().replace(
                    ' ', '_')
            folder_name = os.path.join(download_folder, group_code,
                                       domain_code)
            if not os.path.exists(folder_name):
                os.makedirs(folder_name)
            # Copy template layer
            output_file = copy_layer(folder_name, layer_name)
            layer = QgsVectorLayer(output_file, 'layer_name', 'ogr')
            # Add all the years to the layer
            feature_idx = 64
            year_to_be_shown = 2014
            number_of_nulls = 0
            for year in range(2014, 1960, -1):
                progress = (1 + (feature_idx - 64)) * 1.86
                self.progress.setValue(progress)
                self.progress_label.setText('<b>' + self.tr('Progress') +
                                            ': ' + '</b> ' +
                                            self.tr('Adding Year ') +
                                            str(year))
                year_data = self.get_year_data(data, year)
                layer.dataProvider().addAttributes(
                    [QgsField(str(year), QVariant.Double)])
                if len(year_data) > 0:
                    layer.startEditing()
                    for feature in layer.getFeatures():
                        if feature['FAOSTAT'] is not None:
                            feature_code = str(feature['FAOSTAT'])
                            for d in year_data:
                                data_code = str(d['code'])
                                if data_code == feature_code:
                                    value = d['value']
                                    layer.changeAttributeValue(
                                        feature.id(), (feature_idx),
                                        float(value))
                                    tmp_feature = QgsFeature()
                                    tmp_feature.setAttributes([float(value)])
                                    layer.dataProvider().addFeatures(
                                        [tmp_feature])
                                    if value is None:
                                        number_of_nulls += 1
                    layer.commitChanges()
                else:
                    year_to_be_shown -= 1
                feature_idx += 1
            # Add layer to canvas
            if self.add_to_canvas.isChecked():
                renderer = self.create_join_renderer(
                    layer, str(year_to_be_shown), 11,
                    QgsGraduatedSymbolRendererV2.Pretty)
                l = QgsVectorLayer(
                    output_file,
                    layer_name + '(' + str(year_to_be_shown) + ')', 'ogr')
                r = renderer.clone()
                r.setClassAttribute(str(year_to_be_shown))
                l.setRendererV2(r)
                QgsMapLayerRegistry.instance().addMapLayer(l)
                self.iface.legendInterface().setLayerVisible(l, True)
            # Close pop-up
            self.dlg.close()