Exemple #1
0
    def accept(self, *args, **kwargs):
        if not self.validate():
            return False
        try:
            QtGui.qApp.setOverrideCursor(QtGui.QCursor(QtCore.Qt.WaitCursor))

            write_setting(PLUGIN_NAME + "/" + self.toolKey + "/LastSize", self.dsbSize.value())

            LOGGER.info('{st}\nProcessing {}'.format(self.windowTitle(), st='*' * 50))
            self.iface.mainWindow().statusBar().showMessage('Processing {}'.format(self.windowTitle()))

            # Add settings to log
            settingsStr = 'Parameters:---------------------------------------'
            settingsStr += '\n    {:30}\t{}'.format('Sample Size:', self.dsbSize.value())
            settingsStr += '\n    {:30}\t{}'.format('Layer:', self.mcboTargetLayer.currentLayer().name())
            settingsStr += '\n    {:30}\t{}'.format('Output Shapefile:', self.lneSaveFile.text())

            LOGGER.info(settingsStr)

            lyrTarget = self.mcboTargetLayer.currentLayer()
            removeFileFromQGIS(self.lneSaveFile.text())

            raster_file = lyrTarget.source()
            rasterCRS = pyprecag_crs.getCRSfromRasterFile(raster_file)

            if rasterCRS.epsg is None:
                rasterCRS.getFromEPSG(lyrTarget.crs().authid())

            with rasterio.open(os.path.normpath(raster_file)) as src:
                processing.random_pixel_selection(src, rasterCRS, int(self.dsbSize.value()), self.lneSaveFile.text())

            lyrPts = addVectorFileToQGIS(self.lneSaveFile.text(), atTop=True,
                                         layer_name=os.path.splitext(os.path.basename(self.lneSaveFile.text()))[0])

            QtGui.qApp.restoreOverrideCursor()
            self.iface.mainWindow().statusBar().clearMessage()
            return super(RandomPixelSelectionDialog, self).accept(*args, **kwargs)

        except Exception as err:
            QtGui.qApp.restoreOverrideCursor()
            self.iface.mainWindow().statusBar().clearMessage()
            self.cleanMessageBars(True)
            self.send_to_messagebar(str(err), level=QgsMessageBar.CRITICAL, duration=0, addToLog=True,
                                    exc_info=sys.exc_info())
            return False  # leave dialog open
Exemple #2
0
    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()
            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())
            ]
            selectedStats = [
                x.text() for x in self.chkgrpStatistics.buttons()
                if x.isChecked()
            ]
            statsFunctions = [
                self.statsMapping[x.lower()] for x in selectedStats
            ]

            # Add settings to log
            settingsStr = 'Parameters:---------------------------------------'
            if self.chkUseSelected.isChecked():
                settingsStr += '\n    {:20}\t{} with {} selected features'.format(
                    'Layer:',
                    self.mcboPointsLayer.currentLayer().name(),
                    len(self.mcboPointsLayer.currentLayer().selectedFeatures())
                )
            else:
                settingsStr += '\n    {:20}\t{}'.format(
                    'Layer:',
                    self.mcboPointsLayer.currentLayer().name())

            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(
                'Use Current Pixel Value: ', self.chkCurrentVal.isChecked())
            settingsStr += '\n    {:20}\t{}'.format(
                'Neighbourhood Size: ',
                self.btgrpSize.checkedButton().text().replace('\n', ''))
            settingsStr += '\n    {:20}\t{}'.format('Statistics: ',
                                                    ', '.join(selectedStats))
            settingsStr += '\n    {:20}\t{}\n'.format(
                'Output CSV File:', self.lneSaveCSVFile.text())

            LOGGER.info(settingsStr)

            layerPts = self.mcboPointsLayer.currentLayer()
            stepTime = time.time()
            if layerPts.providerType() == 'delimitedtext' or os.path.splitext(layerPts.source())[-1] == '.vrt' or \
                    self.chkUseSelected.isChecked():

                filePoints = os.path.join(
                    TEMPDIR, "{}_GEpoints.shp".format(layerPts.name()))

                if self.chkUseSelected.isChecked():
                    filePoints = os.path.join(
                        TEMPDIR,
                        "{}_selected_GEpoints.shp".format(layerPts.name()))

                if os.path.exists(filePoints):
                    removeFileFromQGIS(filePoints)

                ptsMemLayer = copyLayerToMemory(
                    layerPts,
                    layerPts.name() + "_memory",
                    bAddUFI=True,
                    bOnlySelectedFeat=self.chkUseSelected.isChecked())

                _writer = QgsVectorFileWriter.writeAsVectorFormat(
                    ptsMemLayer, filePoints, "utf-8", layerPts.crs(),
                    "ESRI Shapefile")
                LOGGER.info('{:<30} {:<15} {}'.format(
                    'Save layer/selection to file',
                    datetime.timedelta(seconds=time.time() - stepTime),
                    filePoints))
                stepTime = time.time()

                # reset field to match truncated field in the saved shapefile.
                del ptsMemLayer, _writer

                if self.DISP_TEMP_LAYERS:
                    addVectorFileToQGIS(filePoints,
                                        group_layer_name='DEBUG',
                                        atTop=True)

            else:
                filePoints = layerPts.source()

            ptsDesc = describe.VectorDescribe(filePoints)
            gdfPoints = ptsDesc.open_geo_dataframe()

            # assign a coordinate system if required based on the layer crs.
            if ptsDesc.crs.srs is None:
                ptsDesc.crs.getFromEPSG(layerPts.crs().authid())
                gdfPoints.crs = ptsDesc.crs.epsg

            sizeList = []
            if self.chkCurrentVal.isChecked():
                sizeList = [1]
            sizeList.append(int(self.btgrpSize.checkedButton().text()[0]))

            _ = processing.extract_pixel_statistics_for_points(
                gdfPoints,
                ptsDesc.crs,
                rasterSource,
                function_list=statsFunctions,
                size_list=sizeList,
                output_csvfile=self.lneSaveCSVFile.text())

            self.cleanMessageBars(True)
            self.fraMain.setDisabled(False)

            self.iface.mainWindow().statusBar().clearMessage()
            self.iface.messageBar().popWidget()
            QtGui.qApp.restoreOverrideCursor()
            return super(GridExtractDialog, 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.lneSaveCSVFile.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):
        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)

            # Add settings to log
            settingsStr = 'Parameters:---------------------------------------'

            if self.chkUseSelected.isChecked():
                settingsStr += '\n    {:20}\t{} with {} selected features'.format(
                    'Strip points layer:',
                    self.mcboPointsLayer.currentLayer().name(),
                    self.mcboPointsLayer.currentLayer().selectedFeatureCount())
            else:
                settingsStr += '\n    {:20}\t{}'.format(
                    'Strip points layer:',
                    self.mcboPointsLayer.currentLayer().name())

            settingsStr += '\n    {:20}\t{}'.format(
                'Strip values raster:',
                self.mcboRasterLayer.currentLayer().name())

            control_file, zone_file = ['', '']
            if self.mcboCtrlRasterLayer.currentLayer() is not None:
                settingsStr += '\n    {:20}\t{}'.format(
                    'Control values raster:',
                    self.mcboCtrlRasterLayer.currentLayer().name())
                control_file = get_layer_source(
                    self.mcboCtrlRasterLayer.currentLayer())

            if self.mcboZoneRasterLyr.currentLayer() is not None:
                settingsStr += '\n    {:20}\t{}'.format(
                    'Control values raster:',
                    self.mcboZoneRasterLyr.currentLayer().name())
                zone_file = get_layer_source(
                    self.mcboZoneRasterLyr.currentLayer())

            settingsStr += '\n    {:20}\t{}'.format(
                'Moving window size: ', self.dsbMovingWinSize.value())
            settingsStr += '\n    {:30}\t{}\n'.format(
                'Output folder:', self.lneOutputFolder.text())

            LOGGER.info(settingsStr)

            lyrPoints = self.mcboPointsLayer.currentLayer()

            if self.chkUseSelected.isChecked() or lyrPoints.providerType(
            ) == 'delimitedtext':
                savePtsName = lyrPoints.name() + '_strippts.shp'
                fileStripPts = os.path.join(TEMPDIR, savePtsName)

                if os.path.exists(fileStripPts):
                    removeFileFromQGIS(fileStripPts)

                QgsVectorFileWriter.writeAsVectorFormat(
                    lyrPoints,
                    fileStripPts,
                    "utf-8",
                    lyrPoints.crs(),
                    driverName="ESRI Shapefile",
                    onlySelected=self.chkUseSelected.isChecked())

                if self.DISP_TEMP_LAYERS:
                    addVectorFileToQGIS(fileStripPts,
                                        layer_name=os.path.splitext(
                                            os.path.basename(fileStripPts))[0],
                                        group_layer_name='DEBUG',
                                        atTop=True)
            else:
                fileStripPts = get_layer_source(lyrPoints)

            points_desc = describe.VectorDescribe(fileStripPts)
            gdf_pts = points_desc.open_geo_dataframe()

            df_table = ttest_analysis(gdf_pts,
                                      points_desc.crs,
                                      get_layer_source(
                                          self.mcboRasterLayer.currentLayer()),
                                      self.lneOutputFolder.text(),
                                      zone_file,
                                      control_file,
                                      size=self.dsbMovingWinSize.value())

            self.cleanMessageBars(True)
            self.fraMain.setDisabled(False)

            self.iface.mainWindow().statusBar().clearMessage()
            self.iface.messageBar().popWidget()

            QApplication.restoreOverrideCursor()
            return super(tTestAnalysisDialog, 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)

            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):
        if not self.validate():
            return False

        try:
            # disable form via a frame, this will still allow interaction with the message bar
            self.stackedWidget.setDisabled(True)

            # clean gui and Qgis messagebars
            self.cleanMessageBars(True)
            # self.iface.messageBar().clearWidgets()

            # Change cursor to Wait cursor
            QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)

            self.iface.mainWindow().statusBar().showMessage('Processing {}'.format(self.windowTitle()))
            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)
            gp_layer_name = ''

            LOGGER.info('{st}\nProcessing {}'.format(self.windowTitle(), st='*' * 50))

            # Add settings to log
            settingsStr = 'Parameters:---------------------------------------'
            if self.optFile.isChecked():
                settingsStr += '\n    {:30}\t{}'.format('File:', self.lneInCSVFile.text())
                settingsStr += '\n    {:30}\t{}, {}'.format('Geometry Fields:', self.cboXField.currentText(),
                                                            self.cboYField.currentText())
                settingsStr += '\n    {:30}\t{} - {}'.format('CSV Coordinate System:', self.qgsCRScsv.crs().authid(),
                                                              self.qgsCRScsv.crs().description())
            else:
                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())

            crs_units = QgsUnitTypes.toString(self.mCRSoutput.crs().mapUnits())
            settingsStr += '\n    {:30}\t{} {}'.format('Thinning Distance:', self.dsbThinDist.value(),crs_units)
            settingsStr += '\n    {:30}\t{} {}'.format("Aggregate Distance:", self.dsbAggregateDist.value(),crs_units)
            settingsStr += '\n    {:30}\t{} {}'.format("Buffer Distance:", self.dsbBufferDist.value(),crs_units)
            settingsStr += '\n    {:30}\t{} {}'.format("Shrink Distance:", self.dsbShrinkDist.value(),crs_units)

            settingsStr += '\n    {:30}\t{}'.format('Output Polygon Shapefile:', self.lneSavePolyFile.text())

            if self.lneSavePointsFile.text() == '':
                settingsStr += '\n    {:30}\t{}'.format('Saved Points Shapefile:', self.lneSavePointsFile.text())

            settingsStr += '\n    {:30}\t{} - {}\n\n'.format('Output Projected Coordinate System:',
                                                              self.mCRSoutput.crs().authid(),
                                                              self.mCRSoutput.crs().description())

            LOGGER.info(settingsStr)
            stepTime = time.time()

            if self.optFile.isChecked():
                in_epsg = int(self.qgsCRScsv.crs().authid().replace('EPSG:',''))
                in_crs = self.qgsCRScsv.crs()
            else:
                in_epsg =self.mcboTargetLayer.currentLayer().crs().authid().replace('EPSG:','')
                in_crs = self.mcboTargetLayer.currentLayer().crs()

            out_epsg = int(self.mCRSoutput.crs().authid().replace('EPSG:',''))

            filePoly = None

            gdfPoints = None
            filePoints = None

            if self.optFile.isChecked():
                if self.DEBUG:
                    filePoints = os.path.join(TEMPDIR, os.path.splitext(os.path.basename(self.lneSavePolyFile.text()))[0] + '_table2pts.shp')

                if os.path.splitext(self.lneInCSVFile.text())[-1] == '.csv':
                    gdfPoints, gdfPtsCrs = convert.convert_csv_to_points(self.lneInCSVFile.text() , out_shapefilename=filePoints,
                                                                         coord_columns=[self.cboXField.currentText(),
                                                                                        self.cboYField.currentText()],
                                                                         coord_columns_epsg=in_epsg)

                elif os.path.splitext(self.lneInCSVFile.text())[-1] in ['.xls', '.xlsx', '.ods']:
                    xls_file = pd.ExcelFile(self.lneInCSVFile.text())
                    pdfxls = xls_file.parse(self.sheet(), skiprows=self.linesToIgnore() - 1)
                    del xls_file

                    gdfPoints, gdfPtsCrs = convert.add_point_geometry_to_dataframe(pdfxls,
                                                                                   coord_columns=[
                                                                                       self.cboXField.currentText(),
                                                                                       self.cboYField.currentText()],
                                                                                   coord_columns_epsg=in_epsg)
                    del pdfxls

                LOGGER.info('{:<30} {d:<15} {}'.format('Add Geometry to Table','',
                                                          d=str(timedelta(seconds=time.time() - stepTime))))
                stepTime = time.time()
                
                if filePoints is not None:
                    describe.save_geopandas_tofile(gdfPoints, filePoints) #, file_encoding=self.file_encoding)

                if self.DISP_TEMP_LAYERS and filePoints is not None:
                    addVectorFileToQGIS(filePoints, layer_name=os.path.splitext(os.path.basename(filePoints))[0],
                                        group_layer_name='DEBUG', atTop=True)

            else:
                layerPts = self.mcboTargetLayer.currentLayer()

                if layerPts.providerType() == 'delimitedtext' or \
                        os.path.splitext(get_layer_source(layerPts))[-1] == '.vrt' or \
                        self.chkUseSelected.isChecked() or self.optFile.isChecked():

                    filePoints = os.path.join(TEMPDIR, "{}_points.shp".format(layerPts.name()))

                    if self.chkUseSelected.isChecked():
                        filePoints = os.path.join(TEMPDIR, "{}_selected_points.shp".format(layerPts.name()))

                    if os.path.exists(filePoints):
                        removeFileFromQGIS(filePoints)

                    ptsLayer = copyLayerToMemory(layerPts, layerPts.name() + "_memory", bAddUFI=True,
                                                 bOnlySelectedFeat=self.chkUseSelected.isChecked())

                    _writer = QgsVectorFileWriter.writeAsVectorFormat(ptsLayer, filePoints, "utf-8",
                                                                      self.mCRSoutput.crs(), driverName="ESRI Shapefile")

                    LOGGER.info('{:<30} {d:<15} {}'.format('Save layer/selection to file',filePoints,
                                                          d=str(timedelta(seconds=time.time() - stepTime) )))
                    stepTime = time.time()

                    del ptsLayer

                    if self.DISP_TEMP_LAYERS:
                        addVectorFileToQGIS(filePoints, layer_name=os.path.splitext(os.path.basename(filePoints))[0],
                                            group_layer_name='DEBUG', atTop=True)

                else:
                    filePoints = get_layer_source(layerPts)

            if gdfPoints is None:
                ptsDesc = describe.VectorDescribe(filePoints)
                gdfPtsCrs = ptsDesc.crs
                gdfPoints = ptsDesc.open_geo_dataframe()

            if in_crs.authid() != self.mCRSoutput.crs().authid():

                gdfPoints = gdfPoints.to_crs(epsg=out_epsg)
                gdfPtsCrs = pyprecag_crs.crs()
                gdfPtsCrs.getFromEPSG(out_epsg)

                LOGGER.info('{:<30} {d:<15} {} to {}'.format('Reproject points', in_crs.authid(),
                                                             self.mCRSoutput.crs().authid(),
                                                             d=str(timedelta(seconds=time.time() - stepTime))))

                if self.DEBUG:
                    filePoints = os.path.join(TEMPDIR, os.path.basename(self.lneSavePolyFile.text().replace('.csv', '_ptsprj.shp')))

                    removeFileFromQGIS(filePoints)
                    describe.save_geopandas_tofile(gdfPoints, filePoints)
                    if self.DISP_TEMP_LAYERS:
                        if self.DEBUG:
                            addVectorFileToQGIS(filePoints,
                                                layer_name=os.path.splitext(os.path.basename(filePoints))[0],
                                                group_layer_name='DEBUG', atTop=True)
                        else:
                            addVectorFileToQGIS(filePoints,
                                                layer_name=os.path.splitext(os.path.basename(filePoints))[0],
                                                atTop=True)
            stepTime = time.time()
            result = processing.create_polygon_from_point_trail(gdfPoints, gdfPtsCrs,
                                                                out_filename=self.lneSavePolyFile.text(),
                                                                thin_dist_m=self.dsbThinDist.value(),
                                                                aggregate_dist_m=self.dsbAggregateDist.value(),
                                                                buffer_dist_m=self.dsbBufferDist.value(),
                                                                shrink_dist_m=self.dsbShrinkDist.value())

            addVectorFileToQGIS(self.lneSavePolyFile.text(), atTop=True)

            self.cleanMessageBars(True)
            self.stackedWidget.setDisabled(False)
            QApplication.restoreOverrideCursor()
            self.iface.messageBar().popWidget()
            self.iface.mainWindow().statusBar().clearMessage()

            if result is not None:
                self.fraMain.setDisabled(False)
                self.send_to_messagebar(result, level=Qgis.Warning, duration=0, addToLog=False)
                return False  # leave dialog open

            return super(PointTrailToPolygonDialog, self).accept(*args, **kwargs)

        except Exception as err:
            QApplication.restoreOverrideCursor()
            self.iface.mainWindow().statusBar().clearMessage()
            self.cleanMessageBars(True)
            self.stackedWidget.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
Exemple #8
0
    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)

            # Add settings to log
            settingsStr = 'Parameters:---------------------------------------'
            settingsStr += '\n    {:20}\t{}'.format(
                'Line layer:',
                self.mcboLineLayer.currentLayer().name())
            settingsStr += '\n    {:20}\t{}'.format(
                'Distance between points (m):', self.dsbDistBtwnPoints.value())
            settingsStr += '\n    {:20}\t{}'.format(
                'Line offset distance (m):', self.dsbLineOffsetDist.value())

            if self.chkUseSelected.isChecked():
                settingsStr += '\n    {:20}\t{} with {} selected features'.format(
                    'Layer:',
                    self.mcboLineLayer.currentLayer().name(),
                    self.mcboLineLayer.currentLayer().selectedFeatureCount())

            settingsStr += '\n    {:30}\t{} - {}'.format(
                'Output coordinate system:',
                self.mCRSoutput.crs().authid(),
                self.mCRSoutput.crs().description())

            settingsStr += '\n    {:30}\t{}'.format(
                'Output points :', self.lneSavePointsFile.text())

            if self.lneSaveLinesFile.text() == '':
                settingsStr += '\n    {:30}\t{}\n'.format(
                    'Output lines:', self.lneSaveLinesFile.text())

            LOGGER.info(settingsStr)

            lyr_line = self.mcboLineLayer.currentLayer()

            if self.chkUseSelected.isChecked():
                line_shapefile = os.path.join(TEMPDIR,
                                              lyr_line.name() + '_lines.shp')

                if os.path.exists(line_shapefile):
                    removeFileFromQGIS(line_shapefile)

                QgsVectorFileWriter.writeAsVectorFormat(
                    lyr_line,
                    line_shapefile,
                    "utf-8",
                    self.mCRSoutput.crs(),
                    driverName="ESRI Shapefile",
                    onlySelected=True)

                if self.DISP_TEMP_LAYERS:
                    addVectorFileToQGIS(
                        line_shapefile,
                        layer_name=os.path.splitext(
                            os.path.basename(line_shapefile))[0],
                        group_layer_name='DEBUG',
                        atTop=True)
            else:
                line_shapefile = get_layer_source(lyr_line)

            lines_desc = describe.VectorDescribe(line_shapefile)
            gdf_lines = lines_desc.open_geo_dataframe()
            epsgOut = int(self.mCRSoutput.crs().authid().replace('EPSG:', ''))

            out_lines = None
            if self.lneSaveLinesFile.text() == '':
                out_lines = self.lneSaveLinesFile.text()

            _ = create_points_along_line(
                gdf_lines,
                lines_desc.crs,
                self.dsbDistBtwnPoints.value(),
                self.dsbLineOffsetDist.value(),
                epsgOut,
                out_points_shapefile=self.lneSavePointsFile.text(),
                out_lines_shapefile=out_lines)

            out_lyr_points = addVectorFileToQGIS(
                self.lneSavePointsFile.text(),
                atTop=True,
                layer_name=os.path.splitext(
                    os.path.basename(self.lneSavePointsFile.text()))[0])
            vector_apply_unique_value_renderer(out_lyr_points, 'Strip_Name')

            if self.lneSaveLinesFile.text() == '':
                out_lyr_lines = addVectorFileToQGIS(
                    self.lneSaveLinesFile.text(),
                    atTop=True,
                    layer_name=os.path.splitext(
                        os.path.basename(self.lneSaveLinesFile.text()))[0])

                vector_apply_unique_value_renderer(out_lyr_lines, 'Strip_Name')

            self.cleanMessageBars(True)
            self.fraMain.setDisabled(False)

            self.iface.mainWindow().statusBar().clearMessage()
            self.iface.messageBar().popWidget()
            QApplication.restoreOverrideCursor()
            return super(StripTrialPointsDialog, 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):
        """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