diff --git a/draw.drawio b/draw.drawio new file mode 100644 index 0000000..a3332ea --- /dev/null +++ b/draw.drawio @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/log.txt b/log.txt index d551d01..29a2dc7 100644 --- a/log.txt +++ b/log.txt @@ -1,4 +1,4 @@ -2022-05-23 21:09:46,286 - root - INFO - lic data:2022-12-01 00:00:00 -2022-05-23 21:09:46,286 - root - INFO - remain_days: 191 -2022-05-23 21:09:47,553 - root - INFO - lic data:2022-12-01 00:00:00 -2022-05-23 21:09:47,553 - root - INFO - remain_days: 191 +2022-05-24 20:29:01,454 - root - INFO - lic data:2022-12-01 00:00:00 +2022-05-24 20:29:01,455 - root - INFO - remain_days: 190 +2022-05-24 20:29:02,777 - root - INFO - lic data:2022-12-01 00:00:00 +2022-05-24 20:29:02,777 - root - INFO - remain_days: 190 diff --git a/plugins/basic_change/main.py b/plugins/basic_change/main.py index af8428b..cda8252 100644 --- a/plugins/basic_change/main.py +++ b/plugins/basic_change/main.py @@ -6,7 +6,7 @@ from PyQt5.QtWidgets import QAction, QDialog, QHBoxLayout, QVBoxLayout, QPushBut from PyQt5.QtCore import pyqtSignal from PyQt5.QtGui import QIcon from rscder.utils.project import BasicLayer, Project, PairLayer, ResultPointLayer, RasterLayer -from rscder.gui.layercombox import LayerCombox +from rscder.gui.layercombox import PairLayerCombox from osgeo import gdal, gdal_array from threading import Thread import numpy as np @@ -21,7 +21,7 @@ class MyDialog(QDialog): self.setFixedWidth(500) - self.layer_select = LayerCombox(self) + self.layer_select = PairLayerCombox(self) self.layer_select.setFixedWidth(400) # self.number_input = QLineEdit(self) @@ -45,6 +45,9 @@ class MyDialog(QDialog): self.setLayout(self.main_layout) def on_ok(self): + if self.layer_select.layer1 is None or self.layer_select.layer2 is None: + self.reject() + return self.accept() def on_cancel(self): @@ -86,17 +89,22 @@ class BasicMethod(BasicPlugin): def send_message(self, s): self.message_box.info(s) - def run_basic_diff_alg(self, layer:PairLayer): + def run_basic_diff_alg(self, layer1:RasterLayer, layer2:RasterLayer): - pth1 = layer.main_l1.path - pth2 = layer.main_l2.path + pth1 = layer1.path + pth2 = layer2.path - cell_size = layer.cell_size + + + cell_size = layer1.layer_parent.cell_size self.message_send.emit('开始计算差分法') ds1 = gdal.Open(pth1) ds2 = gdal.Open(pth2) + if not layer1.compare(layer2): + self.message_send.emit('两个图层的尺寸不同') + return xsize = ds1.RasterXSize ysize = ds1.RasterYSize band = ds1.RasterCount @@ -142,7 +150,7 @@ class BasicMethod(BasicPlugin): self.message_send.emit('归一化概率中...') temp_in_ds = gdal.Open(out_tif) - out_normal_tif = os.path.join(Project().cmi_path, '{}-{}.tif'.format(layer.name, int(np.random.rand() * 100000))) + out_normal_tif = os.path.join(Project().cmi_path, '{}-{}.tif'.format(layer1.layer_parent.name, int(np.random.rand() * 100000))) out_normal_ds = driver.Create(out_normal_tif, xsize, ysize, 1, gdal.GDT_Byte) out_normal_ds.SetGeoTransform(ds1.GetGeoTransform()) out_normal_ds.SetProjection(ds1.GetProjection()) @@ -175,7 +183,7 @@ class BasicMethod(BasicPlugin): self.message_send.emit('完成归一化概率') self.message_send.emit('计算变化表格中...') - out_csv = os.path.join(Project().bcdm_path, '{}-{}.csv'.format(layer.name, int(np.random.rand() * 100000))) + out_csv = os.path.join(Project().bcdm_path, '{}-{}.csv'.format(layer1.layer_parent.name, int(np.random.rand() * 100000))) xblocks = xsize // cell_size[0] normal_in_ds = gdal.Open(out_normal_tif) @@ -202,11 +210,11 @@ class BasicMethod(BasicPlugin): f.write(f'{center_x},{center_y},{block_data_xy.mean() / 255 * 100},1\n') - point_result_lalyer = ResultPointLayer(out_csv, enable=False, proj = layer.proj, geo = layer.geo) + point_result_lalyer = ResultPointLayer(out_csv, enable=False, proj = layer1.proj, geo = layer1.geo) raster_result_layer = RasterLayer(None, True, out_normal_tif, BasicLayer.BOATH_VIEW) - layer.add_result_layer(point_result_lalyer) - layer.add_result_layer(raster_result_layer) + layer1.layer_parent.add_result_layer(point_result_lalyer) + layer1.layer_parent.add_result_layer(raster_result_layer) self.message_send.emit('完成计算变化表格') @@ -214,18 +222,18 @@ class BasicMethod(BasicPlugin): def basic_diff_alg(self): # layer_select = - layer = None + layer_select = MyDialog(self.mainwindow) - if(layer_select.exec_()): - layer = layer_select.layer_select.current_layer + if layer_select.exec_(): + layer1 = layer_select.layer_select.layer1 + layer2 = layer_select.layer_select.layer2 else: return # layer:PairLayer = list(self.project.layers.values())[0] - if not layer.check(): - return + - t = Thread(target=self.run_basic_diff_alg, args=(layer,)) + t = Thread(target=self.run_basic_diff_alg, args=(layer1, layer2)) t.start() diff --git a/plugins/plugins.yaml b/plugins/plugins.yaml index 11706d8..82173f5 100644 --- a/plugins/plugins.yaml +++ b/plugins/plugins.yaml @@ -18,4 +18,11 @@ module: export_to name: ExportTo path: ./plugin\export_to + version: 1.0.0 +- author: RSCDER + description: MeanFilter + enabled: true + module: some_filter + name: MeanFilter + path: ./plugin\some_filter version: 1.0.0 \ No newline at end of file diff --git a/plugins/some_filter/__init__.py b/plugins/some_filter/__init__.py new file mode 100644 index 0000000..396c649 --- /dev/null +++ b/plugins/some_filter/__init__.py @@ -0,0 +1 @@ +from some_filter.main import * \ No newline at end of file diff --git a/plugins/some_filter/main.py b/plugins/some_filter/main.py new file mode 100644 index 0000000..d806dd4 --- /dev/null +++ b/plugins/some_filter/main.py @@ -0,0 +1,135 @@ +import os +from threading import Thread +from PyQt5.QtWidgets import QDialog, QAction +from PyQt5 import QtCore, QtGui, QtWidgets +from PyQt5.QtCore import Qt, QModelIndex, pyqtSignal +from rscder.utils.project import PairLayer, Project, RasterLayer, ResultPointLayer +from rscder.plugins.basic import BasicPlugin +from rscder.gui.layercombox import RasterLayerCombox +from osgeo import gdal, gdal_array +from skimage.filters import rank +from skimage.morphology import disk, rectangle +class FilterSetting(QDialog): + def __init__(self, parent=None): + super(FilterSetting, self).__init__(parent) + self.setWindowTitle('Filter Setting') + # self.setWindowFlags(Qt.WindowStaysOnTopHint) + self.setFixedSize(300, 200) + # self.setStyleSheet("QDialog{background-color:rgb(255,255,255);}") + self.setWindowIcon(QtGui.QIcon(':/plugins/some_filter/icon.png')) + self.setWindowIconText('Filter Setting') + # self.setWindowModality(Qt.ApplicationModal) + self.initUI() + # self.show() + + def initUI(self): + self.layer_combox = RasterLayerCombox(self) + layer_label = QtWidgets.QLabel('图层:') + + hbox = QtWidgets.QHBoxLayout() + hbox.addWidget(layer_label) + hbox.addWidget(self.layer_combox) + + x_size_input = QtWidgets.QLineEdit(self) + x_size_input.setText('3') + y_size_input = QtWidgets.QLineEdit(self) + y_size_input.setText('3') + + size_label = QtWidgets.QLabel(self) + size_label.setText('窗口大小:') + + time_label = QtWidgets.QLabel(self) + time_label.setText('X') + + self.x_size_input = x_size_input + self.y_size_input = y_size_input + + hlayout1 = QtWidgets.QHBoxLayout() + hlayout1.addWidget(size_label) + hlayout1.addWidget(x_size_input) + hlayout1.addWidget(time_label) + hlayout1.addWidget(y_size_input) + + ok_button = QtWidgets.QPushButton(self) + ok_button.setText('确定') + ok_button.clicked.connect(self.accept) + + cancel_button = QtWidgets.QPushButton(self) + cancel_button.setText('取消') + cancel_button.clicked.connect(self.reject) + + hlayout2 = QtWidgets.QHBoxLayout() + hlayout2.addWidget(ok_button) + hlayout2.addWidget(cancel_button) + + vlayout = QtWidgets.QVBoxLayout() + vlayout.addLayout(hbox) + vlayout.addLayout(hlayout1) + vlayout.addLayout(hlayout2) + self.setLayout(vlayout) + + +class MainPlugin(BasicPlugin): + + alg_ok = pyqtSignal(PairLayer, RasterLayer) + + @staticmethod + def info(): + return { + 'name': 'mean_filter', + 'author': 'rscder', + 'version': '0.0.1', + 'description': 'Mean Filter' + } + + def set_action(self): + self.action = QAction('均值滤波', self.mainwindow) + # self.action.setCheckable) + # self.action.setChecked(False) + self.action.triggered.connect(self.run) + self.ctx['basic_menu'].addAction(self.action) + self.alg_ok.connect(self.alg_oked) + # basic + + def alg_oked(self, parent, layer:RasterLayer): + parent.add_result_layer(layer) + + def run_alg(self, layer:RasterLayer, x_size, y_size, method='mean'): + x_size = int(x_size) + y_size = int(y_size) + pth = layer.path + if pth is None: + return + + ds = gdal.Open(pth) + band_count = ds.RasterCount + out_path = os.path.join(Project().other_path, '{}_mean_filter.tif'.format(layer.name)) + out_ds = gdal.GetDriverByName('GTiff').Create(out_path, ds.RasterXSize, ds.RasterYSize, band_count, ds.GetRasterBand(1).DataType) + out_ds.SetProjection(ds.GetProjection()) + out_ds.SetGeoTransform(ds.GetGeoTransform()) + + for i in range(band_count): + band = ds.GetRasterBand(i+1) + data = band.ReadAsArray() + + data = rank.mean(data, rectangle(y_size, x_size)) + + out_band = out_ds.GetRasterBand(i+1) + out_band.WriteArray(data) + + out_ds.FlushCache() + del out_ds + del ds + + rlayer = RasterLayer(path = out_path, enable= True, view_mode = layer.view_mode ) + + self.alg_ok.emit(layer.layer_parent, rlayer) + + def run(self): + dialog = FilterSetting(self.mainwindow) + dialog.show() + if dialog.exec_(): + x_size = int(dialog.x_size_input.text()) + y_size = int(dialog.y_size_input.text()) + t = Thread(target=self.run_alg, args=(dialog.layer_combox.current_layer, x_size, y_size)) + t.start() \ No newline at end of file diff --git a/rscder/gui/layercombox.py b/rscder/gui/layercombox.py index 6fbfbf7..4fcc47a 100644 --- a/rscder/gui/layercombox.py +++ b/rscder/gui/layercombox.py @@ -1,6 +1,6 @@ -from PyQt5.QtWidgets import QComboBox +from PyQt5.QtWidgets import QComboBox, QWidget, QLabel, QHBoxLayout, QVBoxLayout from PyQt5.QtGui import QIcon -from rscder.utils.project import Project +from rscder.utils.project import Project, RasterLayer, ResultPointLayer class LayerCombox(QComboBox): def __init__(self, parent=None): @@ -23,4 +23,117 @@ class LayerCombox(QComboBox): self.current_layer = None else: self.current_layer = Project().layers[self.itemData(index)] + +class PairLayerCombox(QWidget): + + def __init__(self, parent=None) -> None: + super().__init__(parent) + self.layer1 = None + self.layer2 = 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_layer2 = QComboBox(self) + self.raster_layer2.addItem('---', None) + + self.raster_layer1.currentIndexChanged.connect(self.on_raster_layer1_changed) + self.raster_layer2.currentIndexChanged.connect(self.on_raster_layer2_changed) + + self.layer_combox.currentIndexChanged.connect(self.on_group_changed) + + self.setLayout(hbox) + + def on_raster_layer1_changed(self, index): + if index == 0: + self.layer1 = None + else: + self.layer1 = self.raster_layer1.itemData(index) + + def on_raster_layer2_changed(self, index): + if index == 0: + self.layer2 = None + else: + self.layer2 = self.raster_layer2.itemData(index) + + def on_group_changed(self, index): + if index == 0: + self.raster_layer1.clear() + self.raster_layer2.clear() + self.raster_layer1.addItem('---', None) + self.raster_layer2.addItem('---', None) + else: + self.raster_layer1.clear() + self.raster_layer2.clear() + self.raster_layer1.addItem('---', None) + self.raster_layer2.addItem('---', None) + for sub in self.layer_combox.current_layer.layers: + if isinstance(sub, RasterLayer): + self.raster_layer1.addItem(QIcon(':/icons/layer.png'), sub.name, sub) + self.raster_layer2.addItem(QIcon(':/icons/layer.png'), sub.name, sub) + + +class RasterLayerCombox(QComboBox): + + def __init__(self, parent=None, layer=None): + super().__init__(parent) + self.addItem('---', None) + if layer is not None: + for sub in layer.layers: + if isinstance(sub, RasterLayer): + self.addItem(sub.name, sub) + else: + for layer in Project().layers.values(): + for sub in layer.layers: + if isinstance(sub, RasterLayer): + self.addItem(sub.name, sub) + # self.addItem(layer.name, layer.id) + + for i in range(self.count() - 1): + self.setItemIcon(i + 1, QIcon(':/icons/layer.png')) + + + self.currentIndexChanged.connect(self.on_changed) + + self.current_layer = None + + def on_changed(self, index): + if index == 0: + self.current_layer = None + else: + self.current_layer = self.itemData(index) + +class ResultPointLayerCombox(QComboBox): + + def __init__(self, parent=None): + super().__init__(parent) + self.addItem('---', None) + + for layer in Project().layers.values(): + for sub in layer.layers: + if isinstance(sub, ResultPointLayer): + self.addItem(sub.name, sub) + + for i in range(self.count() - 1): + self.setItemIcon(i + 1, QIcon(':/icons/layer.png')) + + + self.currentIndexChanged.connect(self.on_changed) + + self.current_layer = None + + def on_changed(self, index): + if index == 0: + self.current_layer = None + else: + self.current_layer = self.itemData(index) diff --git a/rscder/gui/mapcanvas.py b/rscder/gui/mapcanvas.py index 43aa9c1..8ca08a1 100644 --- a/rscder/gui/mapcanvas.py +++ b/rscder/gui/mapcanvas.py @@ -124,32 +124,6 @@ class DoubleCanvas(QWidget): self.mapcanva1.setLayers(layer_list_1) self.mapcanva2.setLayers(layer_list_2) - def add_layer(self, layer:str): - if not layer in Project().layers: - self.clear() - return - layer:PairLayer = Project().layers[layer] - if not layer.enable: - return - # self.clear() - - if not self.mapcanva1.is_main and not self.mapcanva2.is_main: - self.mapcanva1.is_main = True - - if layer.l1_enable: - self.mapcanva1.add_layer(layer.l1) - if layer.l2_enable: - self.mapcanva2.add_layer(layer.l2) - if layer.grid_enable and self.grid_show: - self.mapcanva1.add_grid_layer(layer.grid_layer.grid_layer) - self.mapcanva2.add_grid_layer(layer.grid_layer.grid_layer) - for r in layer.results: - if r.enable: - self.mapcanva1.add_layer(r.layer) - self.mapcanva2.add_layer(r.layer) - # self.mapcanva1.set_extent(layer.l1.extent()) - self.mapcanva1.refresh() - self.mapcanva2.refresh() def zoom_to_extent(self, extent): # extent = QgsRectangle(x - layer.cell_size[0] * layer.xres, y - layer.cell_size[1] * layer.yres, x + layer.cell_size[0] * layer.xres, y + layer.cell_size[1] * layer.yres) @@ -159,8 +133,6 @@ class DoubleCanvas(QWidget): def zoom_to_layer(self, layer): self.mapcanva1.set_extent(layer.extent()) self.mapcanva2.set_extent(layer.extent()) - def layer_changed(self, layer:str): - self.add_layer(layer) def clear(self): self.mapcanva1.clear() diff --git a/rscder/utils/project.py b/rscder/utils/project.py index 953abb8..f504f57 100644 --- a/rscder/utils/project.py +++ b/rscder/utils/project.py @@ -369,7 +369,8 @@ class GridLayer(BasicLayer): class RasterLayer(BasicLayer): - def __init__(self, name=None, enable=False, path=None, view_mode=BasicLayer.BOATH_VIEW): + def __init__(self, name=None, enable=False, path=None, + view_mode=BasicLayer.BOATH_VIEW): if name is None: name = os.path.splitext(os.path.basename(path))[0] super().__init__(name, enable, ':/icons/raster.png', path, BasicLayer.IN_FILE, view_mode) diff --git a/rscder/utils/setting.py b/rscder/utils/setting.py index 9eca375..f268413 100644 --- a/rscder/utils/setting.py +++ b/rscder/utils/setting.py @@ -162,17 +162,4 @@ class Settings(QSettings): value = value is not None with Settings(Settings.General.PRE) as s: s.setValue('auto_save', value) - - @property - def auto_save_intervel(self): - with Settings(Settings.General.PRE) as s: - return s.value('auto_save_intervel', 30) - - @auto_save_intervel.setter - def auto_save_intervel(self, value): - if isinstance(value, int) and value > 0: - pass - else: - return - with Settings(Settings.General.PRE) as s: - s.setValue('auto_save_intervel', value) \ No newline at end of file + \ No newline at end of file