This commit is contained in:
copper 2022-05-12 16:52:38 +08:00
parent da8d1f178e
commit ef79be328c
3 changed files with 55 additions and 42 deletions

View File

@ -79,7 +79,7 @@ class BasicMethod(BasicPlugin):
self.message_send.connect(self.send_message) self.message_send.connect(self.send_message)
self.result_ok.connect(self.on_result_ok) self.result_ok.connect(self.on_result_ok)
# 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): def on_data_load(self, layer_id):
@ -90,9 +90,13 @@ class BasicMethod(BasicPlugin):
def on_result_ok(self, data): def on_result_ok(self, data):
layer = Project().layers[data['layer_id']] 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']) 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(csv_result)
layer.results.append(raster_layer)
self.layer_tree.update_layer(layer.id) self.layer_tree.update_layer(layer.id)
def run_basic_diff_alg(self, layer:PairLayer, out): def run_basic_diff_alg(self, layer:PairLayer, out):
@ -133,9 +137,9 @@ class BasicMethod(BasicPlugin):
block_data1 = block_data1[None, ...] block_data1 = block_data1[None, ...]
block_data2 = block_data2[None, ...] block_data2 = block_data2[None, ...]
# pdb.set_trace() # 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 = 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()) min_diff = min(min_diff, block_diff.min())
max_diff = max(max_diff, block_diff.max()) 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_y = j * cell_size[1] + cell_size[1] // 2
center_x = center_x * geo[1] + geo [0] center_x = center_x * geo[1] + geo [0]
center_y = center_y * geo[5] + geo [3] 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({ self.result_ok.emit({
'layer_id': layer.id, 'layer_id': layer.id,
'csv_file': out_csv, 'csv_file': out_csv,
'raster_file': out_normal_tif
}) })
self.message_send.emit('完成计算变化表格') self.message_send.emit('完成计算变化表格')

View File

@ -21,7 +21,7 @@ class ResultTable(QtWidgets.QWidget):
self.tablewidget.setEditTriggers(QAbstractItemView.NoEditTriggers) self.tablewidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.tablewidget.cellDoubleClicked.connect(self.onDoubleClicked) 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.cellChanged.connect(self.onChanged)
# self.tablewidget.setModel(self.tableview) # self.tablewidget.setModel(self.tableview)
@ -31,26 +31,25 @@ class ResultTable(QtWidgets.QWidget):
self.setLayout(layout) self.setLayout(layout)
self.result = None self.result = None
self.is_in_set_data = False self.is_in_set_data = False
self.no_change = False
def clear(self): def clear(self):
self.tablewidget.clear() self.tablewidget.clear()
def onChanged(self, row, col): def onChanged(self, row, col):
if self.is_in_set_data: if self.is_in_set_data or self.no_change:
return return
if col == 3: if col == 3:
self.no_change = True
item_idx = row item_idx = row
item_status = self.tablewidget.item(row, col).checkState() == Qt.Checked item_status = self.tablewidget.item(row, col).checkState() == Qt.Checked
if item_status: if item_status:
self.tablewidget.item(row, col).setBackground(Qt.yellow) self.tablewidget.item(row, col).setBackground(Qt.yellow)
else: else:
self.tablewidget.item(row, col).setBackground(Qt.green) 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.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): def onDoubleClicked(self, row, col):
x = self.tablewidget.item(row, 0).text() x = self.tablewidget.item(row, 0).text()

View File

@ -5,7 +5,7 @@ import uuid
import numpy as np import numpy as np
from osgeo import gdal, gdal_array from osgeo import gdal, gdal_array
from rscder.utils.setting import Settings 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.QtCore import QObject, pyqtSignal
from PyQt5.QtGui import QColor from PyQt5.QtGui import QColor
import yaml import yaml
@ -218,7 +218,7 @@ class ResultLayer:
POINT = 0 POINT = 0
RASTER = 1 RASTER = 1
def __init__(self, name, layer_type = POINT): def __init__(self, name, parent, layer_type = POINT):
self.layer_type = layer_type self.layer_type = layer_type
self.data = None self.data = None
self.layer = None self.layer = None
@ -226,13 +226,14 @@ class ResultLayer:
self.path = None self.path = None
self.wkt = None self.wkt = None
self.enable = False self.enable = False
self.parent = parent
def update(self, data): def update(self, data):
if self.layer_type == ResultLayer.POINT: if self.layer_type == ResultLayer.POINT:
row = data['row'] row = data['row']
value = data['value'] value = data['value']
self.data[row][-1] = value self.data[row][-1] = value
self.update_point_layer() self.update_point_layer(row)
elif self.layer_type == ResultLayer.RASTER: elif self.layer_type == ResultLayer.RASTER:
pass pass
@ -249,7 +250,7 @@ class ResultLayer:
layer.setLabelsEnabled(True) layer.setLabelsEnabled(True)
lyr = QgsPalLayerSettings() lyr = QgsPalLayerSettings()
lyr.enabled = True lyr.enabled = True
lyr.fieldName = 'id' lyr.fieldName = 'fid'
lyr.placement = QgsPalLayerSettings.OverPoint lyr.placement = QgsPalLayerSettings.OverPoint
lyr.textNamedStyle = 'Medium' lyr.textNamedStyle = 'Medium'
text_format = QgsTextFormat() text_format = QgsTextFormat()
@ -268,8 +269,14 @@ class ResultLayer:
layer.setLabeling(rules) layer.setLabeling(rules)
def set_render(self, layer): def set_render(self, layer):
symbol = QgsMarkerSymbol.createSimple({'color': '#ffffff', 'size': '5'}) symbol_change = QgsMarkerSymbol.createSimple({'color': '#ffff00', 'size': 5 * self.parent.xres })
render = QgsSingleSymbolRenderer(symbol) 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) layer.setRenderer(render)
def load_point_file(self): def load_point_file(self):
@ -286,7 +293,7 @@ class ResultLayer:
else: else:
crs = QgsCoordinateReferenceSystem() crs = QgsCoordinateReferenceSystem()
uri = 'Point?crs={}'.format(crs.toProj()) uri = 'Point?crs={}&field=status:integer'.format(crs.toProj())
layer = QgsVectorLayer(uri, self.name, "memory") layer = QgsVectorLayer(uri, self.name, "memory")
if not layer.isValid(): if not layer.isValid():
Project().message_box.error('Failed to create layer') Project().message_box.error('Failed to create layer')
@ -294,38 +301,40 @@ class ResultLayer:
self.format_point_layer(layer) self.format_point_layer(layer)
layer.startEditing() layer.startEditing()
features = [] features = []
# status_index =
for i, d in enumerate(self.data): 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.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(d[0], d[1])))
point.setAttribute('status', int(d[-1]))
# point.setAttribute('id', i) # point.setAttribute('id', i)
features.append(point) features.append(point)
layer.addFeatures(features) layer.addFeatures(features)
layer.commitChanges()
self.set_render(layer) self.set_render(layer)
layer.commitChanges()
self.layer = layer self.layer = layer
def update_point_layer(self): def update_point_layer(self, row = 0):
if self.layer is None: if self.layer is None:
return return
self.layer.startEditing() self.layer.startEditing()
add_features = [] if row < 0:
delete_features = [] for i, d in enumerate(self.data):
for i, d in enumerate(self.data): feature = self.layer.getFeature(i+1)
feature = self.layer.getFeature(i+1)
if d[-1]:
if feature is None: if feature is None:
feature = QgsFeature(i) continue
feature.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(d[0], d[1]))) feature.setAttribute('status', d[-1])
# feature.setAttribute('id', i) else:
add_features.append(feature) feature = self.layer.getFeature(row+1)
else: # print(feature)
if feature is not None: if feature is None:
delete_features.append(feature.id()) return
if len(add_features) > 0: # print(feature.fields().names())
self.layer.addFeatures(add_features) # self.layer.deleteFeature(feature.id())
if len(delete_features) > 0: # del feature
self.layer.deleteFeatures(delete_features) feature.setAttribute('status', int(self.data[row][-1]))
self.layer.updateFeature(feature)
self.layer.commitChanges() self.layer.commitChanges()
@ -336,8 +345,8 @@ class ResultLayer:
self.layer = QgsRasterLayer(self.path, self.name) self.layer = QgsRasterLayer(self.path, self.name)
@staticmethod @staticmethod
def from_dict(data, root = None): def from_dict(data, parent, root = None):
result = ResultLayer(data['name'], data['layer_type']) result = ResultLayer(data['name'], parent, data['layer_type'])
result.wkt = data['wkt'] result.wkt = data['wkt']
if root is not None: if root is not None:
result.load_file(str(Path(root) / data['path'])) result.load_file(str(Path(root) / data['path']))
@ -391,7 +400,7 @@ class PairLayer:
layer.name = data['name'] layer.name = data['name']
for r in data['results']: 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']) # layer.grid_layer = GridLayer.from_dict(data['grid_layer'])
return layer return layer
def __init__(self, pth1, pth2, cell_size) -> None: def __init__(self, pth1, pth2, cell_size) -> None: