From ef79be328c177f2d18ba8958219305e9a963983a Mon Sep 17 00:00:00 2001 From: copper Date: Thu, 12 May 2022 16:52:38 +0800 Subject: [PATCH] =?UTF-8?q?=E8=81=94=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/basic_change/main.py | 15 +++++--- rscder/gui/result.py | 13 ++++--- rscder/utils/project.py | 69 ++++++++++++++++++++---------------- 3 files changed, 55 insertions(+), 42 deletions(-) diff --git a/plugins/basic_change/main.py b/plugins/basic_change/main.py index 1847bca..c206c33 100644 --- a/plugins/basic_change/main.py +++ b/plugins/basic_change/main.py @@ -79,7 +79,7 @@ class BasicMethod(BasicPlugin): self.message_send.connect(self.send_message) self.result_ok.connect(self.on_result_ok) # self.result_ok.connect(self.on_result_ok) - self.gap = 128 + self.gap = 250 def on_data_load(self, layer_id): @@ -90,9 +90,13 @@ class BasicMethod(BasicPlugin): def on_result_ok(self, data): layer = Project().layers[data['layer_id']] - csv_result = ResultLayer('basic_diff_result', ResultLayer.POINT) + csv_result = ResultLayer('basic_diff_result', layer, ResultLayer.POINT) csv_result.load_file(data['csv_file']) + + raster_layer = ResultLayer('basic_diff_result-raster',layer, ResultLayer.RASTER) + raster_layer.load_file(data['raster_file']) layer.results.append(csv_result) + layer.results.append(raster_layer) self.layer_tree.update_layer(layer.id) def run_basic_diff_alg(self, layer:PairLayer, out): @@ -133,9 +137,9 @@ class BasicMethod(BasicPlugin): block_data1 = block_data1[None, ...] block_data2 = block_data2[None, ...] # pdb.set_trace() - block_diff = block_data1 - block_data2 + block_diff = block_data1.sum(0) - block_data2.sum(0) block_diff = block_diff.astype(np.float32) - block_diff = np.abs(block_diff).sum(0) + block_diff = np.abs(block_diff) min_diff = min(min_diff, block_diff.min()) max_diff = max(max_diff, block_diff.max()) @@ -190,12 +194,13 @@ class BasicMethod(BasicPlugin): 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()},1\n') + f.write(f'{center_x},{center_y},{block_data_xy.mean() / 255},1\n') self.result_ok.emit({ 'layer_id': layer.id, 'csv_file': out_csv, + 'raster_file': out_normal_tif }) self.message_send.emit('完成计算变化表格') diff --git a/rscder/gui/result.py b/rscder/gui/result.py index f75cc8e..c977156 100644 --- a/rscder/gui/result.py +++ b/rscder/gui/result.py @@ -21,7 +21,7 @@ class ResultTable(QtWidgets.QWidget): self.tablewidget.setEditTriggers(QAbstractItemView.NoEditTriggers) self.tablewidget.cellDoubleClicked.connect(self.onDoubleClicked) - self.tablewidget.cellClicked.connect(self.onClicked) + # self.tablewidget.cellClicked.connect(self.onClicked) self.tablewidget.cellChanged.connect(self.onChanged) # self.tablewidget.setModel(self.tableview) @@ -31,27 +31,26 @@ class ResultTable(QtWidgets.QWidget): self.setLayout(layout) self.result = None self.is_in_set_data = False + self.no_change = False def clear(self): self.tablewidget.clear() def onChanged(self, row, col): - if self.is_in_set_data: + if self.is_in_set_data or self.no_change: return if col == 3: + self.no_change = True item_idx = row item_status = self.tablewidget.item(row, col).checkState() == Qt.Checked if item_status: self.tablewidget.item(row, col).setBackground(Qt.yellow) else: self.tablewidget.item(row, col).setBackground(Qt.green) - # print(item_idx, item_status) + print(item_idx, item_status) self.result.update({'row':item_idx, 'value':item_status}) + self.no_change = False - def onClicked(self, row, col): - if col == 3: - self.tablewidget.item(row, col).setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled) - def onDoubleClicked(self, row, col): x = self.tablewidget.item(row, 0).text() y = self.tablewidget.item(row, 1).text() diff --git a/rscder/utils/project.py b/rscder/utils/project.py index ae29f17..761af95 100644 --- a/rscder/utils/project.py +++ b/rscder/utils/project.py @@ -5,7 +5,7 @@ import uuid import numpy as np from osgeo import gdal, gdal_array from rscder.utils.setting import Settings -from qgis.core import QgsRasterLayer, QgsMarkerSymbol, QgsPalLayerSettings, QgsRuleBasedLabeling, QgsTextFormat, QgsLineSymbol, QgsSingleSymbolRenderer, QgsSimpleLineSymbolLayer, QgsVectorLayer, QgsCoordinateReferenceSystem, QgsFeature, QgsGeometry, QgsPointXY +from qgis.core import QgsRasterLayer, QgsMarkerSymbol, QgsUnitTypes, QgsCategorizedSymbolRenderer, QgsRendererCategory, QgsPalLayerSettings, QgsRuleBasedLabeling, QgsTextFormat, QgsLineSymbol, QgsSingleSymbolRenderer, QgsSimpleLineSymbolLayer, QgsVectorLayer, QgsCoordinateReferenceSystem, QgsFeature, QgsGeometry, QgsPointXY from PyQt5.QtCore import QObject, pyqtSignal from PyQt5.QtGui import QColor import yaml @@ -218,7 +218,7 @@ class ResultLayer: POINT = 0 RASTER = 1 - def __init__(self, name, layer_type = POINT): + def __init__(self, name, parent, layer_type = POINT): self.layer_type = layer_type self.data = None self.layer = None @@ -226,13 +226,14 @@ class ResultLayer: self.path = None self.wkt = None self.enable = False + self.parent = parent def update(self, data): if self.layer_type == ResultLayer.POINT: row = data['row'] value = data['value'] self.data[row][-1] = value - self.update_point_layer() + self.update_point_layer(row) elif self.layer_type == ResultLayer.RASTER: pass @@ -249,7 +250,7 @@ class ResultLayer: layer.setLabelsEnabled(True) lyr = QgsPalLayerSettings() lyr.enabled = True - lyr.fieldName = 'id' + lyr.fieldName = 'fid' lyr.placement = QgsPalLayerSettings.OverPoint lyr.textNamedStyle = 'Medium' text_format = QgsTextFormat() @@ -268,8 +269,14 @@ class ResultLayer: layer.setLabeling(rules) def set_render(self, layer): - symbol = QgsMarkerSymbol.createSimple({'color': '#ffffff', 'size': '5'}) - render = QgsSingleSymbolRenderer(symbol) + symbol_change = QgsMarkerSymbol.createSimple({'color': '#ffff00', 'size': 5 * self.parent.xres }) + symbol_change.setSizeUnit(QgsUnitTypes.RenderUnit.RenderMetersInMapUnits) + category_change = QgsRendererCategory(1, symbol_change,'change') + + symbol_unchange = QgsMarkerSymbol.createSimple({'color': '#00000000', 'size': '0'}) + + category_unchange = QgsRendererCategory(0, symbol_unchange, 'unchange') + render = QgsCategorizedSymbolRenderer('status', [category_change, category_unchange]) layer.setRenderer(render) def load_point_file(self): @@ -286,7 +293,7 @@ class ResultLayer: else: crs = QgsCoordinateReferenceSystem() - uri = 'Point?crs={}'.format(crs.toProj()) + uri = 'Point?crs={}&field=status:integer'.format(crs.toProj()) layer = QgsVectorLayer(uri, self.name, "memory") if not layer.isValid(): Project().message_box.error('Failed to create layer') @@ -294,38 +301,40 @@ class ResultLayer: self.format_point_layer(layer) layer.startEditing() features = [] + # status_index = for i, d in enumerate(self.data): - point = QgsFeature(i) + point = QgsFeature(layer.fields()) + point.setId(i) point.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(d[0], d[1]))) + point.setAttribute('status', int(d[-1])) # point.setAttribute('id', i) features.append(point) layer.addFeatures(features) - layer.commitChanges() self.set_render(layer) + layer.commitChanges() + self.layer = layer - def update_point_layer(self): + def update_point_layer(self, row = 0): if self.layer is None: return self.layer.startEditing() - add_features = [] - delete_features = [] - for i, d in enumerate(self.data): - feature = self.layer.getFeature(i+1) - if d[-1]: + if row < 0: + for i, d in enumerate(self.data): + feature = self.layer.getFeature(i+1) if feature is None: - feature = QgsFeature(i) - feature.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(d[0], d[1]))) - # feature.setAttribute('id', i) - add_features.append(feature) - else: - if feature is not None: - delete_features.append(feature.id()) - if len(add_features) > 0: - self.layer.addFeatures(add_features) - if len(delete_features) > 0: - self.layer.deleteFeatures(delete_features) - + continue + feature.setAttribute('status', d[-1]) + else: + feature = self.layer.getFeature(row+1) + # print(feature) + if feature is None: + return + # print(feature.fields().names()) + # self.layer.deleteFeature(feature.id()) + # del feature + feature.setAttribute('status', int(self.data[row][-1])) + self.layer.updateFeature(feature) self.layer.commitChanges() @@ -336,8 +345,8 @@ class ResultLayer: self.layer = QgsRasterLayer(self.path, self.name) @staticmethod - def from_dict(data, root = None): - result = ResultLayer(data['name'], data['layer_type']) + def from_dict(data, parent, root = None): + result = ResultLayer(data['name'], parent, data['layer_type']) result.wkt = data['wkt'] if root is not None: result.load_file(str(Path(root) / data['path'])) @@ -391,7 +400,7 @@ class PairLayer: layer.name = data['name'] for r in data['results']: - layer.results.append(ResultLayer.from_dict(r, root)) + layer.results.append(ResultLayer.from_dict(r, layer, root)) # layer.grid_layer = GridLayer.from_dict(data['grid_layer']) return layer def __init__(self, pth1, pth2, cell_size) -> None: