-
Notifications
You must be signed in to change notification settings - Fork 1
/
workers.py
134 lines (103 loc) · 5.45 KB
/
workers.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
from PyQt5 import QtCore
from PyQt5.QtCore import QThread
from PyQt5.QtWidgets import QApplication
from satsearch import Search
import datetime
import dateutil
import os
class DownloadWorker(QThread):
"""
Класс для реализации загрузчика эвент-эмиттера чтобы не подвешивать UI-поток
"""
work_started = QtCore.pyqtSignal(object)
data_downloaded = QtCore.pyqtSignal(object)
work_finished = QtCore.pyqtSignal(object)
def __init__(self, scenes = None, filekeys=None, path = None, **kwargs):
super(DownloadWorker, self).__init__()
if scenes is not None:
self.scenes = scenes
else:
self.scenes = []
if filekeys is not None:
self.filekeys = filekeys
else:
self.filekeys = []
self.kwargs = kwargs
self.running = True
self.path = path
self.isRunning = True
def run(self):
if not self.isRunning:
self.isRunning = True
if self.scenes == [] or self.scenes == None:
self.data_downloaded.emit(f"[{str(datetime.datetime.now().strftime ('%H:%M:%S'))}] Отсутствуют сцены к загрузке")
self.__del__()
if self.filekeys == [] or self.filekeys == None:
self.data_downloaded.emit(f"[{str(datetime.datetime.now().strftime ('%H:%M:%S'))}] Файлы не были выбраны для загрузки")
self.__del__()
self.work_started.emit(f"[{str(datetime.datetime.now().strftime ('%H:%M:%S'))}] Загрузка снимков вот-вот начнется...")
breaker = False
for scene in self.scenes:
if scene['collection'] == 'sentinel-2-l1c':
scene_id = scene['sentinel:product_id']
elif scene['collection'] == 'landsat-8-l1':
scene_id = scene['landsat:product_id']
date_time = dateutil.parser.parse(scene['datetime']).strftime ("%Y-%m-%d")
for key in self.filekeys:
self.data_downloaded.emit("["+str(datetime.datetime.now().strftime ("%H:%M:%S")) + "]" +" Загружается файл (канал) " + str(key) + " для сцены " + str(scene_id))
filename = scene.download(key=key, path = f"{self.path}/{scene['collection']}/{date_time}")
if filename is not None:
info_out_str = f"[{str(datetime.datetime.now().strftime ('%H:%M:%S'))}] {str(key)} для сцены {str(scene_id)} был загружен и сохранен как {str(filename)}"
else:
info_out_str = f"[{str(datetime.datetime.now().strftime ('%H:%M:%S'))}] Не удалось загрузить {str(key)} для сцены {str(scene_id)}, т.к. на этот файл установлено ограничение на доступ источником снимков"
self.data_downloaded.emit(info_out_str)
if not self.isRunning:
breaker = True
break
if breaker:
break
self.work_finished.emit(f"[{str(datetime.datetime.now().strftime ('%H:%M:%S'))}] Загрузка завершена!")
def stop(self):
self.isRunning = False
def __del__(self):
self.terminate()
self.wait()
class FindWorker(QThread):
"""
Класс для реализации поисковика эвент-эмиттера чтобы не подвешивать UI-поток
"""
search_is_started = QtCore.pyqtSignal(object) # событие, когда происходит иинициализация поиска
files_are_found = QtCore.pyqtSignal(int, str) # событие, когда поисковик выполнил запрос
def __init__(self, intersects = None, time = None, query = None):
super(FindWorker, self).__init__()
self.intersects = intersects
self.time = time
self.query = query
self.isRunning = True
def run(self):
if not self.isRunning:
self.isRunning = True
items_count = 0
self.search_is_started.emit("["+str(datetime.datetime.now().strftime ("%H:%M:%S")) + "]" +" Ищу...")
# is really shit-shit code,
# но ребятишки, сделавшие API, видимо не подумали о том,
# что может потребоваться передавать параметры через OR (||)
if isinstance(self.query, dict):
if self.intersects is not None:
search = Search(intersects=self.intersects, time=self.time, query=self.query)
else:
search = Search(time=self.time, query=self.query)
items_count = search.found()
self.files_are_found.emit(items_count, self.query["collection"]["eq"])
elif isinstance(self.query, list):
for single_query in self.query:
if self.intersects is not None:
search = Search(intersects=self.intersects, time=self.time, query=single_query)
else:
search = Search(time=self.time, query=single_query)
items_count += search.found()
self.files_are_found.emit(items_count, self.query[0]["collection"]["eq"])
def stop(self):
self.isRunning = False
def __del__(self):
self.wait()