联动
This commit is contained in:
parent
da8d1f178e
commit
ef79be328c
@ -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('完成计算变化表格')
|
||||||
|
@ -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,27 +31,26 @@ 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()
|
||||||
y = self.tablewidget.item(row, 1).text()
|
y = self.tablewidget.item(row, 1).text()
|
||||||
|
@ -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:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user