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.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('完成计算变化表格')

View File

@ -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()

View File

@ -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: