联动
This commit is contained in:
parent
da8d1f178e
commit
ef79be328c
@ -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('完成计算变化表格')
|
||||
|
@ -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()
|
||||
|
@ -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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user