Пример #1
0
    def create_table(self):
        from AcATaMa.gui.acatama_dockwidget import AcATaMaDockWidget as AcATaMa

        header = ["Pix Val", "Color", "Select"]
        # get color table from raster
        thematic_table = {"color_table": get_color_table(
            AcATaMa.dockwidget.QCBox_ThematicRaster.currentLayer(),
            band=int(AcATaMa.dockwidget.QCBox_band_ThematicRaster.currentText()),
            nodata=int(AcATaMa.dockwidget.nodata_ThematicRaster.value()))}

        if not thematic_table["color_table"]:
            # clear table
            self.tableOfClasses.setRowCount(0)
            self.tableOfClasses.setColumnCount(0)
            return
        thematic_table["row_count"] = len(list(thematic_table["color_table"].values())[0])
        # init table
        self.tableOfClasses.setRowCount(thematic_table["row_count"])
        self.tableOfClasses.setColumnCount(3)
        # hidden row labels
        self.tableOfClasses.verticalHeader().setVisible(False)
        # add Header
        self.tableOfClasses.setHorizontalHeaderLabels(header)

        # insert items
        for n, h in enumerate(header):
            if h == "Pix Val":
                for m, item in enumerate(thematic_table["color_table"]["Pixel Value"]):
                    item_table = QTableWidgetItem(str(item))
                    item_table.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
                    item_table.setTextAlignment(Qt.AlignCenter | Qt.AlignVCenter)
                    self.tableOfClasses.setItem(m, n, item_table)
            if h == "Color":
                for m in range(thematic_table["row_count"]):
                    item_table = QTableWidgetItem()
                    item_table.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
                    item_table.setBackground(QColor(thematic_table["color_table"]["Red"][m],
                                                    thematic_table["color_table"]["Green"][m],
                                                    thematic_table["color_table"]["Blue"][m],
                                                    thematic_table["color_table"]["Alpha"][m]))
                    self.tableOfClasses.setItem(m, n, item_table)
            if h == "Select":
                for m in range(thematic_table["row_count"]):
                    item_table = QPushButton("Select this")
                    item_table.clicked.connect(self.select_clicked)
                    self.tableOfClasses.setCellWidget(m, n, item_table)

        # adjust size of Table
        self.tableOfClasses.resizeColumnsToContents()
        self.tableOfClasses.resizeRowsToContents()
        # adjust the dialog based on table content
        dialog_width = self.tableOfClasses.horizontalHeader().length() + 50
        self.resize(dialog_width, self.height())
Пример #2
0
def fill_stratified_sampling_table(dockwidget):
    try:
        # check the current selected file
        dockwidget.QCBox_CategRaster_StraRS.currentLayer().dataProvider()
        # check sampling method selected
        if not dockwidget.QCBox_StraRS_Method.currentText():
            raise Exception
    except:
        # clear table
        dockwidget.QTableW_StraRS.setRowCount(0)
        dockwidget.QTableW_StraRS.setColumnCount(0)
        return

    if dockwidget.QCBox_StraRS_Method.currentText().startswith("Fixed values"):
        srs_method = "fixed values"
        dockwidget.widget_TotalExpectedSE.setHidden(True)
    if dockwidget.QCBox_StraRS_Method.currentText().startswith(
            "Area based proportion"):
        srs_method = "area based proportion"
        dockwidget.widget_TotalExpectedSE.setVisible(True)

    if dockwidget.QCBox_CategRaster_StraRS.currentText() in dockwidget.srs_tables.keys() and \
        srs_method in dockwidget.srs_tables[dockwidget.QCBox_CategRaster_StraRS.currentText()].keys():
        # restore values saved for number of samples configured for selected categorical file
        srs_table = dockwidget.srs_tables[
            dockwidget.QCBox_CategRaster_StraRS.currentText()][srs_method]
    else:
        from AcATaMa.core.raster import get_color_table
        # init a new stratified random sampling table
        srs_table = {
            "color_table":
            get_color_table(
                dockwidget.QCBox_CategRaster_StraRS.currentLayer(),
                band=int(
                    dockwidget.QCBox_band_CategRaster_StraRS.currentText()),
                nodata=int(dockwidget.nodata_CategRaster_StraRS.value()))
        }

        if not srs_table["color_table"]:
            # clear table
            dockwidget.QTableW_StraRS.setRowCount(0)
            dockwidget.QTableW_StraRS.setColumnCount(0)
            # unselect
            dockwidget.QCBox_StraRS_Method.setCurrentIndex(-1)
            return
        srs_table["row_count"] = len(
            list(srs_table["color_table"].values())[0])

        if srs_method == "fixed values":
            srs_table["header"] = ["Pix Val", "Color", "Num Samples"]
            srs_table["column_count"] = len(srs_table["header"])
            srs_table["num_samples"] = [str(0)] * srs_table["row_count"]
            srs_table["On"] = [True] * srs_table["row_count"]

        if srs_method == "area based proportion":
            srs_table["header"] = [
                "Pix Val", "Color", "Num Samples", "Std Error", "On"
            ]
            srs_table["column_count"] = len(srs_table["header"])
            srs_table["std_error"] = [str(0.01)] * srs_table["row_count"]
            srs_table["pixel_count"] = list(
                get_pixel_count_by_pixel_values(
                    dockwidget.QCBox_CategRaster_StraRS.currentLayer(),
                    int(dockwidget.QCBox_band_CategRaster_StraRS.currentText()
                        ), srs_table["color_table"]["Pixel Value"]).values())
            total_std_error = dockwidget.TotalExpectedSE.value()
            srs_table["On"] = [True] * srs_table["row_count"]
            srs_table[
                "num_samples"] = get_num_samples_by_area_based_proportion(
                    srs_table, total_std_error)

        # save srs table
        if dockwidget.QCBox_CategRaster_StraRS.currentText(
        ) not in dockwidget.srs_tables.keys():
            dockwidget.srs_tables[
                dockwidget.QCBox_CategRaster_StraRS.currentText()] = {}
        dockwidget.srs_tables[dockwidget.QCBox_CategRaster_StraRS.currentText(
        )][srs_method] = srs_table

    # update content
    update_srs_table_content(dockwidget, srs_table)