def accept(self, *args, **kwargs): if not self.validate(): return False try: self.cleanMessageBars(True) QApplication.setOverrideCursor(QtCore.Qt.WaitCursor) self.iface.mainWindow().statusBar().showMessage('Processing {}'.format(self.windowTitle())) # Add settings to log LOGGER.info('{st}\nProcessing {}'.format(self.windowTitle(), st='*' * 50)) settingsStr = 'Parameters:---------------------------------------' settingsStr += '\n {:30}\t{}'.format('Vesper Control File:', self.lneInVesperCtrlFile.text()) settingsStr += '\n {:30}\t{}'.format('Coordinate System:', self.vesper_qgscrs.authid(), self.vesper_qgscrs.description()) settingsStr += '\n {:30}\t{}'.format('Run Vesper', self.chkRunVesper.isChecked()) LOGGER.info(settingsStr) if self.chkRunVesper.isChecked(): # if epsg is in the vesp queue, then run vesper to raster if self.vesper_qgscrs is not None: epsg = int(self.vesper_qgscrs.authid().replace('EPSG:', '')) self.vesp_dict = {'control_file': self.lneInVesperCtrlFile.text(), 'epsg': epsg} else: out_PredTif, out_SETif, out_CITxt = vesper_text_to_raster(self.lneInVesperCtrlFile.text(), int(self.vesper_qgscrs.authid().replace( 'EPSG:', ''))) raster_sym = RASTER_SYMBOLOGY['Yield'] removeFileFromQGIS(out_PredTif) rasterLyr = addRasterFileToQGIS(out_PredTif, atTop=False) raster_apply_classified_renderer(rasterLyr, rend_type=raster_sym['type'], num_classes=raster_sym['num_classes'], color_ramp=raster_sym['colour_ramp']) addRasterFileToQGIS(out_SETif, atTop=False) QApplication.restoreOverrideCursor() self.iface.mainWindow().statusBar().clearMessage() return super(PostVesperDialog, self).accept(*args, **kwargs) except Exception as err: QApplication.restoreOverrideCursor() self.cleanMessageBars(True) self.iface.mainWindow().statusBar().clearMessage() self.send_to_messagebar(str(err), level=Qgis.Critical, duration=0, addToLog=True, showLogPanel=True, exc_info=sys.exc_info()) return False # leave dialog open
def processFinishedVesper(self, exitCode, exitStatus): # connected to process.finished slot """When VESPER is complete, import the results to TIFF and QGIS""" currentTask = self.vesper_queue[0] if exitCode == 0 and exitStatus == QProcess.NormalExit: self.processVesper.close() self.processVesper = None if currentTask['epsg'] > 0: try: out_PredTif, out_SETif, out_CITxt = vesper_text_to_raster(currentTask['control_file'], currentTask['epsg']) raster_sym = RASTER_SYMBOLOGY['Yield'] removeFileFromQGIS(out_PredTif) rasterLyr = addRasterFileToQGIS(out_PredTif, atTop=False) raster_apply_classified_renderer(rasterLyr, rend_type=raster_sym['type'], num_classes=raster_sym['num_classes'], color_ramp=raster_sym['colour_ramp']) removeFileFromQGIS(out_SETif) addRasterFileToQGIS(out_SETif, atTop=False) except Exception as err: message = "Could not import from VESPER to raster TIFF possibly due to a " \ "VESPER error.\n{}".format(os.path.basename(currentTask['control_file'])) LOGGER.error(message) message = "Completed VESPER kriging for {}\t Duration H:M:SS - {dur}".format( os.path.basename(currentTask['control_file']), dur=datetime.timedelta(seconds=time.time() - self.vesper_run_time)) self.iface.messageBar().pushMessage(message, level=QgsMessageBar.INFO, duration=15) LOGGER.info(message) else: message = "Error occurred with VESPER kriging for {}".format(currentTask['control_file']) self.iface.messageBar().pushMessage(message, level=QgsMessageBar.CRITICAL, duration=0) LOGGER.error(message) self.vesper_queue = self.vesper_queue[1:] # remove the recently finished one which will always be at position 0 self.lblVesperQueue.setText('{} tasks in VESPER queue'.format(len(self.vesper_queue))) if len(self.vesper_queue) > 0: self.vesper_run_time = time.time() self.processRunVesper() else: self.vesper_queue = [] self.vesper_run_time = '' self.queueStatusBarHide() return
def run_wholeOfBlockAnalysis(self): """Run method for the fit to block grid dialog""" # https://gis.stackexchange.com/a/160146 result = check_R_dependency() if result is not True: self.iface.messageBar().pushMessage("R configuration", result, level=QgsMessageBar.WARNING, duration=15) return proc_alg_mess = ProcessingAlgMessages(self.iface) QgsMessageLog.instance().messageReceived.connect(proc_alg_mess.processingCatcher) # Then get the algorithm you're interested in (for instance, Join Attributes): alg = Processing.getAlgorithm("r:wholeofblockanalysis") if alg is None: self.iface.messageBar().pushMessage("Whole-of-block analysis algorithm could not" " be found", level=QgsMessageBar.CRITICAL) return # Instantiate the commander window and open the algorithm's interface cw = CommanderWindow(self.iface.mainWindow(), self.iface.mapCanvas()) if alg is not None: cw.runAlgorithm(alg) # if proc_alg_mess.alg_name == '' then cancel was clicked if proc_alg_mess.error: self.iface.messageBar().pushMessage("Whole-of-block analysis", proc_alg_mess.error_msg, level=QgsMessageBar.CRITICAL, duration=0) elif proc_alg_mess.alg_name != '': data_column = proc_alg_mess.parameters['Data_Column'] # load rasters into qgis as grouped layers. for key, val in proc_alg_mess.output_files.items(): grplyr = os.path.join('Whole-of-block {}'.format(data_column), val['title']) for ea_file in val['files']: removeFileFromQGIS(ea_file) raster_layer = addRasterFileToQGIS(ea_file, group_layer_name=grplyr, atTop=False) if key in ['p_val']: raster_apply_unique_value_renderer(raster_layer) self.iface.messageBar().pushMessage("Whole-of-block analysis Completed Successfully!", level=QgsMessageBar.INFO, duration=15) del proc_alg_mess
def accept(self, *args, **kwargs): try: if not self.validate(): return False # disable form via a frame, this will still allow interaction with the message bar self.fraMain.setDisabled(True) # clean gui and Qgis messagebars self.cleanMessageBars(True) # Change cursor to Wait cursor QApplication.setOverrideCursor(QtCore.Qt.WaitCursor) self.iface.mainWindow().statusBar().showMessage( 'Processing {}'.format(self.windowTitle())) LOGGER.info('{st}\nProcessing {}'.format(self.windowTitle(), st='*' * 50)) self.send_to_messagebar( "Please wait.. QGIS will be locked... See log panel for progress.", level=Qgis.Warning, duration=0, addToLog=False, core_QGIS=False, showLogPanel=True) registry = QgsProject.instance() rasterSource = [ registry.mapLayer(self.tabList.item(row, 0).text()).source() for row in range(0, self.tabList.rowCount()) ] rasterLyrNames = [ registry.mapLayer(self.tabList.item(row, 0).text()).name() for row in range(0, self.tabList.rowCount()) ] # Add settings to log settingsStr = 'Parameters:---------------------------------------' if len(rasterSource) == 1: settingsStr += '\n {:20}\t{}'.format( 'Rasters: ', rasterLyrNames[0]) else: settingsStr += '\n {:20}\t{}'.format( 'Rasters: ', len(rasterLyrNames)) settingsStr += '\n\t\t' + '\n\t\t'.join(rasterLyrNames) settingsStr += '\n {:20}\t{}'.format('Number of Clusters ', self.spnClusters.value()) settingsStr += '\n {:20}\t{}\n'.format('Output TIFF File:', self.lneSaveFile.text()) LOGGER.info(settingsStr) _ = processing.kmeans_clustering(rasterSource, self.lneSaveFile.text(), self.spnClusters.value()) csv_file = self.lneSaveFile.text().replace('.tif', '_statistics.csv') vect_layer = addVectorFileToQGIS(csv_file, os.path.basename(csv_file), atTop=True) raster_sym = RASTER_SYMBOLOGY['Zones'] raster_layer = addRasterFileToQGIS(self.lneSaveFile.text(), atTop=False) raster_apply_unique_value_renderer( raster_layer, 1, color_ramp=raster_sym['colour_ramp'], invert=raster_sym['invert']) self.cleanMessageBars(True) self.fraMain.setDisabled(False) self.iface.mainWindow().statusBar().clearMessage() self.iface.messageBar().popWidget() QApplication.restoreOverrideCursor() return super(KMeansClusterDialog, self).accept(*args, **kwargs) except Exception as err: self.iface.mainWindow().statusBar().clearMessage() self.cleanMessageBars(True) self.fraMain.setDisabled(False) err_mess = str(err) exc_info = sys.exc_info() if isinstance(err, IOError) and err.filename == self.lneSaveFile.text(): err_mess = 'Output File in Use - IOError {} '.format( err.strerror) exc_info = None self.send_to_messagebar(err_mess, level=Qgis.Critical, duration=0, addToLog=True, showLogPanel=True, exc_info=exc_info) QApplication.restoreOverrideCursor() return False # leave dialog open
def accept(self, *args, **kwargs): try: if not self.validate(): return False # disable form via a frame, this will still allow interaction with # the message bar self.fraMain.setDisabled(True) # clean gui and Qgis messagebars self.cleanMessageBars(True) # Change cursor to Wait cursor QtGui.qApp.setOverrideCursor(QtGui.QCursor(QtCore.Qt.WaitCursor)) self.iface.mainWindow().statusBar().showMessage( 'Processing {}'.format(self.windowTitle())) LOGGER.info('{st}\nProcessing {}'.format(self.windowTitle(), st='*' * 50)) self.send_to_messagebar( "Please wait.. QGIS will be locked... " "See log panel for progress.", level=QgsMessageBar.WARNING, duration=0, addToLog=False, core_QGIS=False, showLogPanel=True) registry = QgsMapLayerRegistry.instance() upper_src = [ registry.mapLayer(self.tabUpper.item(row, 0).text()).source() for row in range(0, self.tabUpper.rowCount()) ] upper_names = [ registry.mapLayer(self.tabUpper.item(row, 0).text()).name() for row in range(0, self.tabUpper.rowCount()) ] lower_src = [ registry.mapLayer(self.tabLower.item(row, 0).text()).source() for row in range(0, self.tabLower.rowCount()) ] lower_names = [ registry.mapLayer(self.tabLower.item(row, 0).text()).name() for row in range(0, self.tabLower.rowCount()) ] # Add settings to log settingsStr = 'Parameters:---------------------------------------' settingsStr += '\n {:20}\t{}'.format( 'Persistor Method: ', self.cboMethod.currentText()) if self.cboMethod.currentText() == 'Target Probability': settingsStr += '\n {:20}\t{}'.format( 'Upper Category: ', 'Count of rasters:{}'.format(len(upper_names))) settingsStr += '\n\t\t ' + '\n\t\t '.join(upper_names) settingsStr += '\n {:20}\t{}'.format( ' Target Probability: ', self.cboUpperProb.currentText()) settingsStr += '\n {:20}\t{}'.format( ' Target Percentage: ', self.cboUpperPerc.currentText()) # ------------------------------------------------------ settingsStr += '\n {:20}\t{}'.format( 'Lower Category: ', 'Count of rasters:{}'.format(len(upper_names))) settingsStr += '\n\t\t ' + '\n\t\t '.join(upper_names) settingsStr += '\n {:20}\t{}'.format( ' Target Probability: ', self.cboLowerProb.currentText()) settingsStr += '\n {:20}\t{}'.format( ' Target Percentage: ', self.cboLowerPerc.currentText()) else: settingsStr += '\n {:20}\t{}'.format( ' Rasters: ', len(upper_names)) settingsStr += '\n\t\t' + '\n\t\t'.join(upper_names) settingsStr += '\n {:20}\t{}'.format( 'Greater Than: ', self.optGreaterThan.isChecked()) settingsStr += '\n {:20}\t{}'.format( 'Target Percentage: ', self.cboAllYearTargetPerc.currentText()) settingsStr += '\n {:20}\t{}\n'.format('Output TIFF File:', self.lneSaveFile.text()) LOGGER.info(settingsStr) stepTime = time.time() if self.cboMethod.currentText() == 'Target Probability': _ = persistor_target_probability( upper_src, int(self.cboUpperPerc.currentText().strip('%')), int(self.cboUpperProb.currentText().strip('%')), lower_src, int(self.cboLowerPerc.currentText().strip('%')), int(self.cboLowerProb.currentText().strip('%')), self.lneSaveFile.text()) raster_sym = rs.RASTER_SYMBOLOGY[ 'Persistor - Target Probability'] else: _ = persistor_all_years( upper_src, self.lneSaveFile.text(), self.optGreaterThan.isChecked(), int(self.cboAllYearTargetPerc.currentText().strip('%'))) raster_sym = rs.RASTER_SYMBOLOGY['Persistor - All Years'] rasterLyr = addRasterFileToQGIS(self.lneSaveFile.text(), atTop=False) rs.raster_apply_unique_value_renderer( rasterLyr, 1, color_ramp=raster_sym['colour_ramp'], invert=raster_sym['invert']) self.cleanMessageBars(True) self.fraMain.setDisabled(False) self.iface.mainWindow().statusBar().clearMessage() self.iface.messageBar().popWidget() QtGui.qApp.restoreOverrideCursor() return super(PersistorDialog, self).accept(*args, **kwargs) except Exception as err: self.iface.mainWindow().statusBar().clearMessage() self.cleanMessageBars(True) self.fraMain.setDisabled(False) err_mess = str(err) exc_info = sys.exc_info() if isinstance(err, IOError) and err.filename == self.lneSaveFile.text(): err_mess = 'Output CSV File in Use - IOError {} '.format( err.strerror) exc_info = None self.send_to_messagebar(err_mess, level=QgsMessageBar.CRITICAL, duration=0, addToLog=True, showLogPanel=True, exc_info=exc_info) QtGui.qApp.restoreOverrideCursor() return False # leave dialog open
def accept(self, *args, **kwargs): try: if not self.validate(): return False # disable form via a frame, this will still allow interaction with the message bar self.fraMain.setDisabled(True) # clean gui and Qgis messagebars self.cleanMessageBars(True) # Change cursor to Wait cursor QtGui.qApp.setOverrideCursor(QtGui.QCursor(QtCore.Qt.WaitCursor)) self.iface.mainWindow().statusBar().showMessage( 'Processing {}'.format(self.windowTitle())) LOGGER.info('{st}\nProcessing {}'.format(self.windowTitle(), st='*' * 50)) self.send_to_messagebar( "Please wait.. QGIS will be locked... See log panel for progress.", level=QgsMessageBar.WARNING, duration=0, addToLog=False, core_QGIS=False, showLogPanel=True) # Add settings to log settingsStr = 'Parameters:---------------------------------------' settingsStr += '\n {:20}\t{}'.format( 'Image layer:', self.mcboRasterLayer.currentLayer().name()) settingsStr += '\n {:20}\t{}'.format('Image Band:', self.cboBand.currentText()) settingsStr += '\n {:20}\t{}'.format('Image nodata value:', self.spnNoDataVal.value()) if self.chkUsePoly.isChecked(): if self.chkUseSelected.isChecked(): settingsStr += '\n {:20}\t{} with {} selected features'.format( 'Layer:', self.mcboPolygonLayer.currentLayer().name(), len(self.mcboPolygonLayer.currentLayer(). selectedFeatures())) else: settingsStr += '\n {:20}\t{}'.format( 'Boundary layer:', self.mcboPolygonLayer.currentLayer().name()) if self.mFieldComboBox.currentField(): settingsStr += '\n {:20}\t{}'.format( 'Block ID field:', self.mFieldComboBox.currentField()) else: settingsStr += '\n {:20}\t{}'.format('Boundary layer:', '') settingsStr += '\n {:20}\t{}'.format('Block ID field:', '') settingsStr += '\n {:20}\t{}'.format('Resample pixel size: ', self.dsbPixelSize.value()) settingsStr += '\n {:30}\t{}'.format( 'Output Coordinate System:', self.lblOutCRS.text()) settingsStr += '\n {:30}\t{}\n'.format( 'Output Folder:', self.lneOutputFolder.text()) LOGGER.info(settingsStr) lyrRaster = self.mcboRasterLayer.currentLayer() if self.chkUsePoly.isChecked(): lyrBoundary = self.mcboPolygonLayer.currentLayer() if self.chkUseSelected.isChecked(): savePlyName = lyrBoundary.name() + '_poly.shp' filePoly = os.path.join(TEMPDIR, savePlyName) if os.path.exists(filePoly): removeFileFromQGIS(filePoly) QgsVectorFileWriter.writeAsVectorFormat(lyrBoundary, filePoly, "utf-8", lyrBoundary.crs(), "ESRI Shapefile", onlySelected=True) if self.DISP_TEMP_LAYERS: addVectorFileToQGIS(filePoly, layer_name=os.path.splitext( os.path.basename(filePoly))[0], group_layer_name='DEBUG', atTop=True) else: filePoly = lyrBoundary.source() band_num = [int(self.cboBand.currentText().replace('Band ', ''))] files = resample_bands_to_block( lyrRaster.source(), self.dsbPixelSize.value(), self.lneOutputFolder.text(), band_nums=band_num, image_epsg=int(lyrRaster.crs().authid().replace('EPSG:', '')), image_nodata=self.spnNoDataVal.value(), polygon_shapefile=filePoly if self.chkUsePoly.isChecked() else None, groupby=self.mFieldComboBox.currentField() if self.mFieldComboBox.currentField() else None, out_epsg=int(self.outQgsCRS.authid().replace('EPSG:', ''))) if self.chkAddToDisplay.isChecked(): for ea_file in files: removeFileFromQGIS(ea_file) addRasterFileToQGIS(ea_file, group_layer_name=os.path.basename( os.path.dirname(ea_file)), atTop=False) self.cleanMessageBars(True) self.fraMain.setDisabled(False) self.iface.mainWindow().statusBar().clearMessage() self.iface.messageBar().popWidget() QtGui.qApp.restoreOverrideCursor() return super(ResampleImageToBlockDialog, self).accept(*args, **kwargs) except Exception as err: QtGui.qApp.restoreOverrideCursor() self.iface.mainWindow().statusBar().clearMessage() self.cleanMessageBars(True) self.fraMain.setDisabled(False) self.send_to_messagebar(str(err), level=QgsMessageBar.CRITICAL, duration=0, addToLog=True, core_QGIS=False, showLogPanel=True, exc_info=sys.exc_info()) return False # leave dialog open
def accept(self, *args, **kwargs): if not self.validate(): return False try: QApplication.setOverrideCursor(QtCore.Qt.WaitCursor) self.iface.mainWindow().statusBar().showMessage('Processing {}'.format(self.windowTitle())) LOGGER.info('{st}\nProcessing {}'.format(self.windowTitle(), st='*' * 50)) # Add settings to log. settingsStr = 'Parameters:---------------------------------------' if self.chkUseSelected.isChecked(): settingsStr += '\n {:30}\t{} with {} selected features'.format('Layer:', self.mcboTargetLayer.currentLayer().name(), self.mcboTargetLayer.currentLayer().selectedFeatureCount()) else: settingsStr += '\n {:30}\t{}'.format('Layer:', self.mcboTargetLayer.currentLayer().name()) settingsStr += '\n {:30}\t{}'.format('Output Raster File:', self.lneSaveRasterFile.text()) settingsStr += '\n {:30}\t{}'.format('Pixel Size:', self.dsbPixelSize.value()) settingsStr += '\n {:30}\t{}'.format('No Data Value:', self.spnNoDataVal.value()) settingsStr += '\n {:30}\t{}'.format('Snap To Extent:', self.chkSnapExtent.isChecked()) settingsStr += '\n Derived Parameters:---------------------------------------' settingsStr += '\n {:30}\t{}'.format('Output Vesper File:', os.path.splitext(self.lneSaveRasterFile.text())[0] + '_v.txt') settingsStr += '\n {:30}\t{} - {}\n'.format('Output Projected Coordinate System:', self.mCRSoutput.crs().authid(), self.mCRSoutput.crs().description()) LOGGER.info(settingsStr) lyrTarget = self.mcboTargetLayer.currentLayer() rasterFile = self.lneSaveRasterFile.text() removeFileFromQGIS(rasterFile) if self.chkUseSelected.isChecked(): polyFile = os.path.join(TEMPDIR, '{}_selection.shp'.format(lyrTarget.name())) removeFileFromQGIS(polyFile) writer = QgsVectorFileWriter.writeAsVectorFormat(lyrTarget, polyFile, "utf-8", lyrTarget.crs(), driverName="ESRI Shapefile", onlySelected=True) LOGGER.info('{:<30} {:<15} {}'.format('Save layer/selection to file', polyFile, '')) if self.DISP_TEMP_LAYERS: addVectorFileToQGIS(polyFile, group_layer_name='DEBUG', atTop=True) else: polyFile = get_layer_source(lyrTarget) processing.block_grid(in_shapefilename=polyFile, pixel_size=self.dsbPixelSize.value(), out_rasterfilename=rasterFile, out_vesperfilename=os.path.splitext(rasterFile)[0] + '_v.txt', nodata_val=self.spnNoDataVal.value(), snap=self.chkSnapExtent.isChecked(), out_epsg=int(self.mCRSoutput.crs().authid().replace("EPSG:",'')), overwrite=True) # The saveAS dialog takes care of the overwrite issue. if self.chkDisplayResults.isChecked(): raster_layer = addRasterFileToQGIS(rasterFile, atTop=False) raster_sym = RASTER_SYMBOLOGY['Block Grid'] raster_apply_unique_value_renderer(raster_layer,1, color_ramp=raster_sym['colour_ramp'], invert=raster_sym['invert']) #QApplication.restoreOverrideCursor() QApplication.restoreOverrideCursor() self.iface.mainWindow().statusBar().clearMessage() return super(BlockGridDialog, self).accept(*args, **kwargs) except Exception as err: QApplication.restoreOverrideCursor() self.iface.mainWindow().statusBar().clearMessage() self.cleanMessageBars(True) self.send_to_messagebar(str(err), level=Qgis.Critical, duration=0, addToLog=True, showLogPanel=True, exc_info=sys.exc_info()) return False # leave dialog open
def accept(self, *args, **kwargs): """Run the processing""" try: if not self.validate(): return False # disable form via a frame, this will still allow interaction with the message bar self.fraMain.setDisabled(True) # clean gui and Qgis messagebars self.cleanMessageBars(True) # Change cursor to Wait cursor QApplication.setOverrideCursor(QtCore.Qt.WaitCursor) self.iface.mainWindow().statusBar().showMessage('Processing {}'.format(self.windowTitle())) LOGGER.info('{st}\nProcessing {}'.format(self.windowTitle(), st='*' * 50)) self.send_to_messagebar("Please wait.. QGIS will be locked... See log panel for progress.", level=Qgis.Warning, duration=0, addToLog=False, core_QGIS=False, showLogPanel=True) selectedIndices = [x.text() for x in self.chkgrpIndices.buttons() if x.isChecked()] # Add settings to log settingsStr = 'Parameters:---------------------------------------' settingsStr += '\n {:20}\t{}'.format('Image layer:', self.mcboRasterLayer.currentLayer().name()) settingsStr += '\n {:20}\t{}'.format('Image nodata value:', self.lblNoDataVal.text()) if self.mcboPolygonLayer.currentLayer() is not None: if self.chkUseSelected.isChecked(): settingsStr += '\n {:20}\t{} with {} selected features'.format('Layer:', self.mcboPolygonLayer.currentLayer().name(), self.mcboPolygonLayer.currentLayer().selectedFeatureCount()) else: settingsStr += '\n {:20}\t{}'.format('Boundary layer:', self.mcboPolygonLayer.currentLayer().name()) if self.mFieldComboBox.currentField(): settingsStr += '\n {:20}\t{}'.format('Block ID field:', self.mFieldComboBox.currentField()) settingsStr += '\n {:20}\t{}'.format('Resample pixel size: ', self.dsbPixelSize.value()) for k, v in self.band_mapping.items(): if v > 0: settingsStr += '\n {:20}\t{}'.format('{} Band:'.format(k.title()), v) settingsStr += '\n {:20}\t{}'.format('Calculate Indices: ', ', '.join(selectedIndices)) settingsStr += '\n {:30}\t{} - {}'.format('Output Coordinate System:', self.mCRSoutput.crs().authid(), self.mCRSoutput.crs().description()) settingsStr += '\n {:30}\t{}\n'.format('Output Folder:', self.lneOutputFolder.text()) LOGGER.info(settingsStr) lyrRaster = self.mcboRasterLayer.currentLayer() filePoly=None if self.mcboPolygonLayer.currentLayer() is not None: lyrBoundary = self.mcboPolygonLayer.currentLayer() if self.chkUseSelected.isChecked(): savePlyName = lyrBoundary.name() + '_poly.shp' filePoly = os.path.join(TEMPDIR, savePlyName) if os.path.exists(filePoly): removeFileFromQGIS(filePoly) QgsVectorFileWriter.writeAsVectorFormat(lyrBoundary, filePoly, "utf-8", lyrBoundary.crs(), driverName="ESRI Shapefile", onlySelected=True) if self.DISP_TEMP_LAYERS: addVectorFileToQGIS(filePoly, layer_name=os.path.splitext(os.path.basename(filePoly))[0] , group_layer_name='DEBUG', atTop=True) else: filePoly = get_layer_source(lyrBoundary) # convert string to float or int without knowing which x = self.lneNoDataVal.text() nodata_val = int(float(x)) if int(float(x)) == float(x) else float(x) files = calc_indices_for_block(get_layer_source(lyrRaster), self.dsbPixelSize.value(), self.band_mapping, self.lneOutputFolder.text(), indices=selectedIndices, image_epsg=int(lyrRaster.crs().authid().replace('EPSG:', '')), image_nodata=nodata_val, polygon_shapefile=filePoly, groupby=self.mFieldComboBox.currentField() if self.mFieldComboBox.currentField() else None, out_epsg=int(self.mCRSoutput.crs().authid().replace('EPSG:', ''))) if self.chkAddToDisplay.isChecked(): for ea_file in files: raster_sym = RASTER_SYMBOLOGY['Image Indices (ie PCD, NDVI)'] group_name = os.path.basename(os.path.dirname(ea_file)) if self.mFieldComboBox.currentField(): group_name = os.path.basename(ea_file).split('_')[0] + ' - ' + os.path.basename(os.path.dirname(ea_file)) raster_lyr = addRasterFileToQGIS(ea_file,atTop=False, group_layer_name=group_name) raster_apply_classified_renderer(raster_lyr, rend_type=raster_sym['type'], num_classes=raster_sym['num_classes'], color_ramp=raster_sym['colour_ramp']) self.cleanMessageBars(True) self.fraMain.setDisabled(False) self.iface.mainWindow().statusBar().clearMessage() self.iface.messageBar().popWidget() QApplication.restoreOverrideCursor() return super(CalculateImageIndicesDialog, self).accept(*args, **kwargs) except Exception as err: QApplication.restoreOverrideCursor() self.iface.mainWindow().statusBar().clearMessage() self.cleanMessageBars(True) self.fraMain.setDisabled(False) self.send_to_messagebar(str(err), level=Qgis.Critical, duration=0, addToLog=True, core_QGIS=False, showLogPanel=True, exc_info=sys.exc_info()) return False # leave dialog open
def accept(self, *args, **kwargs): if not self.validate(): return False try: QApplication.setOverrideCursor(QtCore.Qt.WaitCursor) LOGGER.info('{st}\nProcessing {} Raster'.format( self.cboMethod.currentText(), st='*' * 50)) self.iface.mainWindow().statusBar().showMessage( 'Processing {} Raster'.format(self.cboMethod.currentText())) # Add settings to log settingsStr = 'Parameters:---------------------------------------' settingsStr += '\n {:30}\t{}'.format( 'Layer:', self.mcboTargetLayer.currentLayer().name()) settingsStr += '\n {:30}\t{}'.format('For Band: ', self.cboBand.currentText()) settingsStr += '\n {:30}\t{}'.format( 'Method: ', self.cboMethod.currentText()) if self.cboMethod.currentText() == 'Rescale': settingsStr += '\n {:30}\t{} - {}'.format( 'Between:', self.dsbRescaleLower.value(), self.dsbRescaleUpper.value()) settingsStr += '\n {:30}\t{}'.format( 'Output Raster File:', self.lneSaveRasterFile.text()) LOGGER.info(settingsStr) lyrTarget = self.mcboTargetLayer.currentLayer() rasterOut = self.lneSaveRasterFile.text() removeFileFromQGIS(rasterOut) rasterIn = get_layer_source(lyrTarget) # need this to maintain correct wkt otherwise gda/mga defaults to utm zonal in_crswkt = lyrTarget.crs().toWkt() band_num = int(self.cboBand.currentText().replace('Band ', '')) with rasterio.open(os.path.normpath(rasterIn)) as src: if self.cboMethod.currentText() == 'Rescale': rast_result = rescale(src, self.dsbRescaleLower.value(), self.dsbRescaleUpper.value(), band_num=band_num, ignore_nodata=True) else: rast_result = normalise(src, band_num=band_num, ignore_nodata=True) meta = src.meta.copy() meta['crs'] = str(in_crswkt) meta['count'] = 1 meta['dtype'] = rasterio.float32 with rasterio.open(os.path.normpath(rasterOut), 'w', **meta) as dst: dst.write_band(1, rast_result) rasterLyr = addRasterFileToQGIS(rasterOut, atTop=False) QApplication.restoreOverrideCursor() self.iface.mainWindow().statusBar().clearMessage() return super(RescaleNormaliseDialog, self).accept(*args, **kwargs) except Exception as err: QApplication.restoreOverrideCursor() self.cleanMessageBars(True) self.iface.mainWindow().statusBar().clearMessage() self.send_to_messagebar(str(err), level=Qgis.Critical, duration=0, addToLog=True, exc_info=sys.exc_info()) return False # leave dialog open