add layer select tool

This commit is contained in:
copper 2022-05-24 21:56:00 +08:00
parent 0a6ced74e5
commit 3958b22a62
10 changed files with 372 additions and 66 deletions

82
draw.drawio Normal file
View File

@ -0,0 +1,82 @@
<mxfile host="65bd71144e">
<diagram id="F3ajyJGEZ5hD2tpQ_zjz" name="第 1 页">
<mxGraphModel dx="592" dy="380" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="4" value="" style="edgeStyle=none;html=1;" edge="1" parent="1" source="2" target="3">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="2" value="256*256" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="120" y="60" width="120" height="60" as="geometry"/>
</mxCell>
<mxCell id="6" value="" style="edgeStyle=none;html=1;" edge="1" parent="1" source="3" target="5">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="25" style="edgeStyle=none;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="3" target="7">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="3" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="120" y="220" width="120" height="60" as="geometry"/>
</mxCell>
<mxCell id="11" value="" style="edgeStyle=none;html=1;" edge="1" parent="1" source="5" target="10">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="5" value="64*64" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="220" y="360" width="120" height="60" as="geometry"/>
</mxCell>
<mxCell id="13" value="" style="edgeStyle=none;html=1;" edge="1" parent="1" source="7" target="12">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="7" value="16*16" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="30" y="480" width="120" height="60" as="geometry"/>
</mxCell>
<mxCell id="15" value="" style="edgeStyle=none;html=1;" edge="1" parent="1" source="10" target="14">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="10" value="16*16" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="220" y="480" width="120" height="60" as="geometry"/>
</mxCell>
<mxCell id="21" value="" style="edgeStyle=none;html=1;" edge="1" parent="1" source="12" target="20">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="12" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="30" y="620" width="120" height="60" as="geometry"/>
</mxCell>
<mxCell id="17" value="" style="edgeStyle=none;html=1;" edge="1" parent="1" source="14" target="16">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="14" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="220" y="620" width="120" height="60" as="geometry"/>
</mxCell>
<mxCell id="19" value="" style="edgeStyle=none;html=1;" edge="1" parent="1" source="16" target="18">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="16" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="220" y="760" width="120" height="60" as="geometry"/>
</mxCell>
<mxCell id="24" value="" style="edgeStyle=none;html=1;" edge="1" parent="1" source="18" target="23">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="18" value="k 16*16" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="220" y="900" width="120" height="60" as="geometry"/>
</mxCell>
<mxCell id="22" style="edgeStyle=none;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="20" target="18">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="20" value="16*16" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="30" y="770" width="120" height="60" as="geometry"/>
</mxCell>
<mxCell id="23" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="220" y="1040" width="120" height="60" as="geometry"/>
</mxCell>
<mxCell id="26" value="8" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="100" y="380" width="20" height="20" as="geometry"/>
</mxCell>
<mxCell id="27" value="8*16" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" vertex="1" parent="1">
<mxGeometry x="280" y="430" width="40" height="20" as="geometry"/>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

View File

@ -1,4 +1,4 @@
2022-05-23 21:09:46,286 - root - INFO - lic data:2022-12-01 00:00:00
2022-05-23 21:09:46,286 - root - INFO - remain_days: 191
2022-05-23 21:09:47,553 - root - INFO - lic data:2022-12-01 00:00:00
2022-05-23 21:09:47,553 - root - INFO - remain_days: 191
2022-05-24 20:29:01,454 - root - INFO - lic data:2022-12-01 00:00:00
2022-05-24 20:29:01,455 - root - INFO - remain_days: 190
2022-05-24 20:29:02,777 - root - INFO - lic data:2022-12-01 00:00:00
2022-05-24 20:29:02,777 - root - INFO - remain_days: 190

View File

@ -6,7 +6,7 @@ from PyQt5.QtWidgets import QAction, QDialog, QHBoxLayout, QVBoxLayout, QPushBut
from PyQt5.QtCore import pyqtSignal
from PyQt5.QtGui import QIcon
from rscder.utils.project import BasicLayer, Project, PairLayer, ResultPointLayer, RasterLayer
from rscder.gui.layercombox import LayerCombox
from rscder.gui.layercombox import PairLayerCombox
from osgeo import gdal, gdal_array
from threading import Thread
import numpy as np
@ -21,7 +21,7 @@ class MyDialog(QDialog):
self.setFixedWidth(500)
self.layer_select = LayerCombox(self)
self.layer_select = PairLayerCombox(self)
self.layer_select.setFixedWidth(400)
# self.number_input = QLineEdit(self)
@ -45,6 +45,9 @@ class MyDialog(QDialog):
self.setLayout(self.main_layout)
def on_ok(self):
if self.layer_select.layer1 is None or self.layer_select.layer2 is None:
self.reject()
return
self.accept()
def on_cancel(self):
@ -86,17 +89,22 @@ class BasicMethod(BasicPlugin):
def send_message(self, s):
self.message_box.info(s)
def run_basic_diff_alg(self, layer:PairLayer):
def run_basic_diff_alg(self, layer1:RasterLayer, layer2:RasterLayer):
pth1 = layer.main_l1.path
pth2 = layer.main_l2.path
pth1 = layer1.path
pth2 = layer2.path
cell_size = layer.cell_size
cell_size = layer1.layer_parent.cell_size
self.message_send.emit('开始计算差分法')
ds1 = gdal.Open(pth1)
ds2 = gdal.Open(pth2)
if not layer1.compare(layer2):
self.message_send.emit('两个图层的尺寸不同')
return
xsize = ds1.RasterXSize
ysize = ds1.RasterYSize
band = ds1.RasterCount
@ -142,7 +150,7 @@ class BasicMethod(BasicPlugin):
self.message_send.emit('归一化概率中...')
temp_in_ds = gdal.Open(out_tif)
out_normal_tif = os.path.join(Project().cmi_path, '{}-{}.tif'.format(layer.name, int(np.random.rand() * 100000)))
out_normal_tif = os.path.join(Project().cmi_path, '{}-{}.tif'.format(layer1.layer_parent.name, int(np.random.rand() * 100000)))
out_normal_ds = driver.Create(out_normal_tif, xsize, ysize, 1, gdal.GDT_Byte)
out_normal_ds.SetGeoTransform(ds1.GetGeoTransform())
out_normal_ds.SetProjection(ds1.GetProjection())
@ -175,7 +183,7 @@ class BasicMethod(BasicPlugin):
self.message_send.emit('完成归一化概率')
self.message_send.emit('计算变化表格中...')
out_csv = os.path.join(Project().bcdm_path, '{}-{}.csv'.format(layer.name, int(np.random.rand() * 100000)))
out_csv = os.path.join(Project().bcdm_path, '{}-{}.csv'.format(layer1.layer_parent.name, int(np.random.rand() * 100000)))
xblocks = xsize // cell_size[0]
normal_in_ds = gdal.Open(out_normal_tif)
@ -202,11 +210,11 @@ class BasicMethod(BasicPlugin):
f.write(f'{center_x},{center_y},{block_data_xy.mean() / 255 * 100},1\n')
point_result_lalyer = ResultPointLayer(out_csv, enable=False, proj = layer.proj, geo = layer.geo)
point_result_lalyer = ResultPointLayer(out_csv, enable=False, proj = layer1.proj, geo = layer1.geo)
raster_result_layer = RasterLayer(None, True, out_normal_tif, BasicLayer.BOATH_VIEW)
layer.add_result_layer(point_result_lalyer)
layer.add_result_layer(raster_result_layer)
layer1.layer_parent.add_result_layer(point_result_lalyer)
layer1.layer_parent.add_result_layer(raster_result_layer)
self.message_send.emit('完成计算变化表格')
@ -214,18 +222,18 @@ class BasicMethod(BasicPlugin):
def basic_diff_alg(self):
# layer_select =
layer = None
layer_select = MyDialog(self.mainwindow)
if(layer_select.exec_()):
layer = layer_select.layer_select.current_layer
if layer_select.exec_():
layer1 = layer_select.layer_select.layer1
layer2 = layer_select.layer_select.layer2
else:
return
# layer:PairLayer = list(self.project.layers.values())[0]
if not layer.check():
return
t = Thread(target=self.run_basic_diff_alg, args=(layer,))
t = Thread(target=self.run_basic_diff_alg, args=(layer1, layer2))
t.start()

View File

@ -18,4 +18,11 @@
module: export_to
name: ExportTo
path: ./plugin\export_to
version: 1.0.0
- author: RSCDER
description: MeanFilter
enabled: true
module: some_filter
name: MeanFilter
path: ./plugin\some_filter
version: 1.0.0

View File

@ -0,0 +1 @@
from some_filter.main import *

135
plugins/some_filter/main.py Normal file
View File

@ -0,0 +1,135 @@
import os
from threading import Thread
from PyQt5.QtWidgets import QDialog, QAction
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt, QModelIndex, pyqtSignal
from rscder.utils.project import PairLayer, Project, RasterLayer, ResultPointLayer
from rscder.plugins.basic import BasicPlugin
from rscder.gui.layercombox import RasterLayerCombox
from osgeo import gdal, gdal_array
from skimage.filters import rank
from skimage.morphology import disk, rectangle
class FilterSetting(QDialog):
def __init__(self, parent=None):
super(FilterSetting, self).__init__(parent)
self.setWindowTitle('Filter Setting')
# self.setWindowFlags(Qt.WindowStaysOnTopHint)
self.setFixedSize(300, 200)
# self.setStyleSheet("QDialog{background-color:rgb(255,255,255);}")
self.setWindowIcon(QtGui.QIcon(':/plugins/some_filter/icon.png'))
self.setWindowIconText('Filter Setting')
# self.setWindowModality(Qt.ApplicationModal)
self.initUI()
# self.show()
def initUI(self):
self.layer_combox = RasterLayerCombox(self)
layer_label = QtWidgets.QLabel('图层:')
hbox = QtWidgets.QHBoxLayout()
hbox.addWidget(layer_label)
hbox.addWidget(self.layer_combox)
x_size_input = QtWidgets.QLineEdit(self)
x_size_input.setText('3')
y_size_input = QtWidgets.QLineEdit(self)
y_size_input.setText('3')
size_label = QtWidgets.QLabel(self)
size_label.setText('窗口大小:')
time_label = QtWidgets.QLabel(self)
time_label.setText('X')
self.x_size_input = x_size_input
self.y_size_input = y_size_input
hlayout1 = QtWidgets.QHBoxLayout()
hlayout1.addWidget(size_label)
hlayout1.addWidget(x_size_input)
hlayout1.addWidget(time_label)
hlayout1.addWidget(y_size_input)
ok_button = QtWidgets.QPushButton(self)
ok_button.setText('确定')
ok_button.clicked.connect(self.accept)
cancel_button = QtWidgets.QPushButton(self)
cancel_button.setText('取消')
cancel_button.clicked.connect(self.reject)
hlayout2 = QtWidgets.QHBoxLayout()
hlayout2.addWidget(ok_button)
hlayout2.addWidget(cancel_button)
vlayout = QtWidgets.QVBoxLayout()
vlayout.addLayout(hbox)
vlayout.addLayout(hlayout1)
vlayout.addLayout(hlayout2)
self.setLayout(vlayout)
class MainPlugin(BasicPlugin):
alg_ok = pyqtSignal(PairLayer, RasterLayer)
@staticmethod
def info():
return {
'name': 'mean_filter',
'author': 'rscder',
'version': '0.0.1',
'description': 'Mean Filter'
}
def set_action(self):
self.action = QAction('均值滤波', self.mainwindow)
# self.action.setCheckable)
# self.action.setChecked(False)
self.action.triggered.connect(self.run)
self.ctx['basic_menu'].addAction(self.action)
self.alg_ok.connect(self.alg_oked)
# basic
def alg_oked(self, parent, layer:RasterLayer):
parent.add_result_layer(layer)
def run_alg(self, layer:RasterLayer, x_size, y_size, method='mean'):
x_size = int(x_size)
y_size = int(y_size)
pth = layer.path
if pth is None:
return
ds = gdal.Open(pth)
band_count = ds.RasterCount
out_path = os.path.join(Project().other_path, '{}_mean_filter.tif'.format(layer.name))
out_ds = gdal.GetDriverByName('GTiff').Create(out_path, ds.RasterXSize, ds.RasterYSize, band_count, ds.GetRasterBand(1).DataType)
out_ds.SetProjection(ds.GetProjection())
out_ds.SetGeoTransform(ds.GetGeoTransform())
for i in range(band_count):
band = ds.GetRasterBand(i+1)
data = band.ReadAsArray()
data = rank.mean(data, rectangle(y_size, x_size))
out_band = out_ds.GetRasterBand(i+1)
out_band.WriteArray(data)
out_ds.FlushCache()
del out_ds
del ds
rlayer = RasterLayer(path = out_path, enable= True, view_mode = layer.view_mode )
self.alg_ok.emit(layer.layer_parent, rlayer)
def run(self):
dialog = FilterSetting(self.mainwindow)
dialog.show()
if dialog.exec_():
x_size = int(dialog.x_size_input.text())
y_size = int(dialog.y_size_input.text())
t = Thread(target=self.run_alg, args=(dialog.layer_combox.current_layer, x_size, y_size))
t.start()

View File

@ -1,6 +1,6 @@
from PyQt5.QtWidgets import QComboBox
from PyQt5.QtWidgets import QComboBox, QWidget, QLabel, QHBoxLayout, QVBoxLayout
from PyQt5.QtGui import QIcon
from rscder.utils.project import Project
from rscder.utils.project import Project, RasterLayer, ResultPointLayer
class LayerCombox(QComboBox):
def __init__(self, parent=None):
@ -23,4 +23,117 @@ class LayerCombox(QComboBox):
self.current_layer = None
else:
self.current_layer = Project().layers[self.itemData(index)]
class PairLayerCombox(QWidget):
def __init__(self, parent=None) -> None:
super().__init__(parent)
self.layer1 = None
self.layer2 = None
self.initUI()
def initUI(self):
self.layer_combox = LayerCombox(self)
layer_label = QLabel('图层组:')
hbox = QHBoxLayout()
hbox.addWidget(layer_label)
hbox.addWidget(self.layer_combox)
self.raster_layer1 = QComboBox(self)
self.raster_layer1.addItem('---', None)
self.raster_layer2 = QComboBox(self)
self.raster_layer2.addItem('---', None)
self.raster_layer1.currentIndexChanged.connect(self.on_raster_layer1_changed)
self.raster_layer2.currentIndexChanged.connect(self.on_raster_layer2_changed)
self.layer_combox.currentIndexChanged.connect(self.on_group_changed)
self.setLayout(hbox)
def on_raster_layer1_changed(self, index):
if index == 0:
self.layer1 = None
else:
self.layer1 = self.raster_layer1.itemData(index)
def on_raster_layer2_changed(self, index):
if index == 0:
self.layer2 = None
else:
self.layer2 = self.raster_layer2.itemData(index)
def on_group_changed(self, index):
if index == 0:
self.raster_layer1.clear()
self.raster_layer2.clear()
self.raster_layer1.addItem('---', None)
self.raster_layer2.addItem('---', None)
else:
self.raster_layer1.clear()
self.raster_layer2.clear()
self.raster_layer1.addItem('---', None)
self.raster_layer2.addItem('---', None)
for sub in self.layer_combox.current_layer.layers:
if isinstance(sub, RasterLayer):
self.raster_layer1.addItem(QIcon(':/icons/layer.png'), sub.name, sub)
self.raster_layer2.addItem(QIcon(':/icons/layer.png'), sub.name, sub)
class RasterLayerCombox(QComboBox):
def __init__(self, parent=None, layer=None):
super().__init__(parent)
self.addItem('---', None)
if layer is not None:
for sub in layer.layers:
if isinstance(sub, RasterLayer):
self.addItem(sub.name, sub)
else:
for layer in Project().layers.values():
for sub in layer.layers:
if isinstance(sub, RasterLayer):
self.addItem(sub.name, sub)
# self.addItem(layer.name, layer.id)
for i in range(self.count() - 1):
self.setItemIcon(i + 1, QIcon(':/icons/layer.png'))
self.currentIndexChanged.connect(self.on_changed)
self.current_layer = None
def on_changed(self, index):
if index == 0:
self.current_layer = None
else:
self.current_layer = self.itemData(index)
class ResultPointLayerCombox(QComboBox):
def __init__(self, parent=None):
super().__init__(parent)
self.addItem('---', None)
for layer in Project().layers.values():
for sub in layer.layers:
if isinstance(sub, ResultPointLayer):
self.addItem(sub.name, sub)
for i in range(self.count() - 1):
self.setItemIcon(i + 1, QIcon(':/icons/layer.png'))
self.currentIndexChanged.connect(self.on_changed)
self.current_layer = None
def on_changed(self, index):
if index == 0:
self.current_layer = None
else:
self.current_layer = self.itemData(index)

View File

@ -124,32 +124,6 @@ class DoubleCanvas(QWidget):
self.mapcanva1.setLayers(layer_list_1)
self.mapcanva2.setLayers(layer_list_2)
def add_layer(self, layer:str):
if not layer in Project().layers:
self.clear()
return
layer:PairLayer = Project().layers[layer]
if not layer.enable:
return
# self.clear()
if not self.mapcanva1.is_main and not self.mapcanva2.is_main:
self.mapcanva1.is_main = True
if layer.l1_enable:
self.mapcanva1.add_layer(layer.l1)
if layer.l2_enable:
self.mapcanva2.add_layer(layer.l2)
if layer.grid_enable and self.grid_show:
self.mapcanva1.add_grid_layer(layer.grid_layer.grid_layer)
self.mapcanva2.add_grid_layer(layer.grid_layer.grid_layer)
for r in layer.results:
if r.enable:
self.mapcanva1.add_layer(r.layer)
self.mapcanva2.add_layer(r.layer)
# self.mapcanva1.set_extent(layer.l1.extent())
self.mapcanva1.refresh()
self.mapcanva2.refresh()
def zoom_to_extent(self, extent):
# extent = QgsRectangle(x - layer.cell_size[0] * layer.xres, y - layer.cell_size[1] * layer.yres, x + layer.cell_size[0] * layer.xres, y + layer.cell_size[1] * layer.yres)
@ -159,8 +133,6 @@ class DoubleCanvas(QWidget):
def zoom_to_layer(self, layer):
self.mapcanva1.set_extent(layer.extent())
self.mapcanva2.set_extent(layer.extent())
def layer_changed(self, layer:str):
self.add_layer(layer)
def clear(self):
self.mapcanva1.clear()

View File

@ -369,7 +369,8 @@ class GridLayer(BasicLayer):
class RasterLayer(BasicLayer):
def __init__(self, name=None, enable=False, path=None, view_mode=BasicLayer.BOATH_VIEW):
def __init__(self, name=None, enable=False, path=None,
view_mode=BasicLayer.BOATH_VIEW):
if name is None:
name = os.path.splitext(os.path.basename(path))[0]
super().__init__(name, enable, ':/icons/raster.png', path, BasicLayer.IN_FILE, view_mode)

View File

@ -162,17 +162,4 @@ class Settings(QSettings):
value = value is not None
with Settings(Settings.General.PRE) as s:
s.setValue('auto_save', value)
@property
def auto_save_intervel(self):
with Settings(Settings.General.PRE) as s:
return s.value('auto_save_intervel', 30)
@auto_save_intervel.setter
def auto_save_intervel(self, value):
if isinstance(value, int) and value > 0:
pass
else:
return
with Settings(Settings.General.PRE) as s:
s.setValue('auto_save_intervel', value)