rscder-pub/utils/project.py
2022-05-03 13:16:39 +08:00

121 lines
3.1 KiB
Python

import os
from pathlib import Path
from osgeo import gdal, gdal_array
from utils.setting import Settings
from qgis.core import QgsRasterLayer
from PyQt5.QtCore import QObject, pyqtSignal
def singleton(cls):
_instance = {}
def inner(*args, **kargs):
if cls not in _instance:
_instance[cls] = cls(*args, **kargs)
return _instance[cls]
return inner
@singleton
class Project(QObject):
project_init = pyqtSignal(bool)
def __init__(self,
parent=None):
super().__init__(parent)
self.is_init = False
self.cell_size = Settings.Project().cell_size
self.max_memory = Settings.Project().max_memory
self.max_threads = Settings.Project().max_threads
self.root = Settings.General().root
def connect(self, pair_canvas,
layer_tree,
message_box,
result_table):
self.pair_canvas = pair_canvas
self.layer_tree = layer_tree
self.message_box = message_box
self.result_table = result_table
def setup(self, file=None):
self.is_init = True
if file is None:
self.file = Path(self.root)/'project'/'untitled.cdp'
dir_name = os.path.dirname(self.file)
if not os.path.exists(dir_name):
os.makedirs(dir_name, exist_ok=True)
if not self.file.exists():
f = self.file.open('w')
f.close()
else:
self.load()
# self.project_created.emit()
self.project_init.emit(True)
def save(self):
pass
def clear(self):
'''
clear all layers
'''
self.layer_tree.clear()
self.pair_canvas.clear()
self.message_box.clear()
self.result_table.clear()
def load(self):
pass
def add_layer(self, pth1, pth2):
player = PairLayer(pth1, pth2)
if player.check():
self.layer_tree.add_layer(player)
else:
self.message_box.show_message(player.msg)
class VectorLayer:
pass
class GridLayer:
pass
class PairLayer:
def __init__(self, pth1, pth2) -> None:
self.pth1 = pth1
self.pth2 = pth2
self.l1_name = os.path.basename(pth1)
self.l2_name = os.path.basename(pth2)
self.grid_layer = GridLayer()
self.msg = ''
def check(self):
if not os.path.exists(self.pth1):
self.msg = '图层1不存在'
return False
if not os.path.exists(self.pth2):
self.msg = '图层2不存在'
return False
ds1 = gdal.Open(self.pth1)
ds2 = gdal.Open(self.pth2)
if ds1 is None or ds2 is None:
self.msg = '图层打开失败'
return False
if ds1.RasterXSize != ds2.RasterXSize or ds1.RasterYSize != ds2.RasterYSize:
self.msg = '图层尺寸不一致'
return False
del ds1
del ds2
self.l1 = QgsRasterLayer(self.pth1, self.l1_name)
self.l2 = QgsRasterLayer(self.pth2, self.l2_name)
return True