diff --git a/plugins/In_one/main.py b/plugins/In_one/main.py index 4d09d7c..bdd8696 100644 --- a/plugins/In_one/main.py +++ b/plugins/In_one/main.py @@ -211,7 +211,8 @@ class InOnePlugin(BasicPlugin): def set_action(self): basic_diff_method_in_one = QAction('总流程') - ActionManager().change_detection_menu.addAction(basic_diff_method_in_one) + # ActionManager().change_detection_menu.addAction(basic_diff_method_in_one) + ActionManager().unsupervised_menu.addAction(basic_diff_method_in_one) self.basic_diff_method_in_one = basic_diff_method_in_one basic_diff_method_in_one.triggered.connect(self.run) @@ -224,6 +225,7 @@ class InOnePlugin(BasicPlugin): t.start() def run_alg(self,w:AllInOne): + dict={} layer1=w.layer_combox.layer1 layer2=w.layer_combox.layer2 if not layer1.compare(layer2): @@ -246,6 +248,7 @@ class InOnePlugin(BasicPlugin): if w.cd_select.choose==self.cd[0]: cdpth=basic_cd(pth1,pth2,w.layer_combox.layer1.layer_parent,self.send_message) name += '_basic_cd' + #dict[name]=cdpth else: pass @@ -253,12 +256,14 @@ class InOnePlugin(BasicPlugin): if w.threshold_select.choose==self.threshold[0]: thpth=otsu(cdpth,w.layer_combox.layer1.layer_parent.name,self.send_message) name+='_otsu' + dict[name]=thpth elif w.threshold_select.choose=='手动阈值': thpth=thresh(cdpth,float(w.threshold_input.text()),w.layer_combox.layer1.layer_parent.name,self.send_message) + dict[name+'_thresh_{:.1f}'.format(float(w.threshold_input.text()))] else: pass - table_layer(thpth,layer1,name,self.send_message) + table_layer(thpth,layer1,name,self.send_message,dict) def Meanfilter(x_size,y_size,layer:RasterLayer): x_size = int(x_size) @@ -459,7 +464,7 @@ def thresh(pth,gap,name,send_message): #otsu_layer = SingleBandRasterLayer(path = out_th, style_info={}) #layer.layer_parent.add_result_layer(otsu_layer) -def table_layer(pth,layer,name,send_message): +def table_layer(pth,layer,name,send_message,dict): send_message.emit('正在计算表格结果...') cell_size = layer.layer_parent.cell_size ds = gdal.Open(pth) @@ -484,13 +489,15 @@ def table_layer(pth,layer,name,send_message): if end_x > xsize: end_x = xsize block_data_xy = block_data[:, start_x:end_x] - if block_data_xy.mean() > 0.5: - center_x = start_x + cell_size[0] // 2 - center_y = j * cell_size[1] + cell_size[1] // 2 - center_x = center_x * geo[1] + geo [0] - center_y = center_y * geo[5] + geo [3] - f.write(f'{center_x},{center_y},{block_data_xy.mean() * 100},1\n') + + center_x = start_x + cell_size[0] // 2 + center_y = j * cell_size[1] + cell_size[1] // 2 + center_x = center_x * geo[1] + geo [0] + center_y = center_y * geo[5] + geo [3] + f.write(f'{center_x},{center_y},{block_data_xy.mean() * 100},{int(block_data_xy.mean() > 0.5)}\n') result_layer = ResultPointLayer(out_csv, enable=True, proj=layer.proj, geo=layer.geo) + result_layer.result_path=dict + print(result_layer.result_path) layer.layer_parent.add_result_layer(result_layer) send_message.emit('计算完成') \ No newline at end of file diff --git a/plugins/change_rate/__init__.py b/plugins/change_rate/__init__.py new file mode 100644 index 0000000..2b7eabf --- /dev/null +++ b/plugins/change_rate/__init__.py @@ -0,0 +1 @@ +from change_rate.main import * \ No newline at end of file diff --git a/plugins/change_rate/main.py b/plugins/change_rate/main.py new file mode 100644 index 0000000..51dc579 --- /dev/null +++ b/plugins/change_rate/main.py @@ -0,0 +1,99 @@ +import os +from threading import Thread +from rscder.gui.actions import ActionManager +from rscder.gui.layercombox import ResultPointLayerCombox +from rscder.plugins.basic import BasicPlugin +from PyQt5.QtWidgets import QAction, QDialog, QLabel, QHBoxLayout, QVBoxLayout, QPushButton,QSlider,QSpinBox,QSpacerItem +from PyQt5.QtCore import pyqtSignal,Qt +from PyQt5.QtGui import QIcon +from rscder.utils.icons import IconInstance +from rscder.utils.project import Project, ResultPointLayer, SingleBandRasterLayer +import numpy as np +class RateSetdialog(QDialog): + def __init__(self, parent=None): + super(RateSetdialog,self).__init__(parent) + self.setWindowTitle('设置变化阈值') + self.setWindowIcon(IconInstance().LOGO) + + self.layer_select = ResultPointLayerCombox(self) + self.slider=QSlider(Qt.Horizontal) + self.spin=QSpinBox() + + h1=QHBoxLayout() + h1.addWidget(QLabel('表格结果:')) + h1.addWidget(self.layer_select) + + h2=QHBoxLayout() + + + self.slider.valueChanged.connect(self.spin.setValue)#valueChanged当值与原来不同是发射 + self.spin.valueChanged.connect(self.slider.setValue) + + h2.addItem(QSpacerItem(10,0)) + h2.addWidget(self.slider) + h2.addWidget(self.spin) + h2.addItem(QSpacerItem(10,0)) + self.ok_button = QPushButton('确定', self) + self.ok_button.setIcon(IconInstance().OK) + self.ok_button.clicked.connect(self.on_ok) + + self.cancel_button = QPushButton('取消', self) + self.cancel_button.setIcon(IconInstance().CANCEL) + self.cancel_button.clicked.connect(self.on_cancel) + + self.button_layout = QHBoxLayout() + self.button_layout.addWidget(self.ok_button) + self.button_layout.addWidget(self.cancel_button) + vlayout=QVBoxLayout() + vlayout.addLayout(h1) + vlayout.addWidget(QLabel('设置阈值')) + vlayout.addLayout(h2) + vlayout.addLayout(self.button_layout) + self.setLayout(vlayout) + + def on_ok(self): + self.accept() + + def on_cancel(self): + self.reject() + +class RateSetPlugin(BasicPlugin): + current_layer=None + @staticmethod + def info(): + return { + 'name': 'set_change_rate', + 'description': 'set_change_rate', + 'author': 'RSCDER', + 'version': '1.0.0', + } + + def set_action(self): + self.action = QAction(IconInstance().VECTOR, '变化阈值设定', self.mainwindow) + self.action.triggered.connect(self.show_dialog) + ActionManager().position_menu.addAction(self.action) + + def show_dialog(self): + dialog=RateSetdialog(self.mainwindow) + dialog.layer_select.currentIndexChanged.connect(lambda index: self.currentLayer(dialog.layer_select.itemData(index) if index>0 else None)) + dialog.slider.valueChanged.connect(lambda input:self.setrate(input)) + dialog.setModal(False) + dialog.show() + def currentLayer(self,layer): + self.current_layer=layer + + + def setrate(self,input:int): + layer=self.current_layer + # print(layer.__class__) + if not isinstance(layer,ResultPointLayer): + return + data=layer.data.copy() + # print(input) + data[np.where(data[:,-2]<(input)),-1]=0 + data[np.where(data[:,-2]>(input)),-1]=1 + layer.data=data + layer.update_point_layer(-1) + + + diff --git a/plugins/evaluation/main.py b/plugins/evaluation/main.py index 76e7657..83ea072 100644 --- a/plugins/evaluation/main.py +++ b/plugins/evaluation/main.py @@ -6,7 +6,7 @@ from threading import Thread import numpy as np from rscder.gui.actions import ActionManager from rscder.plugins.basic import BasicPlugin -from rscder.gui.layercombox import RasterLayerCombox +from rscder.gui.layercombox import RasterLayerCombox,ResultLayercombox from PyQt5.QtWidgets import QAction, QFileDialog, QDialog, QLabel, QHBoxLayout, QVBoxLayout, QPushButton from PyQt5.QtGui import QIcon from PyQt5.QtCore import Qt @@ -30,7 +30,7 @@ class EvalutationDialog(QDialog): self.setWindowTitle('精度评估') self.setWindowIcon(IconInstance().LOGO) - self.layer_select = RasterLayerCombox(self) + self.layer_select = ResultLayercombox(self) self.gt_file = None gt_file_select_label = QLabel('真值文件:') @@ -42,7 +42,7 @@ class EvalutationDialog(QDialog): hbox1.addWidget(self.gt_file_select) hbox2 = QHBoxLayout() - hbox2.addWidget(QLabel('二值化结果图层:')) + # hbox2.addWidget(QLabel('二值化结果图层:')) hbox2.addWidget(self.layer_select) self.ok_button = QPushButton('确定', self) diff --git a/plugins/plugins.yaml b/plugins/plugins.yaml index e3ffab5..f7740cc 100644 --- a/plugins/plugins.yaml +++ b/plugins/plugins.yaml @@ -7,7 +7,7 @@ version: 1.0.0 - author: RSCDER description: BasicMethod - enabled: true + enabled: false module: basic_change name: BasicMethod path: ./plugin\basic_change @@ -28,7 +28,7 @@ version: 1.0.0 - author: RSCDER description: OTSU - enabled: true + enabled: false module: threshold name: OTSU path: ./plugin\threshold @@ -51,6 +51,13 @@ description: AllinOne enabled: true module: In_one - name: AllinOne + name: basic_diff_AllinOne path: ./plugin\In_one + version: 1.0.0 +- author: RSCDER + description: set Change Rate + enabled: true + module: change_rate + name: set_change_rate + path: ./plugin\change_rate version: 1.0.0 \ No newline at end of file diff --git a/plugins/table_result/main.py b/plugins/table_result/main.py index 29e59aa..027f47f 100644 --- a/plugins/table_result/main.py +++ b/plugins/table_result/main.py @@ -1,7 +1,7 @@ import os from threading import Thread from rscder.gui.actions import ActionManager -from rscder.gui.layercombox import RasterLayerCombox, ResultPointLayerCombox +from rscder.gui.layercombox import RasterLayerCombox, ResultLayercombox from rscder.plugins.basic import BasicPlugin from PyQt5.QtWidgets import QAction, QDialog, QLabel, QHBoxLayout, QVBoxLayout, QPushButton from PyQt5.QtCore import pyqtSignal @@ -18,7 +18,7 @@ class TableResultDialog(QDialog): self.setWindowTitle('表格结果') self.setWindowIcon(IconInstance().LOGO) - self.layer_select = RasterLayerCombox(self) + self.layer_select = ResultLayercombox(self) hbox = QHBoxLayout() hbox.addWidget(QLabel('二值化结果图层:')) hbox.addWidget(self.layer_select) diff --git a/rscder/gui/layercombox.py b/rscder/gui/layercombox.py index 5556c06..e6267c2 100644 --- a/rscder/gui/layercombox.py +++ b/rscder/gui/layercombox.py @@ -1,7 +1,7 @@ from PyQt5.QtWidgets import QComboBox, QWidget, QLabel, QHBoxLayout, QVBoxLayout from PyQt5.QtGui import QIcon from rscder.utils.icons import IconInstance -from rscder.utils.project import PairLayer, Project, RasterLayer, ResultPointLayer +from rscder.utils.project import PairLayer, Project, RasterLayer, ResultPointLayer,SingleBandRasterLayer class LayerCombox(QComboBox): def __init__(self, parent=None): @@ -139,3 +139,55 @@ class ResultPointLayerCombox(QComboBox): else: self.current_layer = self.itemData(index) +class ResultLayercombox(QWidget): + + def __init__(self, parent=None) -> None: + super().__init__(parent) + self.current_layer = None + + self.initUI() + + def initUI(self): + self.layer_combox = LayerCombox(self) + layer_label = QLabel('图层组:') + + hbox = QHBoxLayout() + hbox.addWidget(layer_label) + hbox.addWidget(self.layer_combox) + + self.raster_layer1 = QComboBox(self) + self.raster_layer1.addItem('---', None) + + self.raster_layer1.currentIndexChanged.connect(self.on_raster_layer1_changed) + self.layer_combox.currentIndexChanged.connect(self.on_group_changed) + + hbox1 = QHBoxLayout() + hbox1.addWidget(QLabel('二值化结果:')) + hbox1.addWidget(self.raster_layer1) + + + vbox = QVBoxLayout() + vbox.addLayout(hbox) + vbox.addLayout(hbox1) + + + self.setLayout(vbox) + + def on_raster_layer1_changed(self, index): + if index == 0: + self.current_layer = None + else: + self.current_layer = self.raster_layer1.itemData(index) + + + def on_group_changed(self, index): + if index == 0: + self.raster_layer1.clear() + self.raster_layer1.addItem('---', None) + else: + self.raster_layer1.clear() + self.raster_layer1.addItem('---', None) + for l in self.layer_combox.current_layer.layers: + if isinstance(l,ResultPointLayer): + for k,v in l.result_path.items(): + self.raster_layer1.addItem(IconInstance().RASTER,k,SingleBandRasterLayer(path = v, style_info={})) diff --git a/rscder/utils/project.py b/rscder/utils/project.py index ca9694d..106ddf7 100644 --- a/rscder/utils/project.py +++ b/rscder/utils/project.py @@ -461,14 +461,15 @@ class VectorLayer(BasicLayer): class ResultPointLayer(BasicLayer): - def __init__(self, path, name=None, enable = False, proj = None, geo = None): + def __init__(self, path, name=None, enable = False, proj = None, geo = None,result_path={},dsort=True ): if name is None: name = os.path.splitext(os.path.basename(path))[0] super().__init__(name, enable, icon=IconInstance().VECTOR, path=path, path_mode = BasicLayer.IN_FILE, view_mode=BasicLayer.BOATH_VIEW ) self.data = None self.wkt = proj self.geo = geo - + self.dsort=dsort + self.result_path=result_path self.load_point_file() def save(self): @@ -526,6 +527,10 @@ class ResultPointLayer(BasicLayer): data = np.loadtxt(self.path, delimiter=',', skiprows=1) if data is None: return + if self.dsort: + data=data[data[:,-2].argsort()] + else: + data=data[-(data[:,-2]).argsort()] self.data = data self.make_point_layer() @@ -576,6 +581,7 @@ class ResultPointLayer(BasicLayer): feature.setAttribute('prob', '') else: feature.setAttribute('prob', '%.2f'%(d[2])) + self.layer.updateFeature(feature) else: feature = self.layer.getFeature(row+1) # print(feature) @@ -588,6 +594,7 @@ class ResultPointLayer(BasicLayer): feature.setAttribute('prob', '%.2f'%(self.data[row][2])) self.layer.updateFeature(feature) self.layer.commitChanges() + Project().result_table.show_result(self) def get_actions(self):