def require_directory(self): """Ensure directory path entered in dialog exist. When the path does not exist, this function will ask the user if he want to create it or not. TODO: This is cut & paste from OSM - refactor to have one method :raises: CanceledImportDialogError - when user choose 'No' in the question dialog for creating directory. """ path = self.output_directory.text() if os.path.exists(path): return title = self.tr('Directory %s not exist') % path question = self.tr( 'Directory %s not exist. Do you want to create it?') % path # noinspection PyCallByClass,PyTypeChecker answer = QMessageBox.question(self, title, question, QMessageBox.Yes | QMessageBox.No) if answer == QMessageBox.Yes: if len(path) != 0: os.makedirs(path) else: # noinspection PyCallByClass,PyTypeChecker,PyArgumentList display_warning_message_box( self, self.tr('InaSAFE error'), self.tr('Output directory can not be empty.')) raise CanceledImportDialogError() else: raise CanceledImportDialogError()
def download(self, url, output_path): """Download file from API url and write to output path. :param url: URL of the API. :type url: str :param output_path: Path of output file, :type output_path: str """ request_failed_message = self.tr( "Can't access PetaBencana API: {source}").format( source=url) downloader = FileDownloader(url, output_path) result, message = downloader.download() if not result: display_warning_message_box( self, self.tr('Download error'), self.tr(request_failed_message + '\n' + message)) if result == QNetworkReply.OperationCanceledError: display_warning_message_box( self, self.tr('Download error'), self.tr(message))
def require_directory(self): """Ensure directory path entered in dialog exist. When the path does not exist, this function will ask the user if he want to create it or not. :raises: CanceledImportDialogError - when user choose 'No' in the question dialog for creating directory. """ path = self.output_directory.text() if os.path.exists(path): return title = self.tr('Directory %s not exist') % path question = self.tr( 'Directory %s not exist. Do you want to create it?') % path # noinspection PyCallByClass,PyTypeChecker answer = QMessageBox.question( self, title, question, QMessageBox.Yes | QMessageBox.No) if answer == QMessageBox.Yes: if len(path) != 0: os.makedirs(path) else: # noinspection PyCallByClass,PyTypeChecker,PyArgumentList display_warning_message_box( self, self.tr('InaSAFE error'), self.tr('Output directory can not be empty.')) raise CanceledImportDialogError() else: raise CanceledImportDialogError()
def accept(self): """Upload the layer to Geonode.""" enable_busy_cursor() self.button_box.setEnabled(False) layer = layer_from_combo(self.layers) login = self.login.text() if self.save_login.isChecked(): set_setting(GEONODE_USER, login) else: set_setting(GEONODE_USER, '') password = self.password.text() if self.save_password.isChecked(): set_setting(GEONODE_PASSWORD, password) else: set_setting(GEONODE_PASSWORD, '') url = self.url.text() if self.save_url.isChecked(): set_setting(GEONODE_URL, url) else: set_setting(GEONODE_URL, '') geonode_session = login_user(url, login, password) try: result = upload(url, geonode_session, layer.source()) except GeoNodeLayerUploadError as e: result = { 'success': False, 'message': str(e) } finally: self.button_box.setEnabled(True) disable_busy_cursor() if result['success']: self.done(QDialog.Accepted) layer_url = urljoin(url, result['url']) # Link is not working in QGIS 2. # It's gonna work in QGIS 3. if qgis_version() >= 29900: external_link = '<a href=\"{url}\">{url}</a>'.format( url=layer_url) else: external_link = layer_url display_success_message_bar( tr('Uploading done'), tr('Successfully uploaded to {external_link}').format( external_link=external_link), ) else: display_warning_message_box( self, tr('Error while uploading the layer.'), str(result) )
def on_pbnNext_released(self): """Handle the Next button release. .. note:: This is an automatic Qt slot executed when the Next button is released. """ current_step = self.get_current_step() if current_step == self.step_kw_fields_mapping: try: self.step_kw_fields_mapping.get_field_mapping() except InvalidValidationException as e: display_warning_message_box(self, tr('Invalid Field Mapping'), str(e)) return if current_step.step_type == STEP_FC: self.impact_function_steps.append(current_step) elif current_step.step_type == STEP_KW: self.keyword_steps.append(current_step) else: LOGGER.debug(current_step.step_type) raise InvalidWizardStep # Save keywords if it's the end of the keyword creation mode if current_step == self.step_kw_summary: self.save_current_keywords() # After any step involving Browser, add selected layer to map canvas if current_step in [ self.step_fc_hazlayer_from_browser, self.step_fc_explayer_from_browser, self.step_fc_agglayer_from_browser ]: if not QgsProject.instance().mapLayersByName(self.layer.name()): QgsProject.instance().addMapLayers([self.layer]) # Make the layer visible. Might be hidden by default. See #2925 treeroot = QgsProject.instance().layerTreeRoot() treelayer = treeroot.findLayer(self.layer.id()) if treelayer: treelayer.setItemVisibilityChecked(True) # After the extent selection, save the extent and disconnect signals if current_step == self.step_fc_extent: self.step_fc_extent.write_extent() # Determine the new step to be switched new_step = current_step.get_next_step() if new_step is not None: # Prepare the next tab new_step.set_widgets() else: # Wizard complete self.accept() return self.go_to_step(new_step)
def on_pbnNext_released(self): """Handle the Next button release. .. note:: This is an automatic Qt slot executed when the Next button is released. """ current_step = self.get_current_step() if current_step == self.step_kw_fields_mapping: try: self.step_kw_fields_mapping.get_field_mapping() except InvalidValidationException as e: display_warning_message_box( self, tr('Invalid Field Mapping'), str(e)) return if current_step.step_type == STEP_FC: self.impact_function_steps.append(current_step) elif current_step.step_type == STEP_KW: self.keyword_steps.append(current_step) else: LOGGER.debug(current_step.step_type) raise InvalidWizardStep # Save keywords if it's the end of the keyword creation mode if current_step == self.step_kw_summary: self.save_current_keywords() # After any step involving Browser, add selected layer to map canvas if current_step in [self.step_fc_hazlayer_from_browser, self.step_fc_explayer_from_browser, self.step_fc_agglayer_from_browser]: if not QgsProject.instance().mapLayersByName( self.layer.name()): QgsProject.instance().addMapLayers([self.layer]) # Make the layer visible. Might be hidden by default. See #2925 treeroot = QgsProject.instance().layerTreeRoot() treelayer = treeroot.findLayer(self.layer.id()) if treelayer: treelayer.setItemVisibilityChecked(True) # After the extent selection, save the extent and disconnect signals if current_step == self.step_fc_extent: self.step_fc_extent.write_extent() # Determine the new step to be switched new_step = current_step.get_next_step() if new_step is not None: # Prepare the next tab new_step.set_widgets() else: # Wizard complete self.accept() return self.go_to_step(new_step)
def accept(self): """Method invoked when OK button is clicked.""" try: self.save_metadata() except InvalidValidationException as e: display_warning_message_box( self, tr('Invalid Field Mapping'), str(e)) return super(FieldMappingDialog, self).accept()
def accept(self): """Method invoked when OK button is clicked.""" try: self.save_metadata() except InvalidValidationException as e: display_warning_message_box( self, tr('Invalid Field Mapping'), get_string(e.message)) return super(FieldMappingDialog, self).accept()
def accept(self): """Method invoked when OK button is clicked.""" if not self.is_good_age_ratios(): display_warning_message_box( self, tr('Wrong Sum Age Ratio'), tr('You have set age ratio whose sum is not equal to 1. ' 'Please fix it in the <b>Global Default</b> tab before you ' 'can save it.')) return self.save_state() # FIXME: Option dialog should be independent from dock. if self.dock: self.dock.read_settings() self.close()
def accept(self): """Method invoked when OK button is clicked.""" output_path = self.output_path_line_edit.text() if not output_path: display_warning_message_box( self, tr('Empty Output Path'), tr('Output path can not be empty')) return try: self.convert_metadata() except MetadataConversionError as e: display_warning_message_box( self, tr('Metadata Conversion Failed'), str(e)) return if not os.path.exists(output_path): display_warning_message_box( self, tr('Metadata Conversion Failed'), tr('Result file is not found.')) return display_success_message_bar( tr('Metadata Conversion Success'), tr('You can find your copied layer with metadata version 3.5 in ' '%s' % output_path), iface_object=self.iface ) super(MetadataConverterDialog, self).accept()
def accept(self): """Method invoked when OK button is clicked.""" output_path = self.output_path_line_edit.text() if not output_path: display_warning_message_box(self, tr('Empty Output Path'), tr('Output path can not be empty')) return try: self.convert_metadata() except MetadataConversionError as e: display_warning_message_box(self, tr('Metadata Conversion Failed'), str(e)) return if not os.path.exists(output_path): display_warning_message_box(self, tr('Metadata Conversion Failed'), tr('Result file is not found.')) return display_success_message_bar( tr('Metadata Conversion Success'), tr('You can find your copied layer with metadata version 3.5 in ' '%s' % output_path), iface_object=self.iface) super(MetadataConverterDialog, self).accept()
def accept(self): """Do osm download and display it in QGIS.""" error_dialog_title = self.tr('InaSAFE OpenStreetMap Downloader Error') # Lock the bounding_box_group self.bounding_box_group.setDisabled(True) # Get the extent y_minimum = self.y_minimum.value() y_maximum = self.y_maximum.value() x_minimum = self.x_minimum.value() x_maximum = self.x_maximum.value() extent = [x_minimum, y_minimum, x_maximum, y_maximum] # Validate extent valid_flag = validate_geo_array(extent) if not valid_flag: message = self.tr( 'The bounding box is not valid. Please make sure it is ' 'valid or check your projection!') # noinspection PyCallByClass,PyTypeChecker,PyArgumentList display_warning_message_box(self, error_dialog_title, message) # Unlock the bounding_box_group self.bounding_box_group.setEnabled(True) return # Validate features feature_types = self.get_checked_features() if len(feature_types) < 1: message = self.tr( 'No feature selected. ' 'Please make sure you have checked one feature.') # noinspection PyCallByClass,PyTypeChecker,PyArgumentList display_warning_message_box(self, error_dialog_title, message) # Unlock the bounding_box_group self.bounding_box_group.setEnabled(True) return try: self.save_state() self.require_directory() for feature_type in feature_types: output_directory = self.output_directory.text() output_prefix = self.filename_prefix.text() overwrite = self.overwrite_flag.isChecked() output_base_file_path = self.get_output_base_path( output_directory, output_prefix, feature_type, overwrite) download( feature_type, output_base_file_path, extent, self.progress_dialog) try: self.load_shapefile(feature_type, output_base_file_path) except FileMissingError as exception: display_warning_message_box( self, error_dialog_title, exception.message) self.done(QDialog.Accepted) self.rectangle_map_tool.reset() except CanceledImportDialogError: # don't show anything because this exception raised # when user canceling the import process directly pass except Exception as exception: # pylint: disable=broad-except # noinspection PyCallByClass,PyTypeChecker,PyArgumentList display_warning_message_box( self, error_dialog_title, exception.message) self.progress_dialog.cancel() finally: # Unlock the bounding_box_group self.bounding_box_group.setEnabled(True)
def on_pbnNext_released(self): """Handle the Next button release. .. note:: This is an automatic Qt slot executed when the Next button is released. """ current_step = self.get_current_step() # For checking age sum == 1 if current_step == self.step_kw_default_inasafe_fields: good_ratios = self.step_kw_default_inasafe_fields.\ is_good_age_ratios() self.step_kw_default_inasafe_fields.toggle_age_ratio_sum_message( good_ratios) if not good_ratios: return if current_step == self.step_kw_fields_mapping: try: self.step_kw_fields_mapping.get_field_mapping() except InvalidValidationException as e: display_warning_message_box( self, tr('Invalid Field Mapping'), get_string(e.message)) return if current_step.step_type == 'step_fc': self.impact_function_steps.append(current_step) elif current_step.step_type == 'step_kw': self.keyword_steps.append(current_step) else: LOGGER.debug(current_step.step_type) raise InvalidWizardStep # Save keywords if it's the end of the keyword creation mode if current_step == self.step_kw_summary: self.save_current_keywords() # After any step involving Browser, add selected layer to map canvas if current_step in [self.step_fc_hazlayer_from_browser, self.step_fc_explayer_from_browser, self.step_fc_agglayer_from_browser]: if not QgsMapLayerRegistry.instance().mapLayersByName( self.layer.name()): QgsMapLayerRegistry.instance().addMapLayers([self.layer]) # Make the layer visible. Might be hidden by default. See #2925 legend = self.iface.legendInterface() legend.setLayerVisible(self.layer, True) # After the extent selection, save the extent and disconnect signals if current_step == self.step_fc_extent: self.step_fc_extent.write_extent() # Determine the new step to be switched new_step = current_step.get_next_step() if new_step is not None: # Prepare the next tab new_step.set_widgets() else: # Wizard complete self.accept() return self.go_to_step(new_step)
def accept(self): """Do PetaBencana download and display it in QGIS. .. versionadded: 3.3 """ self.save_state() try: self.require_directory() except CanceledImportDialogError: return QtGui.qApp.setOverrideCursor(QtGui.QCursor(QtCore.Qt.WaitCursor)) source = self.define_url() # save the file as json first name = 'jakarta_flood.json' output_directory = self.output_directory.text() output_prefix = self.filename_prefix.text() overwrite = self.overwrite_flag.isChecked() date_stamp_flag = self.include_date_flag.isChecked() output_base_file_path = self.get_output_base_path( output_directory, output_prefix, date_stamp_flag, name, overwrite) title = self.tr("Can't access API") try: self.download(source, output_base_file_path) # Open downloaded file as QgsMapLayer layer = QgsVectorLayer(output_base_file_path, 'flood', 'ogr', False) except Exception as e: disable_busy_cursor() QMessageBox.critical(self, title, str(e)) return self.time_stamp = time.strftime('%d-%b-%Y %H:%M:%S') # Now save as shp name = 'jakarta_flood.shp' output_base_file_path = self.get_output_base_path( output_directory, output_prefix, date_stamp_flag, name, overwrite) QgsVectorFileWriter.writeAsVectorFormat(layer, output_base_file_path, 'CP1250', None, 'ESRI Shapefile') # Get rid of the GeoJSON layer and rather use local shp del layer self.copy_style(output_base_file_path) self.copy_keywords(output_base_file_path) layer = self.add_flooded_field(output_base_file_path) # check if the layer has feature or not if layer.featureCount() <= 0: city = self.city_combo_box.currentText() message = self.tr('There are no floods data available on {city} ' 'at this time.').format(city=city) display_warning_message_box(self, self.tr('No data'), message) disable_busy_cursor() else: # add the layer to the map registry = QgsMapLayerRegistry.instance() registry.addMapLayer(layer) disable_busy_cursor() self.done(QDialog.Accepted)
def accept(self): """Do osm download and display it in QGIS.""" error_dialog_title = self.tr('InaSAFE OpenStreetMap Downloader Error') # Lock the bounding_box_group self.bounding_box_group.setDisabled(True) # Get the extent y_minimum = self.y_minimum.value() y_maximum = self.y_maximum.value() x_minimum = self.x_minimum.value() x_maximum = self.x_maximum.value() extent = [x_minimum, y_minimum, x_maximum, y_maximum] # Validate extent valid_flag = validate_geo_array(extent) if not valid_flag: message = self.tr( 'The bounding box is not valid. Please make sure it is ' 'valid or check your projection!') # noinspection PyCallByClass,PyTypeChecker,PyArgumentList display_warning_message_box(self, error_dialog_title, message) # Unlock the bounding_box_group self.bounding_box_group.setEnabled(True) return # Validate features feature_types = self.get_checked_features() if len(feature_types) < 1: message = self.tr('No feature selected. ' 'Please make sure you have checked one feature.') # noinspection PyCallByClass,PyTypeChecker,PyArgumentList display_warning_message_box(self, error_dialog_title, message) # Unlock the bounding_box_group self.bounding_box_group.setEnabled(True) return if self.radio_custom.isChecked(): server_url = self.line_edit_custom.text() if not server_url: # It's the place holder. server_url = STAGING_SERVER else: server_url = PRODUCTION_SERVER try: self.save_state() self.require_directory() # creating progress dialog for download self.progress_dialog = QProgressDialog(self) self.progress_dialog.setAutoClose(False) self.progress_dialog.setWindowTitle(self.windowTitle()) for feature_type in feature_types: output_directory = self.output_directory.text() if output_directory == '': output_directory = temp_dir(sub_dir='work') output_prefix = self.filename_prefix.text() overwrite = self.overwrite_flag.isChecked() output_base_file_path = self.get_output_base_path( output_directory, output_prefix, feature_type, overwrite) # noinspection PyTypeChecker download(feature_type, output_base_file_path, extent, self.progress_dialog, server_url) try: self.load_shapefile(feature_type, output_base_file_path) except FileMissingError as exception: display_warning_message_box(self, error_dialog_title, str(exception)) self.done(QDialog.Accepted) self.rectangle_map_tool.reset() except CanceledImportDialogError: # don't show anything because this exception raised # when user canceling the import process directly pass except Exception as exception: # pylint: disable=broad-except # noinspection PyCallByClass,PyTypeChecker,PyArgumentList display_warning_message_box(self, error_dialog_title, str(exception)) self.progress_dialog.cancel() self.progress_dialog.deleteLater() finally: # Unlock the bounding_box_group self.bounding_box_group.setEnabled(True)
def accept(self): """Do osm download and display it in QGIS.""" error_dialog_title = self.tr('InaSAFE OpenStreetMap Downloader Error') # Lock the groupbox self.groupBox.setDisabled(True) # Validate extent valid_flag = self.validate_extent() if not valid_flag: message = self.tr( 'The bounding box is not valid. Please make sure it is ' 'valid or check your projection!') # noinspection PyCallByClass,PyTypeChecker,PyArgumentList display_warning_message_box(self, error_dialog_title, message) # Unlock the groupbox self.groupBox.setEnabled(True) return # Get all the feature types index = self.feature_type.currentIndex() if index == 0: feature_types = ['buildings', 'roads', 'building-points'] elif index == 1: feature_types = ['buildings'] elif index == 2: feature_types = ['building-points'] else: feature_types = ['roads'] try: self.save_state() self.require_directory() for feature_type in feature_types: output_directory = self.output_directory.text() output_prefix = self.filename_prefix.text() overwrite = self.overwrite_checkBox.isChecked() output_base_file_path = self.get_output_base_path( output_directory, output_prefix, feature_type, overwrite) self.download(feature_type, output_base_file_path) try: self.load_shapefile(feature_type, output_base_file_path) except FileMissingError as exception: display_warning_message_box( self, error_dialog_title, exception.message) self.done(QDialog.Accepted) self.rectangle_map_tool.reset() except CanceledImportDialogError: # don't show anything because this exception raised # when user canceling the import process directly pass except Exception as exception: # pylint: disable=broad-except # noinspection PyCallByClass,PyTypeChecker,PyArgumentList display_warning_message_box( self, error_dialog_title, exception.message) self.progress_dialog.cancel() finally: # Unlock the groupbox self.groupBox.setEnabled(True)
def on_pbnNext_released(self): """Handle the Next button release. .. note:: This is an automatic Qt slot executed when the Next button is released. """ current_step = self.get_current_step() # For checking age sum == 1 if current_step == self.step_kw_default_inasafe_fields: good_ratios = self.step_kw_default_inasafe_fields.\ is_good_age_ratios() self.step_kw_default_inasafe_fields.toggle_age_ratio_sum_message( good_ratios) if not good_ratios: return if current_step == self.step_kw_fields_mapping: try: self.step_kw_fields_mapping.get_field_mapping() except InvalidValidationException as e: display_warning_message_box(self, tr('Invalid Field Mapping'), get_string(e.message)) return if current_step.step_type == 'step_fc': self.impact_function_steps.append(current_step) elif current_step.step_type == 'step_kw': self.keyword_steps.append(current_step) else: LOGGER.debug(current_step.step_type) raise InvalidWizardStep # Save keywords if it's the end of the keyword creation mode if current_step == self.step_kw_summary: self.save_current_keywords() # After any step involving Browser, add selected layer to map canvas if current_step in [ self.step_fc_hazlayer_from_browser, self.step_fc_explayer_from_browser, self.step_fc_agglayer_from_browser ]: if not QgsMapLayerRegistry.instance().mapLayersByName( self.layer.name()): QgsMapLayerRegistry.instance().addMapLayers([self.layer]) # Make the layer visible. Might be hidden by default. See #2925 legend = self.iface.legendInterface() legend.setLayerVisible(self.layer, True) # After the extent selection, save the extent and disconnect signals if current_step == self.step_fc_extent: self.step_fc_extent.write_extent() # Determine the new step to be switched new_step = current_step.get_next_step() if new_step is not None: # Prepare the next tab new_step.set_widgets() else: # Wizard complete self.accept() return self.go_to_step(new_step)
def accept(self): """Do osm download and display it in QGIS.""" error_dialog_title = self.tr('InaSAFE OpenStreetMap Downloader Error') # Lock the bounding_box_group self.bounding_box_group.setDisabled(True) # Get the extent y_minimum = self.y_minimum.value() y_maximum = self.y_maximum.value() x_minimum = self.x_minimum.value() x_maximum = self.x_maximum.value() extent = [x_minimum, y_minimum, x_maximum, y_maximum] # Validate extent valid_flag = validate_geo_array(extent) if not valid_flag: message = self.tr( 'The bounding box is not valid. Please make sure it is ' 'valid or check your projection!') # noinspection PyCallByClass,PyTypeChecker,PyArgumentList display_warning_message_box(self, error_dialog_title, message) # Unlock the bounding_box_group self.bounding_box_group.setEnabled(True) return # Validate features feature_types = self.get_checked_features() if len(feature_types) < 1: message = self.tr('No feature selected. ' 'Please make sure you have checked one feature.') # noinspection PyCallByClass,PyTypeChecker,PyArgumentList display_warning_message_box(self, error_dialog_title, message) # Unlock the bounding_box_group self.bounding_box_group.setEnabled(True) return try: self.save_state() self.require_directory() for feature_type in feature_types: output_directory = self.output_directory.text() output_prefix = self.filename_prefix.text() overwrite = self.overwrite_flag.isChecked() output_base_file_path = self.get_output_base_path( output_directory, output_prefix, feature_type, overwrite) # noinspection PyTypeChecker download(feature_type, output_base_file_path, extent, self.progress_dialog) try: self.load_shapefile(feature_type, output_base_file_path) except FileMissingError as exception: display_warning_message_box(self, error_dialog_title, exception.message) self.done(QDialog.Accepted) self.rectangle_map_tool.reset() except CanceledImportDialogError: # don't show anything because this exception raised # when user canceling the import process directly pass except Exception as exception: # pylint: disable=broad-except # noinspection PyCallByClass,PyTypeChecker,PyArgumentList display_warning_message_box(self, error_dialog_title, exception.message) self.progress_dialog.cancel() finally: # Unlock the bounding_box_group self.bounding_box_group.setEnabled(True)
def accept(self): """Do osm download and display it in QGIS.""" error_dialog_title = self.tr('InaSAFE OpenStreetMap Downloader Error') # Lock the groupbox self.groupBox.setDisabled(True) # Validate extent valid_flag = self.validate_extent() if not valid_flag: message = self.tr( 'The bounding box is not valid. Please make sure it is ' 'valid or check your projection!') # noinspection PyCallByClass,PyTypeChecker,PyArgumentList display_warning_message_box(self, error_dialog_title, message) # Unlock the groupbox self.groupBox.setEnabled(True) return # Get all the feature types index = self.feature_type.currentIndex() if index == 0: feature_types = ['buildings', 'roads', 'building-points'] elif index == 1: feature_types = ['buildings'] elif index == 2: feature_types = ['building-points'] else: feature_types = ['roads'] try: self.save_state() self.require_directory() for feature_type in feature_types: output_directory = self.output_directory.text() output_prefix = self.filename_prefix.text() overwrite = self.overwrite_checkBox.isChecked() output_base_file_path = self.get_output_base_path( output_directory, output_prefix, feature_type, overwrite) self.download(feature_type, output_base_file_path) try: self.load_shapefile(feature_type, output_base_file_path) except FileMissingError as exception: display_warning_message_box(self, error_dialog_title, exception.message) self.done(QDialog.Accepted) self.rectangle_map_tool.reset() except CanceledImportDialogError: # don't show anything because this exception raised # when user canceling the import process directly pass except Exception as exception: # pylint: disable=broad-except # noinspection PyCallByClass,PyTypeChecker,PyArgumentList display_warning_message_box(self, error_dialog_title, exception.message) self.progress_dialog.cancel() finally: # Unlock the groupbox self.groupBox.setEnabled(True)
def accept(self): """Do PetaBencana download and display it in QGIS. .. versionadded: 3.3 """ self.save_state() try: self.require_directory() except CanceledImportDialogError: return QgsApplication.instance().setOverrideCursor( QtGui.QCursor(QtCore.Qt.WaitCursor) ) source = self.define_url() # save the file as json first name = 'jakarta_flood.json' output_directory = self.output_directory.text() output_prefix = self.filename_prefix.text() overwrite = self.overwrite_flag.isChecked() date_stamp_flag = self.include_date_flag.isChecked() output_base_file_path = self.get_output_base_path( output_directory, output_prefix, date_stamp_flag, name, overwrite) title = self.tr("Can't access API") try: self.download(source, output_base_file_path) # Open downloaded file as QgsMapLayer options = QgsVectorLayer.LayerOptions(False) layer = QgsVectorLayer( output_base_file_path, 'flood', 'ogr', options) except Exception as e: disable_busy_cursor() QMessageBox.critical(self, title, str(e)) return self.time_stamp = time.strftime('%d-%b-%Y %H:%M:%S') # Now save as shp name = 'jakarta_flood.shp' output_base_file_path = self.get_output_base_path( output_directory, output_prefix, date_stamp_flag, name, overwrite) QgsVectorFileWriter.writeAsVectorFormat( layer, output_base_file_path, 'CP1250', QgsCoordinateTransform(), 'ESRI Shapefile') # Get rid of the GeoJSON layer and rather use local shp del layer self.copy_style(output_base_file_path) self.copy_keywords(output_base_file_path) layer = self.add_flooded_field(output_base_file_path) # check if the layer has feature or not if layer.featureCount() <= 0: city = self.city_combo_box.currentText() message = self.tr( 'There are no floods data available on {city} ' 'at this time.').format(city=city) display_warning_message_box( self, self.tr('No data'), message) disable_busy_cursor() else: # add the layer to the map project = QgsProject.instance() project.addMapLayer(layer) disable_busy_cursor() self.done(QDialog.Accepted)