fix lamdba bug; change to partial
This commit is contained in:
		
							parent
							
								
									3a252ce77f
								
							
						
					
					
						commit
						ad140f479c
					
				@ -1,3 +1,4 @@
 | 
				
			|||||||
 | 
					from functools import partial
 | 
				
			||||||
from threading import Thread
 | 
					from threading import Thread
 | 
				
			||||||
from rscder.plugins.basic import BasicPlugin
 | 
					from rscder.plugins.basic import BasicPlugin
 | 
				
			||||||
from rscder.utils.icons import IconInstance
 | 
					from rscder.utils.icons import IconInstance
 | 
				
			||||||
@ -65,7 +66,8 @@ class FollowPlugin(BasicPlugin):
 | 
				
			|||||||
            combox.addItem(name, key)
 | 
					            combox.addItem(name, key)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            action = QtWidgets.QAction(alg.get_icon(), name, self.mainwindow)
 | 
					            action = QtWidgets.QAction(alg.get_icon(), name, self.mainwindow)
 | 
				
			||||||
            action.triggered.connect(lambda : self.run_dialog(alg))
 | 
					            func = partial(self.run_dialog, alg)
 | 
				
			||||||
 | 
					            action.triggered.connect(func)
 | 
				
			||||||
            toolbar.addAction(action)
 | 
					            toolbar.addAction(action)
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -138,7 +140,7 @@ class FollowPlugin(BasicPlugin):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            params = alg.get_params(dialog.widget)
 | 
					            params = alg.get_params(dialog.widget)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            t = Thread(target=self.run_alg, args = (params,))
 | 
					            t = Thread(target=self.run_alg, args = (alg, params,))
 | 
				
			||||||
            t.start()
 | 
					            t.start()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -33,6 +33,13 @@
 | 
				
			|||||||
  name: UnsupervisedPlugin
 | 
					  name: UnsupervisedPlugin
 | 
				
			||||||
  path: ./plugin\unsupervsied_method
 | 
					  path: ./plugin\unsupervsied_method
 | 
				
			||||||
  version: 1.0.0
 | 
					  version: 1.0.0
 | 
				
			||||||
 | 
					- author: RSCDER
 | 
				
			||||||
 | 
					  description: VegatationPlugin
 | 
				
			||||||
 | 
					  enabled: true
 | 
				
			||||||
 | 
					  module: veg_method
 | 
				
			||||||
 | 
					  name: VegatationPlugin
 | 
				
			||||||
 | 
					  path: ./plugin\veg_method
 | 
				
			||||||
 | 
					  version: 1.0.0
 | 
				
			||||||
- author: RSCDER
 | 
					- author: RSCDER
 | 
				
			||||||
  description: set Change Rate
 | 
					  description: set Change Rate
 | 
				
			||||||
  enabled: true
 | 
					  enabled: true
 | 
				
			||||||
 | 
				
			|||||||
@ -1,3 +1,4 @@
 | 
				
			|||||||
 | 
					from functools import partial
 | 
				
			||||||
from threading import Thread
 | 
					from threading import Thread
 | 
				
			||||||
from plugins.misc.main import AlgFrontend
 | 
					from plugins.misc.main import AlgFrontend
 | 
				
			||||||
from rscder.gui.actions import ActionManager
 | 
					from rscder.gui.actions import ActionManager
 | 
				
			||||||
@ -152,8 +153,6 @@ class UnsupervisedCDFollow(AlgFrontend):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        cdpth = cdalg.run_alg(pth1, pth2, layer1.layer_parent,  send_message= send_message,**cdparams)
 | 
					        cdpth = cdalg.run_alg(pth1, pth2, layer1.layer_parent,  send_message= send_message,**cdparams)
 | 
				
			||||||
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
        thpth = thalg.run_alg(cdpth, name=name, send_message= send_message, **thparams)
 | 
					        thpth = thalg.run_alg(cdpth, name=name, send_message= send_message, **thparams)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        table_layer(thpth,layer1,name, send_message)
 | 
					        table_layer(thpth,layer1,name, send_message)
 | 
				
			||||||
@ -186,12 +185,14 @@ class UnsupervisedPlugin(BasicPlugin):
 | 
				
			|||||||
                name = alg.get_name()
 | 
					                name = alg.get_name()
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
            action = QAction(name, unsupervised_menu)
 | 
					            action = QAction(name, unsupervised_menu)
 | 
				
			||||||
            action.triggered.connect(lambda : self.run_cd(alg))
 | 
					            func = partial(self.run_cd, alg)
 | 
				
			||||||
 | 
					            action.triggered.connect(func)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            unsupervised_menu.addAction(action)
 | 
					            unsupervised_menu.addAction(action)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def run_cd(self, alg):
 | 
					    def run_cd(self, alg):
 | 
				
			||||||
 | 
					        print(alg.get_name())
 | 
				
			||||||
        dialog = UnsupervisedCDMethod(self.mainwindow, alg)
 | 
					        dialog = UnsupervisedCDMethod(self.mainwindow, alg)
 | 
				
			||||||
        dialog.show()
 | 
					        dialog.show()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -208,7 +209,7 @@ class UnsupervisedPlugin(BasicPlugin):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        falg, fparams =  w.filter_select.get_alg_and_params()
 | 
					        falg, fparams =  w.filter_select.get_alg_and_params()
 | 
				
			||||||
        cdalg = w.alg
 | 
					        cdalg = w.alg
 | 
				
			||||||
        cdparams = w.alg.get_params()
 | 
					        cdparams = w.alg.get_params(w.param_widget)
 | 
				
			||||||
        thalg, thparams = w.thres_select.get_alg_and_params()
 | 
					        thalg, thparams = w.thres_select.get_alg_and_params()
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        if cdalg is None or thalg is None:
 | 
					        if cdalg is None or thalg is None:
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										1
									
								
								plugins/veg_method/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								plugins/veg_method/__init__.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					from veg_method.main import *
 | 
				
			||||||
							
								
								
									
										226
									
								
								plugins/veg_method/main.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										226
									
								
								plugins/veg_method/main.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,226 @@
 | 
				
			|||||||
 | 
					from functools import partial
 | 
				
			||||||
 | 
					from threading import Thread
 | 
				
			||||||
 | 
					from plugins.misc.main import AlgFrontend
 | 
				
			||||||
 | 
					from rscder.gui.actions import ActionManager
 | 
				
			||||||
 | 
					from rscder.plugins.basic import BasicPlugin
 | 
				
			||||||
 | 
					from PyQt5.QtWidgets import QAction, QToolBar,  QMenu, QDialog, QHBoxLayout, QVBoxLayout, QPushButton,QWidget,QLabel,QLineEdit,QPushButton,QComboBox,QDialogButtonBox
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from rscder.gui.layercombox import PairLayerCombox
 | 
				
			||||||
 | 
					from rscder.utils.icons import IconInstance
 | 
				
			||||||
 | 
					from filter_collection import FILTER
 | 
				
			||||||
 | 
					from .scripts import VEG_CD
 | 
				
			||||||
 | 
					from thres import THRES
 | 
				
			||||||
 | 
					from misc import table_layer, AlgSelectWidget
 | 
				
			||||||
 | 
					from follow import FOLLOW
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class VegtationCDMethod(QDialog):
 | 
				
			||||||
 | 
					    def __init__(self,parent=None, alg:AlgFrontend=None):
 | 
				
			||||||
 | 
					        super(VegtationCDMethod, self).__init__(parent)
 | 
				
			||||||
 | 
					        self.alg = alg
 | 
				
			||||||
 | 
					        self.setWindowTitle('植被变化检测:{}'.format(alg.get_name()))
 | 
				
			||||||
 | 
					        self.setWindowIcon(IconInstance().LOGO)
 | 
				
			||||||
 | 
					        self.initUI()
 | 
				
			||||||
 | 
					        self.setMinimumWidth(500)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def initUI(self):
 | 
				
			||||||
 | 
					        #图层
 | 
				
			||||||
 | 
					        self.layer_combox = PairLayerCombox(self)
 | 
				
			||||||
 | 
					        layerbox = QHBoxLayout()
 | 
				
			||||||
 | 
					        layerbox.addWidget(self.layer_combox)
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        self.filter_select = AlgSelectWidget(self, FILTER)
 | 
				
			||||||
 | 
					        self.param_widget = self.alg.get_widget(self)
 | 
				
			||||||
 | 
					        self.unsupervised_menu = self.param_widget
 | 
				
			||||||
 | 
					        self.thres_select = AlgSelectWidget(self, THRES)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.ok_button = QPushButton('确定', self)
 | 
				
			||||||
 | 
					        self.ok_button.setIcon(IconInstance().OK)
 | 
				
			||||||
 | 
					        self.ok_button.clicked.connect(self.accept)
 | 
				
			||||||
 | 
					        self.ok_button.setDefault(True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.cancel_button = QPushButton('取消', self)
 | 
				
			||||||
 | 
					        self.cancel_button.setIcon(IconInstance().CANCEL)
 | 
				
			||||||
 | 
					        self.cancel_button.clicked.connect(self.reject)
 | 
				
			||||||
 | 
					        self.cancel_button.setDefault(False)
 | 
				
			||||||
 | 
					        buttonbox=QDialogButtonBox(self)
 | 
				
			||||||
 | 
					        buttonbox.addButton(self.ok_button,QDialogButtonBox.NoRole)
 | 
				
			||||||
 | 
					        buttonbox.addButton(self.cancel_button,QDialogButtonBox.NoRole)
 | 
				
			||||||
 | 
					        buttonbox.setCenterButtons(True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        totalvlayout=QVBoxLayout()
 | 
				
			||||||
 | 
					        totalvlayout.addLayout(layerbox)
 | 
				
			||||||
 | 
					        totalvlayout.addWidget(self.filter_select)
 | 
				
			||||||
 | 
					        if self.param_widget is not None:
 | 
				
			||||||
 | 
					            totalvlayout.addWidget(self.param_widget)
 | 
				
			||||||
 | 
					        totalvlayout.addWidget(self.thres_select)
 | 
				
			||||||
 | 
					        totalvlayout.addStretch(1)
 | 
				
			||||||
 | 
					        hbox = QHBoxLayout()
 | 
				
			||||||
 | 
					        hbox.addStretch(1)
 | 
				
			||||||
 | 
					        hbox.addWidget(buttonbox)
 | 
				
			||||||
 | 
					        totalvlayout.addLayout(hbox)
 | 
				
			||||||
 | 
					        # totalvlayout.addStretch()
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        self.setLayout(totalvlayout)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@FOLLOW.register
 | 
				
			||||||
 | 
					class VegetationCDFollow(AlgFrontend):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_name():
 | 
				
			||||||
 | 
					        return '植被变化检测'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_icon():
 | 
				
			||||||
 | 
					        return IconInstance().UNSUPERVISED
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_widget(parent=None):
 | 
				
			||||||
 | 
					        widget = QWidget(parent)
 | 
				
			||||||
 | 
					        layer_combox = PairLayerCombox(widget)
 | 
				
			||||||
 | 
					        layer_combox.setObjectName('layer_combox')
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        filter_select = AlgSelectWidget(widget, FILTER)
 | 
				
			||||||
 | 
					        filter_select.setObjectName('filter_select')
 | 
				
			||||||
 | 
					        unsupervised_select = AlgSelectWidget(widget, VEG_CD)
 | 
				
			||||||
 | 
					        unsupervised_select.setObjectName('unsupervised_select')
 | 
				
			||||||
 | 
					        thres_select = AlgSelectWidget(widget, THRES)
 | 
				
			||||||
 | 
					        thres_select.setObjectName('thres_select')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        totalvlayout=QVBoxLayout()
 | 
				
			||||||
 | 
					        totalvlayout.addWidget(layer_combox)
 | 
				
			||||||
 | 
					        totalvlayout.addWidget(filter_select)
 | 
				
			||||||
 | 
					        totalvlayout.addWidget(unsupervised_select)
 | 
				
			||||||
 | 
					        totalvlayout.addWidget(thres_select)
 | 
				
			||||||
 | 
					        totalvlayout.addStretch()
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        widget.setLayout(totalvlayout)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return widget
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_params(widget:QWidget=None):
 | 
				
			||||||
 | 
					        if widget is None:
 | 
				
			||||||
 | 
					            return dict()
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        layer_combox = widget.findChild(PairLayerCombox, 'layer_combox')
 | 
				
			||||||
 | 
					        filter_select = widget.findChild(AlgSelectWidget, 'filter_select')
 | 
				
			||||||
 | 
					        unsupervised_select = widget.findChild(AlgSelectWidget, 'unsupervised_select')
 | 
				
			||||||
 | 
					        thres_select = widget.findChild(AlgSelectWidget, 'thres_select')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        layer1=layer_combox.layer1        
 | 
				
			||||||
 | 
					        pth1 = layer_combox.layer1.path
 | 
				
			||||||
 | 
					        pth2 = layer_combox.layer2.path
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        falg, fparams =  filter_select.get_alg_and_params()
 | 
				
			||||||
 | 
					        cdalg, cdparams = unsupervised_select.get_alg_and_params()
 | 
				
			||||||
 | 
					        thalg, thparams = thres_select.get_alg_and_params()
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        if cdalg is None or thalg is None:
 | 
				
			||||||
 | 
					            return dict()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return dict(
 | 
				
			||||||
 | 
					            layer1=layer1,
 | 
				
			||||||
 | 
					            pth1 = pth1,
 | 
				
			||||||
 | 
					            pth2 = pth2,
 | 
				
			||||||
 | 
					            falg = falg,
 | 
				
			||||||
 | 
					            fparams = fparams,
 | 
				
			||||||
 | 
					            cdalg = cdalg,
 | 
				
			||||||
 | 
					            cdparams = cdparams,
 | 
				
			||||||
 | 
					            thalg = thalg,
 | 
				
			||||||
 | 
					            thparams = thparams,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def run_alg(layer1=None,
 | 
				
			||||||
 | 
					            pth1 = None,
 | 
				
			||||||
 | 
					            pth2 = None,
 | 
				
			||||||
 | 
					            falg = None,
 | 
				
			||||||
 | 
					            fparams = None,
 | 
				
			||||||
 | 
					            cdalg = None,
 | 
				
			||||||
 | 
					            cdparams = None,
 | 
				
			||||||
 | 
					            thalg = None,
 | 
				
			||||||
 | 
					            thparams = None,
 | 
				
			||||||
 | 
					            send_message = None):
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        if cdalg is None or thalg is None:
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        name = layer1.name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if falg is not None:
 | 
				
			||||||
 | 
					            pth1 = falg.run_alg(pth1, name=name, send_message= send_message, **fparams)
 | 
				
			||||||
 | 
					            pth2 = falg.run_alg(pth2, name=name, send_message= send_message, **fparams)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        cdpth = cdalg.run_alg(pth1, pth2, layer1.layer_parent,  send_message= send_message,**cdparams)
 | 
				
			||||||
 | 
					        thpth = thalg.run_alg(cdpth, name=name, send_message= send_message, **thparams)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        table_layer(thpth,layer1,name, send_message)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class VegtationPlugin(BasicPlugin):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def info():
 | 
				
			||||||
 | 
					        return {
 | 
				
			||||||
 | 
					            'name': 'VegtationPlugin',
 | 
				
			||||||
 | 
					            'description': 'VegtationPlugin',
 | 
				
			||||||
 | 
					            'author': 'RSCDER',
 | 
				
			||||||
 | 
					            'version': '1.0.0',
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def set_action(self):
 | 
				
			||||||
 | 
					        veg_menu = ActionManager().veg_menu
 | 
				
			||||||
 | 
					        # veg_menu.setIcon(IconInstance().UNSUPERVISED)
 | 
				
			||||||
 | 
					        # ActionManager().veg_menu.addMenu(veg_menu)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for key in VEG_CD.keys():
 | 
				
			||||||
 | 
					            alg:AlgFrontend = VEG_CD[key]
 | 
				
			||||||
 | 
					            if alg.get_name() is None:
 | 
				
			||||||
 | 
					                name = key
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                name = alg.get_name()
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            action = QAction(name, veg_menu)
 | 
				
			||||||
 | 
					            func = partial(self.run_cd, alg)
 | 
				
			||||||
 | 
					            action.triggered.connect(func)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            veg_menu.addAction(action)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def run_cd(self, alg):
 | 
				
			||||||
 | 
					        dialog = VegtationCDMethod(self.mainwindow, alg)
 | 
				
			||||||
 | 
					        dialog.show()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if dialog.exec_() == QDialog.Accepted:
 | 
				
			||||||
 | 
					            t = Thread(target=self.run_cd_alg, args=(dialog,))
 | 
				
			||||||
 | 
					            t.start()
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    def run_cd_alg(self, w:VegtationCDMethod):
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        layer1=w.layer_combox.layer1        
 | 
				
			||||||
 | 
					        pth1 = w.layer_combox.layer1.path
 | 
				
			||||||
 | 
					        pth2 = w.layer_combox.layer2.path
 | 
				
			||||||
 | 
					        name = layer1.layer_parent.name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        falg, fparams =  w.filter_select.get_alg_and_params()
 | 
				
			||||||
 | 
					        cdalg = w.alg
 | 
				
			||||||
 | 
					        cdparams = w.alg.get_params()
 | 
				
			||||||
 | 
					        thalg, thparams = w.thres_select.get_alg_and_params()
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        if cdalg is None or thalg is None:
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if falg is not None:
 | 
				
			||||||
 | 
					            pth1 = falg.run_alg(pth1, name=name, send_message=self.send_message, **fparams)
 | 
				
			||||||
 | 
					            pth2 = falg.run_alg(pth2, name=name, send_message=self.send_message, **fparams)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        cdpth = cdalg.run_alg(pth1, pth2, layer1.layer_parent,  send_message=self.send_message,**cdparams)
 | 
				
			||||||
 | 
					        thpth = thalg.run_alg(cdpth, name=name, send_message=self.send_message, **thparams)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        table_layer(thpth,layer1,name,self.send_message)
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
							
								
								
									
										455
									
								
								plugins/veg_method/pic.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										455
									
								
								plugins/veg_method/pic.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,455 @@
 | 
				
			|||||||
 | 
					# -*- coding: utf-8 -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Resource object code
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Created by: The Resource Compiler for PyQt5 (Qt v5.12.9)
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# WARNING! All changes made in this file will be lost!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from PyQt5 import QtCore
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					qt_resource_data = b"\
 | 
				
			||||||
 | 
					\x00\x00\x05\x32\
 | 
				
			||||||
 | 
					\x3c\
 | 
				
			||||||
 | 
					\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
 | 
				
			||||||
 | 
					\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\
 | 
				
			||||||
 | 
					\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\
 | 
				
			||||||
 | 
					\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\
 | 
				
			||||||
 | 
					\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\
 | 
				
			||||||
 | 
					\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\
 | 
				
			||||||
 | 
					\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\x53\
 | 
				
			||||||
 | 
					\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\x31\
 | 
				
			||||||
 | 
					\x2e\x64\x74\x64\x22\x3e\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x36\
 | 
				
			||||||
 | 
					\x35\x35\x31\x30\x35\x33\x34\x38\x31\x31\x38\x22\x20\x63\x6c\x61\
 | 
				
			||||||
 | 
					\x73\x73\x3d\x22\x69\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\
 | 
				
			||||||
 | 
					\x78\x3d\x22\x30\x20\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\
 | 
				
			||||||
 | 
					\x22\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\
 | 
				
			||||||
 | 
					\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
 | 
				
			||||||
 | 
					\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\
 | 
				
			||||||
 | 
					\x67\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x31\x33\x37\x22\x20\x78\
 | 
				
			||||||
 | 
					\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\
 | 
				
			||||||
 | 
					\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\
 | 
				
			||||||
 | 
					\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x77\x69\x64\x74\x68\x3d\
 | 
				
			||||||
 | 
					\x22\x31\x32\x38\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x32\
 | 
				
			||||||
 | 
					\x38\x22\x3e\x3c\x64\x65\x66\x73\x3e\x3c\x73\x74\x79\x6c\x65\x20\
 | 
				
			||||||
 | 
					\x74\x79\x70\x65\x3d\x22\x74\x65\x78\x74\x2f\x63\x73\x73\x22\x3e\
 | 
				
			||||||
 | 
					\x40\x66\x6f\x6e\x74\x2d\x66\x61\x63\x65\x20\x7b\x20\x66\x6f\x6e\
 | 
				
			||||||
 | 
					\x74\x2d\x66\x61\x6d\x69\x6c\x79\x3a\x20\x66\x65\x65\x64\x62\x61\
 | 
				
			||||||
 | 
					\x63\x6b\x2d\x69\x63\x6f\x6e\x66\x6f\x6e\x74\x3b\x20\x73\x72\x63\
 | 
				
			||||||
 | 
					\x3a\x20\x75\x72\x6c\x28\x22\x2f\x2f\x61\x74\x2e\x61\x6c\x69\x63\
 | 
				
			||||||
 | 
					\x64\x6e\x2e\x63\x6f\x6d\x2f\x74\x2f\x66\x6f\x6e\x74\x5f\x31\x30\
 | 
				
			||||||
 | 
					\x33\x31\x31\x35\x38\x5f\x75\x36\x39\x77\x38\x79\x68\x78\x64\x75\
 | 
				
			||||||
 | 
					\x2e\x77\x6f\x66\x66\x32\x3f\x74\x3d\x31\x36\x33\x30\x30\x33\x33\
 | 
				
			||||||
 | 
					\x37\x35\x39\x39\x34\x34\x22\x29\x20\x66\x6f\x72\x6d\x61\x74\x28\
 | 
				
			||||||
 | 
					\x22\x77\x6f\x66\x66\x32\x22\x29\x2c\x20\x75\x72\x6c\x28\x22\x2f\
 | 
				
			||||||
 | 
					\x2f\x61\x74\x2e\x61\x6c\x69\x63\x64\x6e\x2e\x63\x6f\x6d\x2f\x74\
 | 
				
			||||||
 | 
					\x2f\x66\x6f\x6e\x74\x5f\x31\x30\x33\x31\x31\x35\x38\x5f\x75\x36\
 | 
				
			||||||
 | 
					\x39\x77\x38\x79\x68\x78\x64\x75\x2e\x77\x6f\x66\x66\x3f\x74\x3d\
 | 
				
			||||||
 | 
					\x31\x36\x33\x30\x30\x33\x33\x37\x35\x39\x39\x34\x34\x22\x29\x20\
 | 
				
			||||||
 | 
					\x66\x6f\x72\x6d\x61\x74\x28\x22\x77\x6f\x66\x66\x22\x29\x2c\x20\
 | 
				
			||||||
 | 
					\x75\x72\x6c\x28\x22\x2f\x2f\x61\x74\x2e\x61\x6c\x69\x63\x64\x6e\
 | 
				
			||||||
 | 
					\x2e\x63\x6f\x6d\x2f\x74\x2f\x66\x6f\x6e\x74\x5f\x31\x30\x33\x31\
 | 
				
			||||||
 | 
					\x31\x35\x38\x5f\x75\x36\x39\x77\x38\x79\x68\x78\x64\x75\x2e\x74\
 | 
				
			||||||
 | 
					\x74\x66\x3f\x74\x3d\x31\x36\x33\x30\x30\x33\x33\x37\x35\x39\x39\
 | 
				
			||||||
 | 
					\x34\x34\x22\x29\x20\x66\x6f\x72\x6d\x61\x74\x28\x22\x74\x72\x75\
 | 
				
			||||||
 | 
					\x65\x74\x79\x70\x65\x22\x29\x3b\x20\x7d\x0a\x3c\x2f\x73\x74\x79\
 | 
				
			||||||
 | 
					\x6c\x65\x3e\x3c\x2f\x64\x65\x66\x73\x3e\x3c\x70\x61\x74\x68\x20\
 | 
				
			||||||
 | 
					\x64\x3d\x22\x4d\x33\x31\x32\x2e\x38\x38\x38\x38\x38\x39\x20\x39\
 | 
				
			||||||
 | 
					\x39\x35\x2e\x35\x35\x35\x35\x35\x36\x63\x2d\x31\x37\x2e\x30\x36\
 | 
				
			||||||
 | 
					\x36\x36\x36\x37\x20\x30\x2d\x32\x38\x2e\x34\x34\x34\x34\x34\x34\
 | 
				
			||||||
 | 
					\x2d\x35\x2e\x36\x38\x38\x38\x38\x39\x2d\x33\x39\x2e\x38\x32\x32\
 | 
				
			||||||
 | 
					\x32\x32\x32\x2d\x31\x37\x2e\x30\x36\x36\x36\x36\x37\x2d\x32\x32\
 | 
				
			||||||
 | 
					\x2e\x37\x35\x35\x35\x35\x36\x2d\x32\x32\x2e\x37\x35\x35\x35\x35\
 | 
				
			||||||
 | 
					\x36\x2d\x31\x37\x2e\x30\x36\x36\x36\x36\x37\x2d\x35\x36\x2e\x38\
 | 
				
			||||||
 | 
					\x38\x38\x38\x38\x39\x20\x35\x2e\x36\x38\x38\x38\x38\x39\x2d\x37\
 | 
				
			||||||
 | 
					\x39\x2e\x36\x34\x34\x34\x34\x35\x6c\x33\x36\x34\x2e\x30\x38\x38\
 | 
				
			||||||
 | 
					\x38\x38\x38\x2d\x33\x32\x39\x2e\x39\x35\x35\x35\x35\x35\x63\x31\
 | 
				
			||||||
 | 
					\x31\x2e\x33\x37\x37\x37\x37\x38\x2d\x31\x31\x2e\x33\x37\x37\x37\
 | 
				
			||||||
 | 
					\x37\x38\x20\x31\x37\x2e\x30\x36\x36\x36\x36\x37\x2d\x32\x32\x2e\
 | 
				
			||||||
 | 
					\x37\x35\x35\x35\x35\x36\x20\x31\x37\x2e\x30\x36\x36\x36\x36\x37\
 | 
				
			||||||
 | 
					\x2d\x33\x34\x2e\x31\x33\x33\x33\x33\x33\x20\x30\x2d\x31\x31\x2e\
 | 
				
			||||||
 | 
					\x33\x37\x37\x37\x37\x38\x2d\x35\x2e\x36\x38\x38\x38\x38\x39\x2d\
 | 
				
			||||||
 | 
					\x32\x32\x2e\x37\x35\x35\x35\x35\x36\x2d\x31\x37\x2e\x30\x36\x36\
 | 
				
			||||||
 | 
					\x36\x36\x37\x2d\x33\x34\x2e\x31\x33\x33\x33\x33\x34\x4c\x32\x37\
 | 
				
			||||||
 | 
					\x33\x2e\x30\x36\x36\x36\x36\x37\x20\x31\x38\x37\x2e\x37\x33\x33\
 | 
				
			||||||
 | 
					\x33\x33\x33\x63\x2d\x32\x32\x2e\x37\x35\x35\x35\x35\x36\x2d\x32\
 | 
				
			||||||
 | 
					\x32\x2e\x37\x35\x35\x35\x35\x36\x2d\x32\x38\x2e\x34\x34\x34\x34\
 | 
				
			||||||
 | 
					\x34\x34\x2d\x35\x36\x2e\x38\x38\x38\x38\x38\x39\x2d\x35\x2e\x36\
 | 
				
			||||||
 | 
					\x38\x38\x38\x38\x39\x2d\x37\x39\x2e\x36\x34\x34\x34\x34\x34\x20\
 | 
				
			||||||
 | 
					\x32\x32\x2e\x37\x35\x35\x35\x35\x36\x2d\x32\x32\x2e\x37\x35\x35\
 | 
				
			||||||
 | 
					\x35\x35\x36\x20\x35\x36\x2e\x38\x38\x38\x38\x38\x39\x2d\x32\x38\
 | 
				
			||||||
 | 
					\x2e\x34\x34\x34\x34\x34\x34\x20\x37\x39\x2e\x36\x34\x34\x34\x34\
 | 
				
			||||||
 | 
					\x34\x2d\x35\x2e\x36\x38\x38\x38\x38\x39\x6c\x33\x36\x34\x2e\x30\
 | 
				
			||||||
 | 
					\x38\x38\x38\x38\x39\x20\x33\x31\x32\x2e\x38\x38\x38\x38\x38\x39\
 | 
				
			||||||
 | 
					\x63\x33\x34\x2e\x31\x33\x33\x33\x33\x33\x20\x32\x38\x2e\x34\x34\
 | 
				
			||||||
 | 
					\x34\x34\x34\x34\x20\x35\x36\x2e\x38\x38\x38\x38\x38\x39\x20\x37\
 | 
				
			||||||
 | 
					\x33\x2e\x39\x35\x35\x35\x35\x36\x20\x35\x36\x2e\x38\x38\x38\x38\
 | 
				
			||||||
 | 
					\x38\x39\x20\x31\x31\x39\x2e\x34\x36\x36\x36\x36\x37\x73\x2d\x31\
 | 
				
			||||||
 | 
					\x37\x2e\x30\x36\x36\x36\x36\x37\x20\x38\x35\x2e\x33\x33\x33\x33\
 | 
				
			||||||
 | 
					\x33\x33\x2d\x35\x31\x2e\x32\x20\x31\x31\x39\x2e\x34\x36\x36\x36\
 | 
				
			||||||
 | 
					\x36\x36\x6c\x2d\x33\x36\x34\x2e\x30\x38\x38\x38\x38\x39\x20\x33\
 | 
				
			||||||
 | 
					\x32\x39\x2e\x39\x35\x35\x35\x35\x36\x63\x2d\x31\x31\x2e\x33\x37\
 | 
				
			||||||
 | 
					\x37\x37\x37\x38\x20\x35\x2e\x36\x38\x38\x38\x38\x39\x2d\x32\x38\
 | 
				
			||||||
 | 
					\x2e\x34\x34\x34\x34\x34\x34\x20\x31\x31\x2e\x33\x37\x37\x37\x37\
 | 
				
			||||||
 | 
					\x38\x2d\x33\x39\x2e\x38\x32\x32\x32\x32\x32\x20\x31\x31\x2e\x33\
 | 
				
			||||||
 | 
					\x37\x37\x37\x37\x38\x7a\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x31\
 | 
				
			||||||
 | 
					\x33\x38\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x2f\x73\x76\x67\
 | 
				
			||||||
 | 
					\x3e\
 | 
				
			||||||
 | 
					\x00\x00\x04\xf8\
 | 
				
			||||||
 | 
					\x89\
 | 
				
			||||||
 | 
					\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
 | 
				
			||||||
 | 
					\x00\x00\x80\x00\x00\x00\x80\x08\x06\x00\x00\x00\xc3\x3e\x61\xcb\
 | 
				
			||||||
 | 
					\x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x04\
 | 
				
			||||||
 | 
					\xb2\x49\x44\x41\x54\x78\x5e\xed\x99\xef\x8e\x15\x45\x10\xc5\xab\
 | 
				
			||||||
 | 
					\xf7\x71\xf0\x31\xa6\x7b\xdf\x40\xfc\x13\x10\x54\xa2\x04\x95\x68\
 | 
				
			||||||
 | 
					\x50\x09\x2a\x51\x09\x2a\x41\x45\x09\x2a\x41\x82\x88\x4a\x80\x7d\
 | 
				
			||||||
 | 
					\x85\xa9\x7e\x0c\x7d\x9c\x5b\x66\xd4\xd5\x05\x2e\x5b\x3b\xe5\x07\
 | 
				
			||||||
 | 
					\xee\x9c\x3a\xfd\x75\xeb\x64\x73\xce\xf9\xa5\x7a\x66\x6e\x11\x9e\
 | 
				
			||||||
 | 
					\xd4\x09\x94\xd4\xee\x69\x5e\x08\x40\x72\x08\x08\x00\x01\x48\x9e\
 | 
				
			||||||
 | 
					\x40\x72\xfb\xdc\x00\x04\x20\x79\x02\xc9\xed\x73\x03\x10\x80\xe4\
 | 
				
			||||||
 | 
					\x09\x24\xb7\xcf\x0d\x40\x00\x92\x27\x90\xdc\x3e\x37\x00\x01\x48\
 | 
				
			||||||
 | 
					\x9e\x40\x72\xfb\xdc\x00\x04\x20\x79\x02\xc9\xed\x73\x03\x10\x80\
 | 
				
			||||||
 | 
					\xe4\x09\x24\xb7\xcf\x0d\x40\x00\x92\x27\x90\xdc\x3e\x37\x00\x01\
 | 
				
			||||||
 | 
					\x48\x9e\x40\x72\xfb\xdc\x00\x04\x20\x79\x02\xc9\xed\x73\x03\x10\
 | 
				
			||||||
 | 
					\x80\xe4\x09\x24\xb7\xcf\x0d\x40\x00\x92\x27\x90\xdc\x3e\x37\x00\
 | 
				
			||||||
 | 
					\x01\x48\x9e\x40\x72\xfb\xdc\x00\x04\x20\x79\x02\xc9\xed\x43\x6f\
 | 
				
			||||||
 | 
					\x80\x61\x18\x0e\xf5\xde\xff\x48\xde\xf1\xbe\xf6\x61\x01\x98\xca\
 | 
				
			||||||
 | 
					\xdf\xda\xda\xda\x59\xad\x56\x87\x09\xc1\x93\x19\x80\x04\x60\xb7\
 | 
				
			||||||
 | 
					\x7c\x33\x7b\xa6\x94\xf2\x3b\x21\x48\x04\xc0\xde\xf2\x77\x6d\x13\
 | 
				
			||||||
 | 
					\x82\x24\x00\xac\x2b\x9f\x10\xec\xff\x04\x04\x73\x05\xec\x57\x3e\
 | 
				
			||||||
 | 
					\x21\x00\xdf\x00\x07\x29\x9f\x10\xac\x87\x60\xf1\x1b\x60\x4e\xf9\
 | 
				
			||||||
 | 
					\x84\xe0\x71\x08\x16\x0d\x40\xa4\x7c\x42\xf0\x30\x04\x8b\x06\x60\
 | 
				
			||||||
 | 
					\xb2\x42\x08\xfe\xdf\x67\xae\xc5\x03\x40\x08\x08\xc0\x5f\x09\x70\
 | 
				
			||||||
 | 
					\x13\xc4\x40\x80\xd8\x00\xbb\xd6\x09\xc1\x7c\x08\xa0\x00\xe0\x26\
 | 
				
			||||||
 | 
					\x20\x00\xbc\x0e\x66\x32\x00\xb7\x01\x78\x1d\xcc\x23\x00\x16\x00\
 | 
				
			||||||
 | 
					\x5e\x07\x07\x03\x01\x1a\x00\x42\xe0\x43\x00\x0f\x00\x21\x48\xf2\
 | 
				
			||||||
 | 
					\x6b\xa0\xc7\x3a\x5f\x11\x41\x7f\x0c\xf2\x8a\xdf\xfb\x77\x42\x00\
 | 
				
			||||||
 | 
					\xf6\x63\xd0\x9c\xf2\xf9\x76\xc0\x0d\xf0\x6f\x02\xdc\x04\xff\xc1\
 | 
				
			||||||
 | 
					\x90\xe2\x21\x70\x1d\xfb\x84\xe0\xef\x54\xd2\x02\xc0\xb7\x03\x02\
 | 
				
			||||||
 | 
					\xc0\xcf\xc6\xd9\x37\x00\x1f\x0c\x93\x5f\x01\x7c\x45\x24\x00\x0f\
 | 
				
			||||||
 | 
					\x3d\x1f\x66\x7c\x30\x4c\xfd\x10\xc8\xb7\x03\x6e\x80\xb5\x5f\x47\
 | 
				
			||||||
 | 
					\x6a\xad\x1f\x8b\xc8\x27\x91\x0f\x4d\x22\xf2\xa9\xaa\x46\xb5\xc1\
 | 
				
			||||||
 | 
					\x7f\x19\x97\x71\x03\x3c\x92\xdd\x30\x0c\xe7\x4b\x29\x17\x22\x91\
 | 
				
			||||||
 | 
					\x9a\xd9\x85\xde\xfb\x04\xcf\x62\x0e\x01\xd8\x53\x55\xad\xf5\x43\
 | 
				
			||||||
 | 
					\x11\xb9\x18\x6c\xef\xa2\xaa\x9e\x0f\x6a\x9f\x9a\x8c\x00\xfc\x13\
 | 
				
			||||||
 | 
					\xfd\x30\x0c\xe7\x4a\x29\x9f\x07\x9b\xf8\x4c\x55\x3f\x0a\x6a\x9f\
 | 
				
			||||||
 | 
					\xaa\x8c\x00\x88\x48\x6b\xed\xac\x99\x5d\x8a\x34\x51\x4a\xf9\x62\
 | 
				
			||||||
 | 
					\x1c\xc7\x0f\x22\xda\x4d\xd0\xa4\x07\xa0\xd6\xfa\x9e\x88\x5c\x0e\
 | 
				
			||||||
 | 
					\x96\x71\x49\x55\xcf\x05\xb5\x1b\x21\x4b\x0d\x40\x6b\xed\x8c\x99\
 | 
				
			||||||
 | 
					\x7d\x15\x69\xc2\xcc\x2e\xf7\xde\xcf\x46\xb4\x9b\xa4\x49\x0b\x40\
 | 
				
			||||||
 | 
					\xad\xf5\x1d\x11\xb9\x12\x2c\xe3\x4b\x55\x7d\x3f\xa8\xdd\x28\x59\
 | 
				
			||||||
 | 
					\x4a\x00\x6a\xad\x6f\x8b\xc8\x37\x91\x26\xcc\xec\xeb\xde\xfb\xbb\
 | 
				
			||||||
 | 
					\x11\xed\x26\x6a\xd2\x01\x30\x0c\xc3\xe9\x52\xca\xd5\x48\x19\xa5\
 | 
				
			||||||
 | 
					\x94\x2b\xe3\x38\x9e\x89\x68\x37\x55\x93\x0a\x80\x5a\xeb\x9b\x22\
 | 
				
			||||||
 | 
					\x72\x2d\x58\xc6\xb7\xaa\x3a\x5d\x1b\x50\x27\x0d\x00\xc3\x30\x9c\
 | 
				
			||||||
 | 
					\x2a\xa5\x7c\x1f\x69\xcf\xcc\xae\xf6\xde\xa7\x6b\x03\xee\xa4\x00\
 | 
				
			||||||
 | 
					\xa0\xb5\x76\xd2\xcc\xae\x07\xdb\xbb\xa6\xaa\xa7\x83\xda\x8d\x97\
 | 
				
			||||||
 | 
					\xc1\x03\x50\x6b\x7d\x4d\x44\x6e\x04\x9b\xf8\x4e\x55\xdf\x0a\x6a\
 | 
				
			||||||
 | 
					\x17\x21\x83\x06\xa0\xb5\x76\xc2\xcc\x6e\x06\x9b\xf8\x41\x55\xdf\
 | 
				
			||||||
 | 
					\x08\x6a\x17\x23\x83\x05\xa0\xd6\xfa\x8a\x88\xdc\x0a\x36\x71\x5d\
 | 
				
			||||||
 | 
					\x55\x4f\x05\xb5\x8b\x92\x41\x02\xd0\x5a\x3b\x6e\x66\xb7\x23\x4d\
 | 
				
			||||||
 | 
					\x98\xd9\x8d\xde\xfb\xc9\x88\x76\x89\x1a\x38\x00\x6a\xad\x2f\x89\
 | 
				
			||||||
 | 
					\xc8\x9d\x60\x19\x3f\xaa\xea\xeb\x41\xed\x22\x65\x50\x00\xb4\xd6\
 | 
				
			||||||
 | 
					\x8e\x98\xd9\xaf\xc1\x26\x6e\xaa\xea\xf4\xc0\x98\xea\xc0\x00\x50\
 | 
				
			||||||
 | 
					\x6b\x7d\x51\x44\xee\x46\xda\x2b\xa5\xdc\x1a\xc7\xf1\x44\x44\xbb\
 | 
				
			||||||
 | 
					\x74\x0d\x04\x00\xdb\xdb\xdb\xcf\xaf\x56\xab\x7b\xc1\x32\x7e\x52\
 | 
				
			||||||
 | 
					\xd5\x57\x83\xda\xc5\xcb\x16\x0f\x40\xad\xf5\xb0\x88\x3c\x88\x34\
 | 
				
			||||||
 | 
					\x61\x66\x3f\xf7\xde\x5f\x8e\x68\x51\x34\x08\x00\xec\x88\xc8\xb3\
 | 
				
			||||||
 | 
					\x73\x0b\x29\xa5\xdc\x19\xc7\xf1\xf8\x5c\x1d\xda\xfc\xe2\x01\x98\
 | 
				
			||||||
 | 
					\x0a\xa9\xb5\xce\x85\xe0\x17\x55\x3d\x86\x56\x66\xc4\x0f\x04\x00\
 | 
				
			||||||
 | 
					\x73\x20\x30\xb3\xdf\x7a\xef\x47\x23\x61\x21\x6a\x60\x00\x38\x20\
 | 
				
			||||||
 | 
					\x04\x77\x55\xf5\x08\x62\x91\x51\x4f\x50\x00\x38\x10\xdc\x53\xd5\
 | 
				
			||||||
 | 
					\xe9\x55\x91\x67\x4f\x02\x70\x00\xac\x83\xa0\x94\x72\x7f\x1c\xc7\
 | 
				
			||||||
 | 
					\x17\xd8\xfc\xe3\x09\x40\x02\xf0\x08\x04\x3b\xaa\xfa\x1c\xcb\x5f\
 | 
				
			||||||
 | 
					\x9f\x00\x2c\x00\xbb\x10\xa8\xea\xf4\x9d\x80\xe7\x09\x09\x40\x03\
 | 
				
			||||||
 | 
					\xc0\xd6\xfd\x04\x08\x80\x9f\x11\xf4\x04\x01\x80\xae\xd7\x37\x47\
 | 
				
			||||||
 | 
					\x00\xfc\x8c\xa0\x27\x08\x00\x74\xbd\xbe\x39\x02\xe0\x67\x04\x3d\
 | 
				
			||||||
 | 
					\x41\x00\xa0\xeb\xf5\xcd\x11\x00\x3f\x23\xe8\x09\x02\x00\x5d\xaf\
 | 
				
			||||||
 | 
					\x6f\x8e\x00\xf8\x19\x41\x4f\x10\x00\xe8\x7a\x7d\x73\x04\xc0\xcf\
 | 
				
			||||||
 | 
					\x08\x7a\x82\x00\x40\xd7\xeb\x9b\x23\x00\x7e\x46\xd0\x13\x04\x00\
 | 
				
			||||||
 | 
					\xba\x5e\xdf\x1c\x01\xf0\x33\x82\x9e\x20\x00\xd0\xf5\xfa\xe6\x08\
 | 
				
			||||||
 | 
					\x80\x9f\x11\xf4\x04\x01\x80\xae\xd7\x37\x47\x00\xfc\x8c\xa0\x27\
 | 
				
			||||||
 | 
					\x08\x00\x74\xbd\xbe\x39\x02\xe0\x67\x04\x3d\x41\x00\xa0\xeb\xf5\
 | 
				
			||||||
 | 
					\xcd\x11\x00\x3f\x23\xe8\x09\x02\x00\x5d\xaf\x6f\x8e\x00\xf8\x19\
 | 
				
			||||||
 | 
					\x41\x4f\x10\x00\xe8\x7a\x7d\x73\x04\xc0\xcf\x08\x7a\x82\x00\x40\
 | 
				
			||||||
 | 
					\xd7\xeb\x9b\x23\x00\x7e\x46\xd0\x13\x04\x00\xba\x5e\xdf\x1c\x01\
 | 
				
			||||||
 | 
					\xf0\x33\x82\x9e\x20\x00\xd0\xf5\xfa\xe6\x08\x80\x9f\x11\xf4\x04\
 | 
				
			||||||
 | 
					\x01\x80\xae\xd7\x37\x47\x00\xfc\x8c\xa0\x27\x08\x00\x74\xbd\xbe\
 | 
				
			||||||
 | 
					\xb9\x3f\x01\xc2\xa1\x1b\x9f\x9b\x5d\x0e\x95\x00\x00\x00\x00\x49\
 | 
				
			||||||
 | 
					\x45\x4e\x44\xae\x42\x60\x82\
 | 
				
			||||||
 | 
					\x00\x00\x05\x0d\
 | 
				
			||||||
 | 
					\x3c\
 | 
				
			||||||
 | 
					\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
 | 
				
			||||||
 | 
					\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\
 | 
				
			||||||
 | 
					\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\
 | 
				
			||||||
 | 
					\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\
 | 
				
			||||||
 | 
					\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\
 | 
				
			||||||
 | 
					\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\
 | 
				
			||||||
 | 
					\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\x53\
 | 
				
			||||||
 | 
					\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\x31\
 | 
				
			||||||
 | 
					\x2e\x64\x74\x64\x22\x3e\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x36\
 | 
				
			||||||
 | 
					\x35\x35\x31\x30\x35\x33\x35\x33\x37\x31\x33\x22\x20\x63\x6c\x61\
 | 
				
			||||||
 | 
					\x73\x73\x3d\x22\x69\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\
 | 
				
			||||||
 | 
					\x78\x3d\x22\x30\x20\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\
 | 
				
			||||||
 | 
					\x22\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\
 | 
				
			||||||
 | 
					\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
 | 
				
			||||||
 | 
					\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\
 | 
				
			||||||
 | 
					\x67\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x32\x39\x32\x22\x20\x78\
 | 
				
			||||||
 | 
					\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\
 | 
				
			||||||
 | 
					\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\
 | 
				
			||||||
 | 
					\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x77\x69\x64\x74\x68\x3d\
 | 
				
			||||||
 | 
					\x22\x31\x32\x38\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x32\
 | 
				
			||||||
 | 
					\x38\x22\x3e\x3c\x64\x65\x66\x73\x3e\x3c\x73\x74\x79\x6c\x65\x20\
 | 
				
			||||||
 | 
					\x74\x79\x70\x65\x3d\x22\x74\x65\x78\x74\x2f\x63\x73\x73\x22\x3e\
 | 
				
			||||||
 | 
					\x40\x66\x6f\x6e\x74\x2d\x66\x61\x63\x65\x20\x7b\x20\x66\x6f\x6e\
 | 
				
			||||||
 | 
					\x74\x2d\x66\x61\x6d\x69\x6c\x79\x3a\x20\x66\x65\x65\x64\x62\x61\
 | 
				
			||||||
 | 
					\x63\x6b\x2d\x69\x63\x6f\x6e\x66\x6f\x6e\x74\x3b\x20\x73\x72\x63\
 | 
				
			||||||
 | 
					\x3a\x20\x75\x72\x6c\x28\x22\x2f\x2f\x61\x74\x2e\x61\x6c\x69\x63\
 | 
				
			||||||
 | 
					\x64\x6e\x2e\x63\x6f\x6d\x2f\x74\x2f\x66\x6f\x6e\x74\x5f\x31\x30\
 | 
				
			||||||
 | 
					\x33\x31\x31\x35\x38\x5f\x75\x36\x39\x77\x38\x79\x68\x78\x64\x75\
 | 
				
			||||||
 | 
					\x2e\x77\x6f\x66\x66\x32\x3f\x74\x3d\x31\x36\x33\x30\x30\x33\x33\
 | 
				
			||||||
 | 
					\x37\x35\x39\x39\x34\x34\x22\x29\x20\x66\x6f\x72\x6d\x61\x74\x28\
 | 
				
			||||||
 | 
					\x22\x77\x6f\x66\x66\x32\x22\x29\x2c\x20\x75\x72\x6c\x28\x22\x2f\
 | 
				
			||||||
 | 
					\x2f\x61\x74\x2e\x61\x6c\x69\x63\x64\x6e\x2e\x63\x6f\x6d\x2f\x74\
 | 
				
			||||||
 | 
					\x2f\x66\x6f\x6e\x74\x5f\x31\x30\x33\x31\x31\x35\x38\x5f\x75\x36\
 | 
				
			||||||
 | 
					\x39\x77\x38\x79\x68\x78\x64\x75\x2e\x77\x6f\x66\x66\x3f\x74\x3d\
 | 
				
			||||||
 | 
					\x31\x36\x33\x30\x30\x33\x33\x37\x35\x39\x39\x34\x34\x22\x29\x20\
 | 
				
			||||||
 | 
					\x66\x6f\x72\x6d\x61\x74\x28\x22\x77\x6f\x66\x66\x22\x29\x2c\x20\
 | 
				
			||||||
 | 
					\x75\x72\x6c\x28\x22\x2f\x2f\x61\x74\x2e\x61\x6c\x69\x63\x64\x6e\
 | 
				
			||||||
 | 
					\x2e\x63\x6f\x6d\x2f\x74\x2f\x66\x6f\x6e\x74\x5f\x31\x30\x33\x31\
 | 
				
			||||||
 | 
					\x31\x35\x38\x5f\x75\x36\x39\x77\x38\x79\x68\x78\x64\x75\x2e\x74\
 | 
				
			||||||
 | 
					\x74\x66\x3f\x74\x3d\x31\x36\x33\x30\x30\x33\x33\x37\x35\x39\x39\
 | 
				
			||||||
 | 
					\x34\x34\x22\x29\x20\x66\x6f\x72\x6d\x61\x74\x28\x22\x74\x72\x75\
 | 
				
			||||||
 | 
					\x65\x74\x79\x70\x65\x22\x29\x3b\x20\x7d\x0a\x3c\x2f\x73\x74\x79\
 | 
				
			||||||
 | 
					\x6c\x65\x3e\x3c\x2f\x64\x65\x66\x73\x3e\x3c\x70\x61\x74\x68\x20\
 | 
				
			||||||
 | 
					\x64\x3d\x22\x4d\x35\x31\x37\x2e\x36\x38\x38\x38\x38\x39\x20\x37\
 | 
				
			||||||
 | 
					\x39\x36\x2e\x34\x34\x34\x34\x34\x34\x63\x2d\x34\x35\x2e\x35\x31\
 | 
				
			||||||
 | 
					\x31\x31\x31\x31\x20\x30\x2d\x38\x35\x2e\x33\x33\x33\x33\x33\x33\
 | 
				
			||||||
 | 
					\x2d\x31\x37\x2e\x30\x36\x36\x36\x36\x37\x2d\x31\x31\x39\x2e\x34\
 | 
				
			||||||
 | 
					\x36\x36\x36\x36\x37\x2d\x35\x31\x2e\x32\x4c\x37\x33\x2e\x39\x35\
 | 
				
			||||||
 | 
					\x35\x35\x35\x36\x20\x33\x38\x31\x2e\x31\x35\x35\x35\x35\x36\x63\
 | 
				
			||||||
 | 
					\x2d\x32\x32\x2e\x37\x35\x35\x35\x35\x36\x2d\x32\x32\x2e\x37\x35\
 | 
				
			||||||
 | 
					\x35\x35\x35\x36\x2d\x31\x37\x2e\x30\x36\x36\x36\x36\x37\x2d\x35\
 | 
				
			||||||
 | 
					\x36\x2e\x38\x38\x38\x38\x38\x39\x20\x35\x2e\x36\x38\x38\x38\x38\
 | 
				
			||||||
 | 
					\x38\x2d\x37\x39\x2e\x36\x34\x34\x34\x34\x35\x20\x32\x32\x2e\x37\
 | 
				
			||||||
 | 
					\x35\x35\x35\x35\x36\x2d\x32\x32\x2e\x37\x35\x35\x35\x35\x36\x20\
 | 
				
			||||||
 | 
					\x35\x36\x2e\x38\x38\x38\x38\x38\x39\x2d\x31\x37\x2e\x30\x36\x36\
 | 
				
			||||||
 | 
					\x36\x36\x37\x20\x37\x39\x2e\x36\x34\x34\x34\x34\x35\x20\x35\x2e\
 | 
				
			||||||
 | 
					\x36\x38\x38\x38\x38\x39\x6c\x33\x32\x39\x2e\x39\x35\x35\x35\x35\
 | 
				
			||||||
 | 
					\x35\x20\x33\x36\x34\x2e\x30\x38\x38\x38\x38\x39\x63\x35\x2e\x36\
 | 
				
			||||||
 | 
					\x38\x38\x38\x38\x39\x20\x35\x2e\x36\x38\x38\x38\x38\x39\x20\x31\
 | 
				
			||||||
 | 
					\x37\x2e\x30\x36\x36\x36\x36\x37\x20\x31\x31\x2e\x33\x37\x37\x37\
 | 
				
			||||||
 | 
					\x37\x38\x20\x32\x38\x2e\x34\x34\x34\x34\x34\x35\x20\x31\x31\x2e\
 | 
				
			||||||
 | 
					\x33\x37\x37\x37\x37\x38\x73\x32\x32\x2e\x37\x35\x35\x35\x35\x36\
 | 
				
			||||||
 | 
					\x2d\x35\x2e\x36\x38\x38\x38\x38\x39\x20\x33\x34\x2e\x31\x33\x33\
 | 
				
			||||||
 | 
					\x33\x33\x33\x2d\x31\x37\x2e\x30\x36\x36\x36\x36\x37\x6c\x33\x31\
 | 
				
			||||||
 | 
					\x32\x2e\x38\x38\x38\x38\x38\x39\x2d\x33\x36\x34\x2e\x30\x38\x38\
 | 
				
			||||||
 | 
					\x38\x38\x39\x63\x32\x32\x2e\x37\x35\x35\x35\x35\x36\x2d\x32\x32\
 | 
				
			||||||
 | 
					\x2e\x37\x35\x35\x35\x35\x36\x20\x35\x36\x2e\x38\x38\x38\x38\x38\
 | 
				
			||||||
 | 
					\x39\x2d\x32\x38\x2e\x34\x34\x34\x34\x34\x34\x20\x37\x39\x2e\x36\
 | 
				
			||||||
 | 
					\x34\x34\x34\x34\x35\x2d\x35\x2e\x36\x38\x38\x38\x38\x39\x20\x32\
 | 
				
			||||||
 | 
					\x32\x2e\x37\x35\x35\x35\x35\x36\x20\x32\x32\x2e\x37\x35\x35\x35\
 | 
				
			||||||
 | 
					\x35\x36\x20\x32\x38\x2e\x34\x34\x34\x34\x34\x34\x20\x35\x36\x2e\
 | 
				
			||||||
 | 
					\x38\x38\x38\x38\x38\x39\x20\x35\x2e\x36\x38\x38\x38\x38\x38\x20\
 | 
				
			||||||
 | 
					\x37\x39\x2e\x36\x34\x34\x34\x34\x35\x4c\x36\x33\x37\x2e\x31\x35\
 | 
				
			||||||
 | 
					\x35\x35\x35\x36\x20\x37\x33\x39\x2e\x35\x35\x35\x35\x35\x36\x63\
 | 
				
			||||||
 | 
					\x2d\x32\x38\x2e\x34\x34\x34\x34\x34\x34\x20\x33\x39\x2e\x38\x32\
 | 
				
			||||||
 | 
					\x32\x32\x32\x32\x2d\x36\x38\x2e\x32\x36\x36\x36\x36\x37\x20\x35\
 | 
				
			||||||
 | 
					\x36\x2e\x38\x38\x38\x38\x38\x39\x2d\x31\x31\x39\x2e\x34\x36\x36\
 | 
				
			||||||
 | 
					\x36\x36\x37\x20\x35\x36\x2e\x38\x38\x38\x38\x38\x38\x20\x35\x2e\
 | 
				
			||||||
 | 
					\x36\x38\x38\x38\x38\x39\x20\x30\x20\x30\x20\x30\x20\x30\x20\x30\
 | 
				
			||||||
 | 
					\x7a\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x32\x39\x33\x22\x3e\x3c\
 | 
				
			||||||
 | 
					\x2f\x70\x61\x74\x68\x3e\x3c\x2f\x73\x76\x67\x3e\
 | 
				
			||||||
 | 
					\x00\x00\x07\x08\
 | 
				
			||||||
 | 
					\x89\
 | 
				
			||||||
 | 
					\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
 | 
				
			||||||
 | 
					\x00\x00\x80\x00\x00\x00\x80\x08\x06\x00\x00\x00\xc3\x3e\x61\xcb\
 | 
				
			||||||
 | 
					\x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x06\
 | 
				
			||||||
 | 
					\xc2\x49\x44\x41\x54\x78\x5e\xed\x9b\x7b\x68\x1c\x55\x14\xc6\xcf\
 | 
				
			||||||
 | 
					\xc9\x6c\x51\x50\x50\xa2\x28\xa8\x28\x28\x28\x28\x28\x28\x28\x28\
 | 
				
			||||||
 | 
					\xe8\xec\xce\xce\x2e\x0a\x0a\x2a\xe6\x61\xd3\x52\x69\xf1\x51\xd1\
 | 
				
			||||||
 | 
					\xfa\x2a\x4a\x8b\x62\x8b\x5a\xd1\x2a\x5a\x14\x2b\x6a\x8b\x5a\xa3\
 | 
				
			||||||
 | 
					\x35\x54\xc5\x77\x66\xee\x4d\x57\x22\x0d\xc5\x42\xb1\x50\x28\x15\
 | 
				
			||||||
 | 
					\x25\x50\x14\x4a\x45\xa9\x18\x34\x66\x33\x47\x46\x6e\x30\x94\x24\
 | 
				
			||||||
 | 
					\xdd\xb9\xfb\x9a\xd9\x73\xf6\xaf\x40\xee\x77\x77\xbe\xef\xfc\xf6\
 | 
				
			||||||
 | 
					\xbb\xb3\xbb\x09\x82\x3c\x58\x27\x80\xac\xdd\x8b\x79\x10\x00\x98\
 | 
				
			||||||
 | 
					\x43\x20\x00\x08\x00\xcc\x13\x60\x6e\x5f\x1a\x40\x00\x60\x9e\x00\
 | 
				
			||||||
 | 
					\x73\xfb\xd2\x00\x02\x00\xf3\x04\x98\xdb\x97\x06\x10\x00\x98\x27\
 | 
				
			||||||
 | 
					\xc0\xdc\xbe\x34\x80\x00\xc0\x3c\x01\xe6\xf6\xa5\x01\x04\x00\xe6\
 | 
				
			||||||
 | 
					\x09\x30\xb7\x2f\x0d\x20\x00\x30\x4f\x80\xb9\x7d\x69\x00\x01\x80\
 | 
				
			||||||
 | 
					\x79\x02\xcc\xed\x4b\x03\x08\x00\xcc\x13\x60\x6e\x5f\x1a\x40\x00\
 | 
				
			||||||
 | 
					\x60\x9e\x00\x73\xfb\xd2\x00\x02\x00\xf3\x04\x98\xdb\x97\x06\x10\
 | 
				
			||||||
 | 
					\x00\x98\x27\xc0\xdc\xbe\x34\x80\x00\xc0\x3c\x01\xe6\xf6\xa5\x01\
 | 
				
			||||||
 | 
					\x04\x00\xe6\x09\x30\xb7\x2f\x0d\x20\x00\x30\x4f\x80\xb9\x7d\x69\
 | 
				
			||||||
 | 
					\x00\x01\x80\x79\x02\xcc\xed\x4b\x03\x08\x00\xcc\x13\x60\x6e\x5f\
 | 
				
			||||||
 | 
					\x1a\x40\x00\x60\x9e\x00\x73\xfb\xd2\x00\x02\x00\xf3\x04\x98\xdb\
 | 
				
			||||||
 | 
					\x97\x06\x10\x00\x98\x27\xc0\xdc\x7e\xe6\x1a\xc0\xf7\xfd\xf5\xd5\
 | 
				
			||||||
 | 
					\x6a\x75\xc7\xce\x9d\x3b\xbf\x4f\xfb\xec\x5c\xd7\xcd\xe5\x72\xb9\
 | 
				
			||||||
 | 
					\x41\xa5\x54\x4f\x5a\xaf\x35\x53\x00\x78\x9e\xb7\x11\x11\x1f\x06\
 | 
				
			||||||
 | 
					\x80\x83\x44\x34\xa0\xb5\xfe\x2e\xad\xc1\xba\xae\x7b\xa2\xe3\x38\
 | 
				
			||||||
 | 
					\x83\x88\x78\x33\x00\x0c\xa5\x15\x82\xcc\x00\x50\x2c\x16\x5f\x05\
 | 
				
			||||||
 | 
					\x80\x95\x33\x03\x27\xa2\x71\xc7\x71\x16\x07\x41\xb0\x2b\x6d\x10\
 | 
				
			||||||
 | 
					\xb8\xae\x7b\xb2\x19\xfe\x8d\xb3\xae\x2d\x95\x10\x64\x02\x00\xcf\
 | 
				
			||||||
 | 
					\xf3\xb6\x22\xe2\xb2\x39\x06\xfd\x33\x00\x0c\x28\xa5\x2a\x69\x81\
 | 
				
			||||||
 | 
					\xc0\x75\xdd\x53\xcd\xf0\xaf\x9f\xe3\x9a\x52\x07\x41\xaa\x01\x88\
 | 
				
			||||||
 | 
					\x6b\x34\x97\xcb\x6d\x03\x80\x5b\x17\x18\xf0\x11\x44\x1c\x08\xc3\
 | 
				
			||||||
 | 
					\x30\x68\x37\x04\xae\xeb\x9e\xbe\x68\xd1\xa2\x41\x22\xf2\x17\xb8\
 | 
				
			||||||
 | 
					\x96\x54\x41\x90\x5a\x00\xca\xe5\x72\xf7\xf4\xf4\xf4\x20\x00\x94\
 | 
				
			||||||
 | 
					\x6b\x18\xec\x51\x73\x4f\xf0\x79\x0d\x6b\x9b\xb2\xc4\xf3\xbc\x33\
 | 
				
			||||||
 | 
					\x11\xf1\x7d\x00\xc8\xd7\xf0\x04\xa9\x81\x20\x95\x00\xb8\xae\x7b\
 | 
				
			||||||
 | 
					\x8e\xe3\x38\xdb\x11\xf1\xea\x1a\xc2\x9c\x59\xf2\x97\x39\x0e\x3e\
 | 
				
			||||||
 | 
					\x4a\xa0\x69\xc8\xd2\x42\xa1\x70\x76\x5c\xfb\x44\x74\x6d\x82\x0d\
 | 
				
			||||||
 | 
					\x53\x01\x41\xea\x00\xc8\xe7\xf3\x17\x39\x8e\xf3\x21\x00\x5c\x9a\
 | 
				
			||||||
 | 
					\x20\xcc\x99\xa5\xd3\x44\xb4\x58\x6b\xbd\xdd\x42\x6b\x25\x29\x14\
 | 
				
			||||||
 | 
					\x0a\xe7\x99\xe1\x27\x81\x75\xe6\xb9\xda\x0e\x41\xea\x00\x88\x93\
 | 
				
			||||||
 | 
					\xf1\x7d\xff\x09\x22\x5a\x67\x35\x11\x00\x40\xc4\xa5\x61\x18\xbe\
 | 
				
			||||||
 | 
					\x6b\xab\xaf\x55\x57\x28\x14\x2e\x30\xc3\xbf\xb2\x56\xcd\xac\x75\
 | 
				
			||||||
 | 
					\x11\x00\xf4\x28\xa5\x76\x58\x68\x1b\x26\x49\x25\x00\xb1\x3b\xcf\
 | 
				
			||||||
 | 
					\xf3\x1e\x47\xc4\xf5\xb6\x4e\x89\x68\x85\xd6\xfa\x2d\x5b\xfd\xf1\
 | 
				
			||||||
 | 
					\x74\xa6\xa9\xe2\x7b\x94\xcb\x8f\xb7\x76\x8e\xdf\x4f\x11\x51\x8f\
 | 
				
			||||||
 | 
					\xd6\xfa\x13\x0b\x6d\x43\x25\xa9\x05\x20\x76\x59\x2c\x16\xd7\x02\
 | 
				
			||||||
 | 
					\xc0\x53\x75\x38\x5e\xa9\x94\x7a\xad\x0e\xfd\x9c\xd2\x7c\x3e\x7f\
 | 
				
			||||||
 | 
					\x49\xfc\xca\xb7\x3c\xa6\xfe\xee\xea\xea\xea\x09\x82\xe0\xb3\x46\
 | 
				
			||||||
 | 
					\x5f\x97\xcd\x7e\xa9\x06\xc0\x1c\x07\x6b\x88\xe8\x69\x1b\x73\xb1\
 | 
				
			||||||
 | 
					\x86\x88\x1e\xd0\x5a\xbf\x6c\xab\x3f\x56\x57\x2e\x97\x2f\x33\xef\
 | 
				
			||||||
 | 
					\x4e\x2e\xb6\xd8\x73\x02\x11\x7b\xc2\x30\xfc\xd2\x42\xdb\x14\x49\
 | 
				
			||||||
 | 
					\xea\x01\x30\x4d\xf0\x18\x00\x6c\xa8\x23\x81\xd5\x4a\xa9\x8d\x75\
 | 
				
			||||||
 | 
					\xe8\xff\x93\x96\x4a\xa5\x2b\xa2\x28\x8a\x5f\xf9\x17\x5a\xec\xf5\
 | 
				
			||||||
 | 
					\x07\x11\xf5\x6a\xad\xbf\xb6\xd0\x36\x4d\x92\x09\x00\x4c\x13\x3c\
 | 
				
			||||||
 | 
					\x4a\x44\xcf\xda\x26\x81\x88\x6b\xc3\x30\x7c\xc6\x56\x5f\x2a\x95\
 | 
				
			||||||
 | 
					\xae\x32\xc3\x3f\x3f\xe9\x1e\x88\xf8\x7b\x14\x45\xf1\xf0\xc3\xa4\
 | 
				
			||||||
 | 
					\xda\x66\xaf\xcf\x0c\x00\xa6\x09\x56\x03\xc0\x73\x75\x84\xb2\x4e\
 | 
				
			||||||
 | 
					\x29\xf5\x64\x52\xbd\xef\xfb\xd7\x10\x51\xfc\xca\x3f\x37\xa9\x16\
 | 
				
			||||||
 | 
					\x00\x7e\xed\xea\xea\xea\x0d\x82\x60\xc4\x42\xdb\x74\x49\xa6\x00\
 | 
				
			||||||
 | 
					\x30\x10\x3c\x02\x00\xcf\xdb\x26\x83\x88\x1b\xc2\x30\x5c\x53\xab\
 | 
				
			||||||
 | 
					\xde\xf7\xfd\xeb\xcc\xf0\xcf\xaa\x55\x33\x6b\xdd\x61\x44\xec\x0d\
 | 
				
			||||||
 | 
					\xc3\xf0\x1b\x0b\x6d\x4b\x24\x99\x03\xc0\x1c\x07\x0f\x11\xd1\x0b\
 | 
				
			||||||
 | 
					\xb6\x09\xc5\x5a\xad\x75\x0c\xd2\x82\x8f\x52\xa9\x54\x88\xa2\x28\
 | 
				
			||||||
 | 
					\xfe\x78\xf7\x8c\xe3\xad\x9d\xe3\xf7\xbf\x00\x40\xaf\x52\xea\x5b\
 | 
				
			||||||
 | 
					\x0b\x6d\xcb\x24\x99\x04\xc0\x34\xc1\x83\x00\xf0\xa2\x6d\x52\x88\
 | 
				
			||||||
 | 
					\xb8\x29\x0c\xc3\x55\xf3\xe9\x7d\xdf\x2f\x99\x57\xfe\x69\x16\xcf\
 | 
				
			||||||
 | 
					\x71\xc8\xdc\xf0\x8d\x59\x68\x5b\x2a\xc9\x2c\x00\xa6\x09\x56\x11\
 | 
				
			||||||
 | 
					\xd1\x4b\x75\x24\xb6\x59\x29\x75\xcf\xb1\x7a\xdf\xf7\x6f\x30\xc3\
 | 
				
			||||||
 | 
					\x3f\x25\xe9\xde\x88\x38\x8e\x88\x7d\x41\x10\xec\x4e\xaa\x6d\xc7\
 | 
				
			||||||
 | 
					\xfa\x4c\x03\x10\x07\xe6\x79\xde\xfd\x88\x58\xcf\xfb\xfc\x2d\x4a\
 | 
				
			||||||
 | 
					\xa9\xe5\x33\xe1\xfb\xbe\x7f\x93\x19\xfe\x49\x16\x03\xf9\xc9\x9c\
 | 
				
			||||||
 | 
					\xf9\x7b\x2c\xb4\x6d\x91\x64\x1e\x00\x73\x1c\xdc\x07\x00\x9b\x6c\
 | 
				
			||||||
 | 
					\x13\x24\xa2\x6d\x5a\xeb\x25\xc5\x62\xf1\x16\x00\x88\xef\xf6\x4f\
 | 
				
			||||||
 | 
					\xb0\xd8\xeb\x07\x73\xe6\xef\xb5\xd0\xb6\x4d\xd2\x11\x00\x98\xe3\
 | 
				
			||||||
 | 
					\xe0\x5e\x22\x7a\xa5\x8e\x24\xe3\x6f\x20\xe3\x3f\x3c\x71\x2c\xf6\
 | 
				
			||||||
 | 
					\x38\x60\xce\xfc\x7d\x16\xda\xb6\x4a\x3a\x06\x00\x73\x1c\xac\x44\
 | 
				
			||||||
 | 
					\xc4\xf8\x6f\x07\x5b\xf6\x20\xa2\xfd\xb9\x5c\xae\x77\x78\x78\x78\
 | 
				
			||||||
 | 
					\x7f\xcb\x9e\xb4\x81\x4f\xd4\x51\x00\x98\x26\xb8\x9b\x88\x1a\xfe\
 | 
				
			||||||
 | 
					\x05\xd0\x3c\x99\xef\x33\x1f\xf2\x1c\x68\xe0\x4c\x5a\xba\x55\xc7\
 | 
				
			||||||
 | 
					\x01\x60\x9a\xe0\x2e\x44\xdc\xdc\xe4\x24\xf7\x12\x51\x9f\xd6\xfa\
 | 
				
			||||||
 | 
					\x60\x93\x9f\xa7\xa9\xdb\x77\x24\x00\xe6\xc6\xf0\x4e\x00\x78\xbd\
 | 
				
			||||||
 | 
					\x49\xe9\xed\x89\xa2\xa8\x6f\x64\x64\xe4\xc7\x26\xed\xdf\xb2\x6d\
 | 
				
			||||||
 | 
					\x3b\x16\x00\x73\x1c\xac\x20\xa2\x37\x1a\x9c\xe6\xee\x6a\xb5\xda\
 | 
				
			||||||
 | 
					\x57\xa9\x54\xc6\x1b\xbc\x6f\x5b\xb6\xeb\x68\x00\xcc\x71\xb0\x1c\
 | 
				
			||||||
 | 
					\x11\xdf\x6c\x44\xba\x88\xb8\xcb\x7c\xc8\x73\xa8\x11\xfb\xa5\x61\
 | 
				
			||||||
 | 
					\x8f\x8e\x07\xc0\x1c\x07\x77\x00\xc0\x96\x3a\x03\x1f\x8d\x87\x1f\
 | 
				
			||||||
 | 
					\x86\x61\xfc\x19\x7f\xc7\x3c\x58\x00\x60\x8e\x83\x65\x44\xb4\xd5\
 | 
				
			||||||
 | 
					\x72\x72\x15\x73\xc3\x77\xd8\x52\x9f\x5a\x19\x1b\x00\x4c\x13\x2c\
 | 
				
			||||||
 | 
					\x05\x80\xb7\x13\x4e\x43\x4f\x4e\x4e\xf6\x8f\x8e\x8e\x1e\x49\xa8\
 | 
				
			||||||
 | 
					\xcb\xc4\x72\x56\x00\x98\x26\x58\x42\x44\xef\xd4\x38\x9d\xc0\x71\
 | 
				
			||||||
 | 
					\x9c\xfe\xe1\xe1\xe1\xdf\x6a\x5c\x9f\xb9\x65\xec\x00\x30\x37\x86\
 | 
				
			||||||
 | 
					\x03\x88\xb8\xe0\xff\x0d\x20\xe2\x57\x44\xd4\xaf\x94\x3a\x9a\xb9\
 | 
				
			||||||
 | 
					\xa9\x26\xb8\x60\x96\x00\x98\xe3\xe0\x76\x00\x78\x6f\x9e\xac\xbe\
 | 
				
			||||||
 | 
					\x30\x6f\xf5\xfe\x4c\x90\x65\x26\x97\xb2\x05\xc0\x1c\x07\xfd\xe6\
 | 
				
			||||||
 | 
					\xab\xdf\xd9\xc3\xfb\x74\x62\x62\xa2\x6f\x6c\x6c\x2c\xfe\x5f\xc3\
 | 
				
			||||||
 | 
					\x8e\x7f\xb0\x06\xc0\x1c\x07\xbd\x88\xf8\x41\xfc\x33\x11\x7d\xdc\
 | 
				
			||||||
 | 
					\xdd\xdd\xdd\x37\x34\x34\xf4\x4f\xc7\x4f\xde\x18\x64\x0f\x80\x39\
 | 
				
			||||||
 | 
					\x0e\x7a\x10\xf1\xb6\xa9\xa9\xa9\xfe\x4a\xa5\x52\xe5\x32\xfc\xd8\
 | 
				
			||||||
 | 
					\xa7\x00\xf0\xff\xb4\xe3\x2c\x88\xd3\xf0\x05\x00\x6e\xd3\x9e\xc3\
 | 
				
			||||||
 | 
					\xaf\x34\x00\x73\x08\x04\x00\x01\x80\x79\x02\xcc\xed\x4b\x03\x08\
 | 
				
			||||||
 | 
					\x00\xcc\x13\x60\x6e\x5f\x1a\x40\x00\x60\x9e\x00\x73\xfb\xd2\x00\
 | 
				
			||||||
 | 
					\x02\x00\xf3\x04\x98\xdb\x97\x06\x10\x00\x98\x27\xc0\xdc\xbe\x34\
 | 
				
			||||||
 | 
					\x80\x00\xc0\x3c\x01\xe6\xf6\xa5\x01\x04\x00\xe6\x09\x30\xb7\x2f\
 | 
				
			||||||
 | 
					\x0d\x20\x00\x30\x4f\x80\xb9\x7d\x69\x00\x01\x80\x79\x02\xcc\xed\
 | 
				
			||||||
 | 
					\x4b\x03\x08\x00\xcc\x13\x60\x6e\x5f\x1a\x40\x00\x60\x9e\x00\x73\
 | 
				
			||||||
 | 
					\xfb\xd2\x00\x02\x00\xf3\x04\x98\xdb\x97\x06\x10\x00\x98\x27\xc0\
 | 
				
			||||||
 | 
					\xdc\xbe\x34\x80\x00\xc0\x3c\x01\xe6\xf6\xa5\x01\x04\x00\xe6\x09\
 | 
				
			||||||
 | 
					\x30\xb7\x2f\x0d\x20\x00\x30\x4f\x80\xb9\x7d\x69\x00\x01\x80\x79\
 | 
				
			||||||
 | 
					\x02\xcc\xed\x4b\x03\x08\x00\xcc\x13\x60\x6e\x5f\x1a\x40\x00\x60\
 | 
				
			||||||
 | 
					\x9e\x00\x73\xfb\xd2\x00\x02\x00\xf3\x04\x98\xdb\x97\x06\x10\x00\
 | 
				
			||||||
 | 
					\x98\x27\xc0\xdc\xbe\x34\x80\x00\xc0\x3c\x01\xe6\xf6\xa5\x01\x98\
 | 
				
			||||||
 | 
					\x03\xf0\x2f\x1a\xf0\xdc\x90\x9e\x40\x3c\x9b\x00\x00\x00\x00\x49\
 | 
				
			||||||
 | 
					\x45\x4e\x44\xae\x42\x60\x82\
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					qt_resource_name = b"\
 | 
				
			||||||
 | 
					\x00\x07\
 | 
				
			||||||
 | 
					\x07\x3b\xe0\xb3\
 | 
				
			||||||
 | 
					\x00\x70\
 | 
				
			||||||
 | 
					\x00\x6c\x00\x75\x00\x67\x00\x69\x00\x6e\x00\x73\
 | 
				
			||||||
 | 
					\x00\x06\
 | 
				
			||||||
 | 
					\x05\x04\x66\x45\
 | 
				
			||||||
 | 
					\x00\x49\
 | 
				
			||||||
 | 
					\x00\x6e\x00\x5f\x00\x6f\x00\x6e\x00\x65\
 | 
				
			||||||
 | 
					\x00\x03\
 | 
				
			||||||
 | 
					\x00\x00\x76\xf3\
 | 
				
			||||||
 | 
					\x00\x70\
 | 
				
			||||||
 | 
					\x00\x69\x00\x63\
 | 
				
			||||||
 | 
					\x00\x08\
 | 
				
			||||||
 | 
					\x09\xe6\x72\x67\
 | 
				
			||||||
 | 
					\x7b\xad\
 | 
				
			||||||
 | 
					\x59\x34\x00\x20\x53\xf3\x00\x2e\x00\x73\x00\x76\x00\x67\
 | 
				
			||||||
 | 
					\x00\x0b\
 | 
				
			||||||
 | 
					\x0f\x8a\xc9\x87\
 | 
				
			||||||
 | 
					\x7b\xad\
 | 
				
			||||||
 | 
					\x59\x34\x00\x5f\x52\x17\x88\x68\x54\x11\x53\xf3\x00\x2e\x00\x70\x00\x6e\x00\x67\
 | 
				
			||||||
 | 
					\x00\x08\
 | 
				
			||||||
 | 
					\x04\x1e\x72\x67\
 | 
				
			||||||
 | 
					\x7b\xad\
 | 
				
			||||||
 | 
					\x59\x34\x00\x20\x4e\x0b\x00\x2e\x00\x73\x00\x76\x00\x67\
 | 
				
			||||||
 | 
					\x00\x0b\
 | 
				
			||||||
 | 
					\x0e\xdf\xc8\xa7\
 | 
				
			||||||
 | 
					\x7b\xad\
 | 
				
			||||||
 | 
					\x59\x34\x00\x5f\x52\x17\x88\x68\x5c\x55\x5f\x00\x00\x2e\x00\x70\x00\x6e\x00\x67\
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					qt_resource_struct_v1 = b"\
 | 
				
			||||||
 | 
					\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
 | 
				
			||||||
 | 
					\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\
 | 
				
			||||||
 | 
					\x00\x00\x00\x14\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03\
 | 
				
			||||||
 | 
					\x00\x00\x00\x26\x00\x02\x00\x00\x00\x04\x00\x00\x00\x04\
 | 
				
			||||||
 | 
					\x00\x00\x00\x64\x00\x00\x00\x00\x00\x01\x00\x00\x0a\x32\
 | 
				
			||||||
 | 
					\x00\x00\x00\x32\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
 | 
				
			||||||
 | 
					\x00\x00\x00\x7a\x00\x00\x00\x00\x00\x01\x00\x00\x0f\x43\
 | 
				
			||||||
 | 
					\x00\x00\x00\x48\x00\x00\x00\x00\x00\x01\x00\x00\x05\x36\
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					qt_resource_struct_v2 = b"\
 | 
				
			||||||
 | 
					\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
 | 
				
			||||||
 | 
					\x00\x00\x00\x00\x00\x00\x00\x00\
 | 
				
			||||||
 | 
					\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\
 | 
				
			||||||
 | 
					\x00\x00\x00\x00\x00\x00\x00\x00\
 | 
				
			||||||
 | 
					\x00\x00\x00\x14\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03\
 | 
				
			||||||
 | 
					\x00\x00\x00\x00\x00\x00\x00\x00\
 | 
				
			||||||
 | 
					\x00\x00\x00\x26\x00\x02\x00\x00\x00\x04\x00\x00\x00\x04\
 | 
				
			||||||
 | 
					\x00\x00\x00\x00\x00\x00\x00\x00\
 | 
				
			||||||
 | 
					\x00\x00\x00\x64\x00\x00\x00\x00\x00\x01\x00\x00\x0a\x32\
 | 
				
			||||||
 | 
					\x00\x00\x01\x81\x5b\xf7\x7e\xef\
 | 
				
			||||||
 | 
					\x00\x00\x00\x32\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
 | 
				
			||||||
 | 
					\x00\x00\x01\x81\x5b\xf7\x72\x92\
 | 
				
			||||||
 | 
					\x00\x00\x00\x7a\x00\x00\x00\x00\x00\x01\x00\x00\x0f\x43\
 | 
				
			||||||
 | 
					\x00\x00\x01\x81\x5b\xfc\x68\x05\
 | 
				
			||||||
 | 
					\x00\x00\x00\x48\x00\x00\x00\x00\x00\x01\x00\x00\x05\x36\
 | 
				
			||||||
 | 
					\x00\x00\x01\x81\x5b\xfc\x85\xb4\
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					qt_version = [int(v) for v in QtCore.qVersion().split('.')]
 | 
				
			||||||
 | 
					if qt_version < [5, 8, 0]:
 | 
				
			||||||
 | 
					    rcc_version = 1
 | 
				
			||||||
 | 
					    qt_resource_struct = qt_resource_struct_v1
 | 
				
			||||||
 | 
					else:
 | 
				
			||||||
 | 
					    rcc_version = 2
 | 
				
			||||||
 | 
					    qt_resource_struct = qt_resource_struct_v2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def qInitResources():
 | 
				
			||||||
 | 
					    QtCore.qRegisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def qCleanupResources():
 | 
				
			||||||
 | 
					    QtCore.qUnregisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					qInitResources()
 | 
				
			||||||
							
								
								
									
										0
									
								
								plugins/veg_method/readme.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								plugins/veg_method/readme.md
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										12424
									
								
								plugins/veg_method/scripts/ACD.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12424
									
								
								plugins/veg_method/scripts/ACD.py
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										12424
									
								
								plugins/veg_method/scripts/AHT.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12424
									
								
								plugins/veg_method/scripts/AHT.py
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										12424
									
								
								plugins/veg_method/scripts/LHBA.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12424
									
								
								plugins/veg_method/scripts/LHBA.py
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										12424
									
								
								plugins/veg_method/scripts/OCD.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12424
									
								
								plugins/veg_method/scripts/OCD.py
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										12424
									
								
								plugins/veg_method/scripts/SH.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12424
									
								
								plugins/veg_method/scripts/SH.py
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										690
									
								
								plugins/veg_method/scripts/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										690
									
								
								plugins/veg_method/scripts/__init__.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,690 @@
 | 
				
			|||||||
 | 
					from datetime import datetime
 | 
				
			||||||
 | 
					from osgeo import gdal
 | 
				
			||||||
 | 
					import math,os
 | 
				
			||||||
 | 
					import time
 | 
				
			||||||
 | 
					from PyQt5 import QtWidgets
 | 
				
			||||||
 | 
					from sklearn.cluster import k_means
 | 
				
			||||||
 | 
					from rscder.utils.geomath import geo2imageRC, imageRC2geo
 | 
				
			||||||
 | 
					from rscder.utils.project import Project, PairLayer
 | 
				
			||||||
 | 
					from misc import Register, AlgFrontend
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					VEG_CD = Register('植被变化检测方法')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import numpy as np
 | 
				
			||||||
 | 
					from .ACD import ACD
 | 
				
			||||||
 | 
					from .AHT import AHT
 | 
				
			||||||
 | 
					from .OCD import OCD
 | 
				
			||||||
 | 
					from .LHBA import LHBA
 | 
				
			||||||
 | 
					from .SH import SH
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def warp(file,ds:gdal.Dataset,srcWin=[0,0,0,0]):
 | 
				
			||||||
 | 
					    driver = gdal.GetDriverByName('GTiff')
 | 
				
			||||||
 | 
					    xsize=ds.RasterXSize
 | 
				
			||||||
 | 
					    ysize=ds.RasterYSize
 | 
				
			||||||
 | 
					    geo=ds.GetGeoTransform()
 | 
				
			||||||
 | 
					    orj=ds.GetProjection()
 | 
				
			||||||
 | 
					    band=ds.RasterCount
 | 
				
			||||||
 | 
					    if os.path.exists(file):
 | 
				
			||||||
 | 
					        os.remove(file)
 | 
				
			||||||
 | 
					    out_ds:gdal.Dataset=driver.Create(file, xsize, ysize, band, gdal.GDT_Byte)
 | 
				
			||||||
 | 
					    out_ds.SetGeoTransform(geo)
 | 
				
			||||||
 | 
					    out_ds.SetProjection(orj)
 | 
				
			||||||
 | 
					    for b in range(1,band+1):
 | 
				
			||||||
 | 
					        out_ds.GetRasterBand(b).WriteArray(ds.ReadAsArray(*srcWin,band_list=[b]),*(0,0))
 | 
				
			||||||
 | 
					    del out_ds
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@VEG_CD.register
 | 
				
			||||||
 | 
					class BasicCD(AlgFrontend):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_name():
 | 
				
			||||||
 | 
					        return '差分法'
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def run_alg(pth1:str,pth2:str,layer_parent:PairLayer,send_message = None,*args, **kargs):
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					        ds1:gdal.Dataset=gdal.Open(pth1)
 | 
				
			||||||
 | 
					        ds2:gdal.Dataset=gdal.Open(pth2)
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        cell_size = layer_parent.cell_size
 | 
				
			||||||
 | 
					        xsize = layer_parent.size[0]
 | 
				
			||||||
 | 
					        ysize = layer_parent.size[1]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        band = ds1.RasterCount
 | 
				
			||||||
 | 
					        yblocks = ysize // cell_size[1]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        driver = gdal.GetDriverByName('GTiff')
 | 
				
			||||||
 | 
					        out_tif = os.path.join(Project().other_path, 'temp.tif')
 | 
				
			||||||
 | 
					        out_ds = driver.Create(out_tif, xsize, ysize, 1, gdal.GDT_Float32)
 | 
				
			||||||
 | 
					        geo=layer_parent.grid.geo
 | 
				
			||||||
 | 
					        proj=layer_parent.grid.proj
 | 
				
			||||||
 | 
					        out_ds.SetGeoTransform(geo)
 | 
				
			||||||
 | 
					        out_ds.SetProjection(proj)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        max_diff = 0
 | 
				
			||||||
 | 
					        min_diff = math.inf
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        start1x,start1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1])
 | 
				
			||||||
 | 
					        end1x,end1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        start2x,start2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1])
 | 
				
			||||||
 | 
					        end2x,end2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for j in range(yblocks + 1):#该改这里了
 | 
				
			||||||
 | 
					            if send_message is not None:
 | 
				
			||||||
 | 
					                send_message.emit(f'计算{j}/{yblocks}')
 | 
				
			||||||
 | 
					            block_xy1 = (start1x, start1y+j * cell_size[1])
 | 
				
			||||||
 | 
					            block_xy2 = (start2x,start2y+j*cell_size[1])
 | 
				
			||||||
 | 
					            block_xy=(0,j * cell_size[1])
 | 
				
			||||||
 | 
					            if block_xy1[1] > end1y or block_xy2[1] > end2y:
 | 
				
			||||||
 | 
					                break
 | 
				
			||||||
 | 
					            block_size=(xsize, cell_size[1])
 | 
				
			||||||
 | 
					            block_size1 = (xsize, cell_size[1])  
 | 
				
			||||||
 | 
					            block_size2 = (xsize,cell_size[1])
 | 
				
			||||||
 | 
					            if block_xy[1] + block_size[1] > ysize:
 | 
				
			||||||
 | 
					                block_size = (xsize, ysize - block_xy[1])
 | 
				
			||||||
 | 
					            if block_xy1[1] + block_size1[1] > end1y:
 | 
				
			||||||
 | 
					                block_size1 = (xsize,end1y - block_xy1[1])
 | 
				
			||||||
 | 
					            if block_xy2[1] + block_size2[1] > end2y:
 | 
				
			||||||
 | 
					                block_size2 = (xsize, end2y - block_xy2[1]) 
 | 
				
			||||||
 | 
					            block_data1 = ds1.ReadAsArray(*block_xy1, *block_size1)
 | 
				
			||||||
 | 
					            block_data2 = ds2.ReadAsArray(*block_xy2, *block_size2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if band == 1:
 | 
				
			||||||
 | 
					                block_data1 =  block_data1[None, ...]
 | 
				
			||||||
 | 
					                block_data2 =  block_data2[None, ...]
 | 
				
			||||||
 | 
					            # pdb.set_trace()
 | 
				
			||||||
 | 
					            block_diff = block_data1.sum(0) - block_data2.sum(0)
 | 
				
			||||||
 | 
					            block_diff = block_diff.astype(np.float32)
 | 
				
			||||||
 | 
					            block_diff = np.abs(block_diff)
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            min_diff = min(min_diff, block_diff[block_diff > 0].min())
 | 
				
			||||||
 | 
					            max_diff = max(max_diff, block_diff.max())
 | 
				
			||||||
 | 
					            out_ds.GetRasterBand(1).WriteArray(block_diff, *block_xy)
 | 
				
			||||||
 | 
					            if send_message is not None:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                send_message.emit(f'完成{j}/{yblocks}')
 | 
				
			||||||
 | 
					        del ds2
 | 
				
			||||||
 | 
					        del ds1
 | 
				
			||||||
 | 
					        out_ds.FlushCache()
 | 
				
			||||||
 | 
					        del out_ds
 | 
				
			||||||
 | 
					        if send_message is not None:
 | 
				
			||||||
 | 
					            send_message.emit('归一化概率中...')
 | 
				
			||||||
 | 
					        temp_in_ds = gdal.Open(out_tif) 
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(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(geo)
 | 
				
			||||||
 | 
					        out_normal_ds.SetProjection(proj)
 | 
				
			||||||
 | 
					        # hist = np.zeros(256, dtype=np.int32)
 | 
				
			||||||
 | 
					        for j in range(yblocks+1):
 | 
				
			||||||
 | 
					            block_xy = (0, j * cell_size[1])
 | 
				
			||||||
 | 
					            if block_xy[1] > ysize:
 | 
				
			||||||
 | 
					                break
 | 
				
			||||||
 | 
					            block_size = (xsize, cell_size[1])
 | 
				
			||||||
 | 
					            if block_xy[1] + block_size[1] > ysize:
 | 
				
			||||||
 | 
					                block_size = (xsize, ysize - block_xy[1])
 | 
				
			||||||
 | 
					            block_data = temp_in_ds.ReadAsArray(*block_xy, *block_size)
 | 
				
			||||||
 | 
					            block_data = (block_data - min_diff) / (max_diff - min_diff) * 255
 | 
				
			||||||
 | 
					            block_data = block_data.astype(np.uint8)
 | 
				
			||||||
 | 
					            out_normal_ds.GetRasterBand(1).WriteArray(block_data, *block_xy)
 | 
				
			||||||
 | 
					            # hist_t, _ = np.histogram(block_data, bins=256, range=(0, 256))
 | 
				
			||||||
 | 
					            # hist += hist_t
 | 
				
			||||||
 | 
					        # print(hist)
 | 
				
			||||||
 | 
					        del temp_in_ds
 | 
				
			||||||
 | 
					        del out_normal_ds
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            os.remove(out_tif)
 | 
				
			||||||
 | 
					        except:
 | 
				
			||||||
 | 
					            pass
 | 
				
			||||||
 | 
					        if send_message is not None:
 | 
				
			||||||
 | 
					            send_message.emit('差分法计算完成')
 | 
				
			||||||
 | 
					        return out_normal_tif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@VEG_CD.register
 | 
				
			||||||
 | 
					class LSTS(AlgFrontend):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_name():
 | 
				
			||||||
 | 
					        return 'LSTS'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_widget(parent=None):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        widget = QtWidgets.QWidget(parent)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return widget
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_params(widget=None):
 | 
				
			||||||
 | 
					        return dict(n=5, w_size=(3,3))
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def run_alg(pth1:str,pth2:str,layer_parent:PairLayer,send_message=None,n=5,w_size=(3,3), *args, **kws):
 | 
				
			||||||
 | 
					        ds1:gdal.Dataset=gdal.Open(pth1)
 | 
				
			||||||
 | 
					        ds2:gdal.Dataset=gdal.Open(pth2)
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        cell_size = layer_parent.cell_size
 | 
				
			||||||
 | 
					        xsize = layer_parent.size[0]
 | 
				
			||||||
 | 
					        ysize = layer_parent.size[1]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        band = ds1.RasterCount
 | 
				
			||||||
 | 
					        yblocks = ysize // cell_size[1]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        driver = gdal.GetDriverByName('GTiff')
 | 
				
			||||||
 | 
					        out_tif = os.path.join(Project().other_path, '%d.tif'%(int(datetime.now().timestamp() * 1000)))
 | 
				
			||||||
 | 
					        out_ds = driver.Create(out_tif, xsize, ysize, 1, gdal.GDT_Float32)
 | 
				
			||||||
 | 
					        geo=layer_parent.grid.geo
 | 
				
			||||||
 | 
					        proj=layer_parent.grid.proj
 | 
				
			||||||
 | 
					        out_ds.SetGeoTransform(geo)
 | 
				
			||||||
 | 
					        out_ds.SetProjection(proj)
 | 
				
			||||||
 | 
					        pixnum=w_size[0]*w_size[1]
 | 
				
			||||||
 | 
					        # send_message.emit('pixnum:'pixnum)
 | 
				
			||||||
 | 
					        max_diff = 0
 | 
				
			||||||
 | 
					        min_diff = math.inf
 | 
				
			||||||
 | 
					        win_h=w_size[0]//2 #half hight of window 
 | 
				
			||||||
 | 
					        win_w=w_size[1]//2 #half width of window
 | 
				
			||||||
 | 
					        a=[[(i+1)**j for j in range(n+1)] for i in range(pixnum)]
 | 
				
			||||||
 | 
					        A=np.array(a).astype(np.float64)# 
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        k_=np.array(range(1,n+1))
 | 
				
			||||||
 | 
					        df1=np.zeros(pixnum).astype(np.float64)
 | 
				
			||||||
 | 
					        df2=np.zeros(pixnum).astype(np.float64)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        start1x,start1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1])
 | 
				
			||||||
 | 
					        end1x,end1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        start2x,start2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1])
 | 
				
			||||||
 | 
					        end2x,end2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for j in range(yblocks + 1):
 | 
				
			||||||
 | 
					            if send_message is not None:
 | 
				
			||||||
 | 
					                send_message.emit(f'计算{j}/{yblocks}')
 | 
				
			||||||
 | 
					            block_xy1 = (start1x, start1y+j * cell_size[1])
 | 
				
			||||||
 | 
					            block_xy2 = (start2x,start2y+j*cell_size[1])
 | 
				
			||||||
 | 
					            block_xy=(0,j * cell_size[1])
 | 
				
			||||||
 | 
					            if block_xy1[1] > end1y or block_xy2[1] > end2y:
 | 
				
			||||||
 | 
					                break
 | 
				
			||||||
 | 
					            block_size=(xsize, cell_size[1])
 | 
				
			||||||
 | 
					            block_size1 = (xsize, cell_size[1])  
 | 
				
			||||||
 | 
					            block_size2 = (xsize,cell_size[1])
 | 
				
			||||||
 | 
					            if block_xy[1] + block_size[1] > ysize:
 | 
				
			||||||
 | 
					                block_size = (xsize, ysize - block_xy[1])
 | 
				
			||||||
 | 
					            if block_xy1[1] + block_size1[1] > end1y:
 | 
				
			||||||
 | 
					                block_size1 = (xsize,end1y - block_xy1[1])
 | 
				
			||||||
 | 
					            if block_xy2[1] + block_size2[1] > end2y:
 | 
				
			||||||
 | 
					                block_size2 = (xsize, end2y - block_xy2[1]) 
 | 
				
			||||||
 | 
					            block_data1 = ds1.ReadAsArray(*block_xy1, *block_size1)
 | 
				
			||||||
 | 
					            block_data2 = ds2.ReadAsArray(*block_xy2, *block_size2)
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            if band == 1:
 | 
				
			||||||
 | 
					                block_data1 =  block_data1[None, ...]
 | 
				
			||||||
 | 
					                block_data2 =  block_data2[None, ...]
 | 
				
			||||||
 | 
					            # pdb.set_trace()
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                block_data1=np.mean(block_data1,0)
 | 
				
			||||||
 | 
					                block_data2=np.mean(block_data2,0)
 | 
				
			||||||
 | 
					            block_diff=np.zeros(block_data1.shape).astype(np.float64)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            for i in range(win_h,block_size1[1]-win_h):
 | 
				
			||||||
 | 
					                for j_ in range(win_w,block_size1[0]-win_w):
 | 
				
			||||||
 | 
					                    pix=0
 | 
				
			||||||
 | 
					                    
 | 
				
			||||||
 | 
					                    #get b
 | 
				
			||||||
 | 
					                    # b1=block_data[i+win_h:i+win_h] c in range(j_-win_w,j_+win_w+1)
 | 
				
			||||||
 | 
					                    b1=block_data1[i-win_h:i+win_h+1,j_-win_w:j_+win_w+1]
 | 
				
			||||||
 | 
					                    b2=block_data2[i-win_h:i+win_h+1,j_-win_w:j_+win_w+1]
 | 
				
			||||||
 | 
					                    b1=[b if (r+1)//2 else b[::-1] for r,b in enumerate(b1)]
 | 
				
			||||||
 | 
					                    b2=[b if (r+1)//2 else b[::-1] for r,b in enumerate(b2)]
 | 
				
			||||||
 | 
					                    b1=np.expand_dims(np.concatenate(b1,0),1)
 | 
				
			||||||
 | 
					                    b2=np.expand_dims(np.concatenate(b2,0),1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    x1=np.squeeze(np.linalg.pinv(A).dot(b1))
 | 
				
			||||||
 | 
					                    x2=np.squeeze(np.linalg.pinv(A).dot(b2))
 | 
				
			||||||
 | 
					                    #df
 | 
				
			||||||
 | 
					                    k_=range(1,n+1)
 | 
				
			||||||
 | 
					                    for pix in range(1,pixnum+1):
 | 
				
			||||||
 | 
					                        df1[pix-1]=x1[1:n+1].dot(np.array([k*(pix**(k-1)) for k in k_]))
 | 
				
			||||||
 | 
					                        df2[pix-1]=x2[1:n+1].dot(np.array([k*(pix**(k-1)) for k in k_]))
 | 
				
			||||||
 | 
					                    
 | 
				
			||||||
 | 
					                    #distance 欧式距离
 | 
				
			||||||
 | 
					                    block_diff[i][j_]=np.dot(df1-df2,df1-df2)**0.5
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            min_diff = min(min_diff, block_diff[block_diff > 0].min())
 | 
				
			||||||
 | 
					            max_diff = max(max_diff, block_diff.max())
 | 
				
			||||||
 | 
					            out_ds.GetRasterBand(1).WriteArray(block_diff, *block_xy)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            send_message.emit(f'完成{j}/{yblocks}')
 | 
				
			||||||
 | 
					        del ds2
 | 
				
			||||||
 | 
					        del ds1
 | 
				
			||||||
 | 
					        out_ds.FlushCache()
 | 
				
			||||||
 | 
					        del out_ds
 | 
				
			||||||
 | 
					        if send_message is not None:
 | 
				
			||||||
 | 
					            send_message.emit('归一化概率中...')
 | 
				
			||||||
 | 
					        temp_in_ds = gdal.Open(out_tif) 
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(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(geo)
 | 
				
			||||||
 | 
					        out_normal_ds.SetProjection(proj)
 | 
				
			||||||
 | 
					        # hist = np.zeros(256, dtype=np.int32)
 | 
				
			||||||
 | 
					        for j in range(yblocks+1):
 | 
				
			||||||
 | 
					            block_xy = (0, j * cell_size[1])
 | 
				
			||||||
 | 
					            if block_xy[1] > ysize:
 | 
				
			||||||
 | 
					                break
 | 
				
			||||||
 | 
					            block_size = (xsize, cell_size[1])
 | 
				
			||||||
 | 
					            if block_xy[1] + block_size[1] > ysize:
 | 
				
			||||||
 | 
					                block_size = (xsize, ysize - block_xy[1])
 | 
				
			||||||
 | 
					            block_data = temp_in_ds.ReadAsArray(*block_xy, *block_size)
 | 
				
			||||||
 | 
					            block_data = (block_data - min_diff) / (max_diff - min_diff) * 255
 | 
				
			||||||
 | 
					            block_data = block_data.astype(np.uint8)
 | 
				
			||||||
 | 
					            out_normal_ds.GetRasterBand(1).WriteArray(block_data, *block_xy)
 | 
				
			||||||
 | 
					            # hist_t, _ = np.histogram(block_data, bins=256, range=(0, 256))
 | 
				
			||||||
 | 
					            # hist += hist_t
 | 
				
			||||||
 | 
					        # print(hist)
 | 
				
			||||||
 | 
					        del temp_in_ds
 | 
				
			||||||
 | 
					        del out_normal_ds
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            os.remove(out_tif)
 | 
				
			||||||
 | 
					        except:
 | 
				
			||||||
 | 
					            pass
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        if send_message is not None:
 | 
				
			||||||
 | 
					            send_message.emit('LSTS法计算完成')
 | 
				
			||||||
 | 
					        return out_normal_tif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@VEG_CD.register
 | 
				
			||||||
 | 
					class CVAAlg(AlgFrontend):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_name():
 | 
				
			||||||
 | 
					        return 'CVA'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def run_alg(pth1:str,pth2:str,layer_parent:PairLayer,send_message = None, *args, **kargs):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ds1:gdal.Dataset=gdal.Open(pth1)
 | 
				
			||||||
 | 
					        ds2:gdal.Dataset=gdal.Open(pth2)
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        cell_size = layer_parent.cell_size
 | 
				
			||||||
 | 
					        xsize = layer_parent.size[0]
 | 
				
			||||||
 | 
					        ysize = layer_parent.size[1]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        band = ds1.RasterCount
 | 
				
			||||||
 | 
					        yblocks = ysize // cell_size[1]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        driver = gdal.GetDriverByName('GTiff')
 | 
				
			||||||
 | 
					        out_tif = os.path.join(Project().other_path, 'temp.tif')
 | 
				
			||||||
 | 
					        out_ds = driver.Create(out_tif, xsize, ysize, 1, gdal.GDT_Float32)
 | 
				
			||||||
 | 
					        geo=layer_parent.grid.geo
 | 
				
			||||||
 | 
					        proj=layer_parent.grid.proj
 | 
				
			||||||
 | 
					        out_ds.SetGeoTransform(geo)
 | 
				
			||||||
 | 
					        out_ds.SetProjection(proj)
 | 
				
			||||||
 | 
					        max_diff = 0
 | 
				
			||||||
 | 
					        min_diff = math.inf
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        start1x,start1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1])
 | 
				
			||||||
 | 
					        end1x,end1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        start2x,start2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1])
 | 
				
			||||||
 | 
					        end2x,end2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for j in range(yblocks + 1):
 | 
				
			||||||
 | 
					            if send_message is not None:
 | 
				
			||||||
 | 
					                send_message.emit(f'计算{j}/{yblocks}')
 | 
				
			||||||
 | 
					            block_xy1 = (start1x, start1y+j * cell_size[1])
 | 
				
			||||||
 | 
					            block_xy2 = (start2x,start2y+j*cell_size[1])
 | 
				
			||||||
 | 
					            block_xy=(0,j * cell_size[1])
 | 
				
			||||||
 | 
					            if block_xy1[1] > end1y or block_xy2[1] > end2y:
 | 
				
			||||||
 | 
					                break
 | 
				
			||||||
 | 
					            block_size=(xsize, cell_size[1])
 | 
				
			||||||
 | 
					            block_size1 = (xsize, cell_size[1])  
 | 
				
			||||||
 | 
					            block_size2 = (xsize,cell_size[1])
 | 
				
			||||||
 | 
					            if block_xy[1] + block_size[1] > ysize:
 | 
				
			||||||
 | 
					                block_size = (xsize, ysize - block_xy[1])
 | 
				
			||||||
 | 
					            if block_xy1[1] + block_size1[1] > end1y:
 | 
				
			||||||
 | 
					                block_size1 = (xsize,end1y - block_xy1[1])
 | 
				
			||||||
 | 
					            if block_xy2[1] + block_size2[1] > end2y:
 | 
				
			||||||
 | 
					                block_size2 = (xsize, end2y - block_xy2[1]) 
 | 
				
			||||||
 | 
					            block_data1 = ds1.ReadAsArray(*block_xy1, *block_size1)
 | 
				
			||||||
 | 
					            block_data2 = ds2.ReadAsArray(*block_xy2, *block_size2)
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            if band == 1:
 | 
				
			||||||
 | 
					                block_data1 =  block_data1[None, ...]
 | 
				
			||||||
 | 
					                block_data2 =  block_data2[None, ...]
 | 
				
			||||||
 | 
					            # pdb.set_trace()
 | 
				
			||||||
 | 
					            block_diff=np.sum((block_data1-block_data2)**2,0)**0.5
 | 
				
			||||||
 | 
					            min_diff = min(min_diff, block_diff[block_diff > 0].min())
 | 
				
			||||||
 | 
					            max_diff = max(max_diff, block_diff.max())
 | 
				
			||||||
 | 
					            out_ds.GetRasterBand(1).WriteArray(block_diff, *block_xy)
 | 
				
			||||||
 | 
					            if send_message is not None:
 | 
				
			||||||
 | 
					                send_message.emit(f'完成{j}/{yblocks}')
 | 
				
			||||||
 | 
					        del ds2
 | 
				
			||||||
 | 
					        del ds1
 | 
				
			||||||
 | 
					        out_ds.FlushCache()
 | 
				
			||||||
 | 
					        del out_ds
 | 
				
			||||||
 | 
					        if send_message is not None:
 | 
				
			||||||
 | 
					            send_message.emit('归一化概率中...')
 | 
				
			||||||
 | 
					        temp_in_ds = gdal.Open(out_tif) 
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(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(geo)
 | 
				
			||||||
 | 
					        out_normal_ds.SetProjection(proj)
 | 
				
			||||||
 | 
					        # hist = np.zeros(256, dtype=np.int32)
 | 
				
			||||||
 | 
					        for j in range(yblocks+1):
 | 
				
			||||||
 | 
					            block_xy = (0, j * cell_size[1])
 | 
				
			||||||
 | 
					            if block_xy[1] > ysize:
 | 
				
			||||||
 | 
					                break
 | 
				
			||||||
 | 
					            block_size = (xsize, cell_size[1])
 | 
				
			||||||
 | 
					            if block_xy[1] + block_size[1] > ysize:
 | 
				
			||||||
 | 
					                block_size = (xsize, ysize - block_xy[1])
 | 
				
			||||||
 | 
					            block_data = temp_in_ds.ReadAsArray(*block_xy, *block_size)
 | 
				
			||||||
 | 
					            block_data = (block_data - min_diff) / (max_diff - min_diff) * 255
 | 
				
			||||||
 | 
					            block_data = block_data.astype(np.uint8)
 | 
				
			||||||
 | 
					            out_normal_ds.GetRasterBand(1).WriteArray(block_data, *block_xy)
 | 
				
			||||||
 | 
					            # hist_t, _ = np.histogram(block_data, bins=256, range=(0, 256))
 | 
				
			||||||
 | 
					            # hist += hist_t
 | 
				
			||||||
 | 
					        # print(hist)
 | 
				
			||||||
 | 
					        del temp_in_ds
 | 
				
			||||||
 | 
					        del out_normal_ds
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            os.remove(out_tif)
 | 
				
			||||||
 | 
					        except:
 | 
				
			||||||
 | 
					            pass
 | 
				
			||||||
 | 
					        if send_message is not None:
 | 
				
			||||||
 | 
					            send_message.emit('欧式距离计算完成')
 | 
				
			||||||
 | 
					        return out_normal_tif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@VEG_CD.register
 | 
				
			||||||
 | 
					class ACDAlg(AlgFrontend):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_name():
 | 
				
			||||||
 | 
					        return 'ACD'
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def run_alg(pth1:str,pth2:str,layer_parent:PairLayer,send_message = None, *args, **kargs):
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        if send_message is None:
 | 
				
			||||||
 | 
					            class Empty:
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                def emit(self, *args, **kws):
 | 
				
			||||||
 | 
					                    print(args)
 | 
				
			||||||
 | 
					            send_message = Empty()
 | 
				
			||||||
 | 
					            # send_message.emit = print
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        xsize = layer_parent.size[0]
 | 
				
			||||||
 | 
					        ysize = layer_parent.size[1]
 | 
				
			||||||
 | 
					        geo=layer_parent.grid.geo
 | 
				
			||||||
 | 
					        proj=layer_parent.grid.proj
 | 
				
			||||||
 | 
					        #提取公共部分
 | 
				
			||||||
 | 
					        send_message.emit('提取重叠区域数据.....')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ds2:gdal.Dataset=gdal.Open(pth2)
 | 
				
			||||||
 | 
					        temp_tif2 = os.path.join(Project().other_path,'temp2.tif')
 | 
				
			||||||
 | 
					        start2x,start2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1])
 | 
				
			||||||
 | 
					        end2x,end2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3])
 | 
				
			||||||
 | 
					        warp(temp_tif2,ds2,srcWin=[start2x,start2y,xsize,ysize])
 | 
				
			||||||
 | 
					        del ds2
 | 
				
			||||||
 | 
					        send_message.emit('图像二提取完成')
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ds1:gdal.Dataset=gdal.Open(pth1)
 | 
				
			||||||
 | 
					        temp_tif1 = os.path.join(Project().other_path, 'temp1.tif')
 | 
				
			||||||
 | 
					        start1x,start1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1])
 | 
				
			||||||
 | 
					        end1x,end1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3])
 | 
				
			||||||
 | 
					        warp(temp_tif1,ds1,srcWin=[start1x,start1y,xsize,ysize])
 | 
				
			||||||
 | 
					        del ds1
 | 
				
			||||||
 | 
					        send_message.emit('图像一提取完成')
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        #运算
 | 
				
			||||||
 | 
					        send_message.emit('开始ACD计算.....')
 | 
				
			||||||
 | 
					        time.sleep(0.1)
 | 
				
			||||||
 | 
					        out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(layer_parent.name, int(np.random.rand() * 100000)))
 | 
				
			||||||
 | 
					        ACD(temp_tif1,temp_tif2,out_normal_tif)
 | 
				
			||||||
 | 
					        #添加投影
 | 
				
			||||||
 | 
					        send_message.emit('录入投影信息.....')
 | 
				
			||||||
 | 
					        time.sleep(0.1)
 | 
				
			||||||
 | 
					        ds=gdal.Open(out_normal_tif,1)
 | 
				
			||||||
 | 
					        ds.SetGeoTransform(geo)
 | 
				
			||||||
 | 
					        ds.SetProjection(proj)
 | 
				
			||||||
 | 
					        del ds
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        return out_normal_tif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@VEG_CD.register
 | 
				
			||||||
 | 
					class AHTAlg(AlgFrontend):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_name():
 | 
				
			||||||
 | 
					        return 'AHT'
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def run_alg(pth1:str,pth2:str,layer_parent:PairLayer,send_message = None, *args, **kargs):
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        if send_message is None:
 | 
				
			||||||
 | 
					            class Empty:
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                def emit(self, *args, **kws):
 | 
				
			||||||
 | 
					                    print(args)
 | 
				
			||||||
 | 
					            send_message = Empty()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        xsize = layer_parent.size[0]
 | 
				
			||||||
 | 
					        ysize = layer_parent.size[1]
 | 
				
			||||||
 | 
					        geo=layer_parent.grid.geo
 | 
				
			||||||
 | 
					        proj=layer_parent.grid.proj
 | 
				
			||||||
 | 
					        #提取公共部分
 | 
				
			||||||
 | 
					        send_message.emit('提取重叠区域数据.....')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ds2:gdal.Dataset=gdal.Open(pth2)
 | 
				
			||||||
 | 
					        temp_tif2 = os.path.join(Project().other_path,'temp2.tif')
 | 
				
			||||||
 | 
					        start2x,start2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1])
 | 
				
			||||||
 | 
					        end2x,end2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3])
 | 
				
			||||||
 | 
					        warp(temp_tif2,ds2,srcWin=[start2x,start2y,xsize,ysize])
 | 
				
			||||||
 | 
					        del ds2
 | 
				
			||||||
 | 
					        send_message.emit('图像二提取完成')
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ds1:gdal.Dataset=gdal.Open(pth1)
 | 
				
			||||||
 | 
					        temp_tif1 = os.path.join(Project().other_path, 'temp1.tif')
 | 
				
			||||||
 | 
					        start1x,start1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1])
 | 
				
			||||||
 | 
					        end1x,end1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3])
 | 
				
			||||||
 | 
					        warp(temp_tif1,ds1,srcWin=[start1x,start1y,xsize,ysize])
 | 
				
			||||||
 | 
					        del ds1
 | 
				
			||||||
 | 
					        send_message.emit('图像一提取完成')
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        #运算
 | 
				
			||||||
 | 
					        send_message.emit('开始AHT计算.....')
 | 
				
			||||||
 | 
					        time.sleep(0.1)
 | 
				
			||||||
 | 
					        out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(layer_parent.name, int(np.random.rand() * 100000)))
 | 
				
			||||||
 | 
					        AHT(temp_tif1,temp_tif2,out_normal_tif)
 | 
				
			||||||
 | 
					        #添加投影
 | 
				
			||||||
 | 
					        send_message.emit('录入投影信息.....')
 | 
				
			||||||
 | 
					        time.sleep(0.1)
 | 
				
			||||||
 | 
					        ds=gdal.Open(out_normal_tif,1)
 | 
				
			||||||
 | 
					        ds.SetGeoTransform(geo)
 | 
				
			||||||
 | 
					        ds.SetProjection(proj)
 | 
				
			||||||
 | 
					        del ds
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        return out_normal_tif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@VEG_CD.register
 | 
				
			||||||
 | 
					class OCDAlg(AlgFrontend):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_name():
 | 
				
			||||||
 | 
					        return 'OCD'
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def run_alg(pth1:str,pth2:str,layer_parent:PairLayer,send_message = None, *args, **kargs):
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        if send_message is None:
 | 
				
			||||||
 | 
					            class Empty:
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                def emit(self, *args, **kws):
 | 
				
			||||||
 | 
					                    print(args)
 | 
				
			||||||
 | 
					            send_message = Empty()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        xsize = layer_parent.size[0]
 | 
				
			||||||
 | 
					        ysize = layer_parent.size[1]
 | 
				
			||||||
 | 
					        geo=layer_parent.grid.geo
 | 
				
			||||||
 | 
					        proj=layer_parent.grid.proj
 | 
				
			||||||
 | 
					        #提取公共部分
 | 
				
			||||||
 | 
					        send_message.emit('提取重叠区域数据.....')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ds2:gdal.Dataset=gdal.Open(pth2)
 | 
				
			||||||
 | 
					        temp_tif2 = os.path.join(Project().other_path,'temp2.tif')
 | 
				
			||||||
 | 
					        start2x,start2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1])
 | 
				
			||||||
 | 
					        end2x,end2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3])
 | 
				
			||||||
 | 
					        warp(temp_tif2,ds2,srcWin=[start2x,start2y,xsize,ysize])
 | 
				
			||||||
 | 
					        del ds2
 | 
				
			||||||
 | 
					        send_message.emit('图像二提取完成')
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ds1:gdal.Dataset=gdal.Open(pth1)
 | 
				
			||||||
 | 
					        temp_tif1 = os.path.join(Project().other_path, 'temp1.tif')
 | 
				
			||||||
 | 
					        start1x,start1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1])
 | 
				
			||||||
 | 
					        end1x,end1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3])
 | 
				
			||||||
 | 
					        warp(temp_tif1,ds1,srcWin=[start1x,start1y,xsize,ysize])
 | 
				
			||||||
 | 
					        del ds1
 | 
				
			||||||
 | 
					        send_message.emit('图像一提取完成')
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        #运算
 | 
				
			||||||
 | 
					        send_message.emit('开始OCD计算.....')
 | 
				
			||||||
 | 
					        time.sleep(0.1)
 | 
				
			||||||
 | 
					        out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(layer_parent.name, int(np.random.rand() * 100000)))
 | 
				
			||||||
 | 
					        OCD(temp_tif1,temp_tif2,out_normal_tif,Project().other_path)
 | 
				
			||||||
 | 
					        #添加投影
 | 
				
			||||||
 | 
					        send_message.emit('录入投影信息.....')
 | 
				
			||||||
 | 
					        time.sleep(0.1)
 | 
				
			||||||
 | 
					        ds=gdal.Open(out_normal_tif,1)
 | 
				
			||||||
 | 
					        ds.SetGeoTransform(geo)
 | 
				
			||||||
 | 
					        ds.SetProjection(proj)
 | 
				
			||||||
 | 
					        del ds
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        return out_normal_tif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@VEG_CD.register
 | 
				
			||||||
 | 
					class LHBAAlg(AlgFrontend):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_name():
 | 
				
			||||||
 | 
					        return 'LHBA'
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def run_alg(pth1:str,pth2:str,layer_parent:PairLayer,send_message = None, *args, **kargs):
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        if send_message is None:
 | 
				
			||||||
 | 
					            class Empty:
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                def emit(self, *args, **kws):
 | 
				
			||||||
 | 
					                    print(args)
 | 
				
			||||||
 | 
					            send_message = Empty()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        xsize = layer_parent.size[0]
 | 
				
			||||||
 | 
					        ysize = layer_parent.size[1]
 | 
				
			||||||
 | 
					        geo=layer_parent.grid.geo
 | 
				
			||||||
 | 
					        proj=layer_parent.grid.proj
 | 
				
			||||||
 | 
					        #提取公共部分
 | 
				
			||||||
 | 
					        send_message.emit('提取重叠区域数据.....')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ds2:gdal.Dataset=gdal.Open(pth2)
 | 
				
			||||||
 | 
					        temp_tif2 = os.path.join(Project().other_path,'temp2.tif')
 | 
				
			||||||
 | 
					        start2x,start2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1])
 | 
				
			||||||
 | 
					        end2x,end2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3])
 | 
				
			||||||
 | 
					        warp(temp_tif2,ds2,srcWin=[start2x,start2y,xsize,ysize])
 | 
				
			||||||
 | 
					        del ds2
 | 
				
			||||||
 | 
					        send_message.emit('图像二提取完成')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ds1:gdal.Dataset=gdal.Open(pth1)
 | 
				
			||||||
 | 
					        temp_tif1 = os.path.join(Project().other_path, 'temp1.tif')
 | 
				
			||||||
 | 
					        start1x,start1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1])
 | 
				
			||||||
 | 
					        end1x,end1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3])
 | 
				
			||||||
 | 
					        warp(temp_tif1,ds1,srcWin=[start1x,start1y,xsize,ysize])
 | 
				
			||||||
 | 
					        del ds1
 | 
				
			||||||
 | 
					        send_message.emit('图像一提取完成')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        #运算
 | 
				
			||||||
 | 
					        send_message.emit('开始LHBA计算.....')
 | 
				
			||||||
 | 
					        time.sleep(0.1)
 | 
				
			||||||
 | 
					        out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(layer_parent.name, int(np.random.rand() * 100000)))
 | 
				
			||||||
 | 
					        LHBA(temp_tif1,temp_tif2,out_normal_tif)
 | 
				
			||||||
 | 
					        #添加投影
 | 
				
			||||||
 | 
					        send_message.emit('录入投影信息.....')
 | 
				
			||||||
 | 
					        time.sleep(0.1)
 | 
				
			||||||
 | 
					        ds=gdal.Open(out_normal_tif,1)
 | 
				
			||||||
 | 
					        ds.SetGeoTransform(geo)
 | 
				
			||||||
 | 
					        ds.SetProjection(proj)
 | 
				
			||||||
 | 
					        del ds
 | 
				
			||||||
 | 
					        return out_normal_tif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@VEG_CD.register
 | 
				
			||||||
 | 
					class SHAlg(AlgFrontend):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_name():
 | 
				
			||||||
 | 
					        return 'SH'
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def run_alg(pth1:str,pth2:str,layer_parent:PairLayer,send_message = None, *args, **kargs):
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        if send_message is None:
 | 
				
			||||||
 | 
					            class Empty:
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                def emit(self, *args, **kws):
 | 
				
			||||||
 | 
					                    print(args)
 | 
				
			||||||
 | 
					            send_message = Empty()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        xsize = layer_parent.size[0]
 | 
				
			||||||
 | 
					        ysize = layer_parent.size[1]
 | 
				
			||||||
 | 
					        geo=layer_parent.grid.geo
 | 
				
			||||||
 | 
					        proj=layer_parent.grid.proj
 | 
				
			||||||
 | 
					        #提取公共部分
 | 
				
			||||||
 | 
					        send_message.emit('提取重叠区域数据.....')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ds2:gdal.Dataset=gdal.Open(pth2)
 | 
				
			||||||
 | 
					        temp_tif2 = os.path.join(Project().other_path,'temp2.tif')
 | 
				
			||||||
 | 
					        start2x,start2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1])
 | 
				
			||||||
 | 
					        end2x,end2y=geo2imageRC(ds2.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3])
 | 
				
			||||||
 | 
					        warp(temp_tif2,ds2,srcWin=[start2x,start2y,xsize,ysize])
 | 
				
			||||||
 | 
					        del ds2
 | 
				
			||||||
 | 
					        send_message.emit('图像二提取完成')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ds1:gdal.Dataset=gdal.Open(pth1)
 | 
				
			||||||
 | 
					        temp_tif1 = os.path.join(Project().other_path, 'temp1.tif')
 | 
				
			||||||
 | 
					        start1x,start1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[0],layer_parent.mask.xy[1])
 | 
				
			||||||
 | 
					        end1x,end1y=geo2imageRC(ds1.GetGeoTransform(),layer_parent.mask.xy[2],layer_parent.mask.xy[3])
 | 
				
			||||||
 | 
					        warp(temp_tif1,ds1,srcWin=[start1x,start1y,xsize,ysize])
 | 
				
			||||||
 | 
					        del ds1
 | 
				
			||||||
 | 
					        send_message.emit('图像一提取完成')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        #运算
 | 
				
			||||||
 | 
					        send_message.emit('开始SH计算.....')
 | 
				
			||||||
 | 
					        time.sleep(0.1)
 | 
				
			||||||
 | 
					        out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(layer_parent.name, int(np.random.rand() * 100000)))
 | 
				
			||||||
 | 
					        SH(temp_tif1,temp_tif2,out_normal_tif)
 | 
				
			||||||
 | 
					        #添加投影
 | 
				
			||||||
 | 
					        send_message.emit('录入投影信息.....')
 | 
				
			||||||
 | 
					        time.sleep(0.1)
 | 
				
			||||||
 | 
					        ds=gdal.Open(out_normal_tif,1)
 | 
				
			||||||
 | 
					        ds.SetGeoTransform(geo)
 | 
				
			||||||
 | 
					        ds.SetProjection(proj)
 | 
				
			||||||
 | 
					        del ds
 | 
				
			||||||
 | 
					        return out_normal_tif
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user