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()
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()