From ddbc7e800fd5238ce26ceb876476738132825da8 Mon Sep 17 00:00:00 2001 From: Benjamin Jakimow <benjamin.jakimow@geo.hu-berlin.de> Date: Thu, 23 Jul 2020 14:21:13 +0200 Subject: [PATCH] mapvisualization.py - QgsProject saves visibility of time series sources Signed-off-by: Benjamin Jakimow <benjamin.jakimow@geo.hu-berlin.de> --- doc/source/changelog.rst | 6 ++-- eotimeseriesviewer/main.py | 1 + eotimeseriesviewer/mapvisualization.py | 4 +-- eotimeseriesviewer/timeseries.py | 40 +++++++++++++++++++------- 4 files changed, 37 insertions(+), 14 deletions(-) diff --git a/doc/source/changelog.rst b/doc/source/changelog.rst index 666a5211..f75636b7 100644 --- a/doc/source/changelog.rst +++ b/doc/source/changelog.rst @@ -1,8 +1,10 @@ ============== Changelog ============== -2020-07-13 (version 1.13): - * fixed CRS translation bug +2020-07-23 (version 1.13): + * time series and map settings can be stored to and reloaded from QGIS Projects + * refactored layer styling and default raster stretching + * fixed CRS translation bug and other smaller bugs * quick labels can be used to write date / datetime data into vector fields of type QDate or QDateTime * refactored context menus, e.g. in map view layer tree view, fixed `#106 <https://bitbucket.org/jakimowb/eo-time-series-viewer/issues/106>`_ diff --git a/eotimeseriesviewer/main.py b/eotimeseriesviewer/main.py index ed438ab6..b299dac9 100644 --- a/eotimeseriesviewer/main.py +++ b/eotimeseriesviewer/main.py @@ -722,6 +722,7 @@ class EOTimeSeriesViewer(QgisInterface, QObject): dt64 = datetime64(mwNode.attribute('mapDate')) if isinstance(dt64, np.datetime64): self.mPostDataLoadingArgs['mapDate'] = dt64 + self.timeSeries().sigLoadingTaskFinished.connect(self.onPostDataLoading) self.timeSeries().readXml(node) diff --git a/eotimeseriesviewer/mapvisualization.py b/eotimeseriesviewer/mapvisualization.py index 7fda2507..58ef68d7 100644 --- a/eotimeseriesviewer/mapvisualization.py +++ b/eotimeseriesviewer/mapvisualization.py @@ -218,7 +218,7 @@ class MapView(QFrame): lyr = mapView.sensorProxyLayer(sensor) lyr.setMapLayerStyle(style) - lyrNode = lyrNode.nextSibling().toElement() + lyrNode = lyrNode.nextSiblingElement() return mapView def writeXml(self, node: QDomNode, doc: QDomDocument): @@ -1330,7 +1330,7 @@ class MapWidget(QFrame): self.addMapView(mapView) - mvNode = mvNode.nextSibling().toElement() + mvNode = mvNode.nextSiblingElement() def usedLayers(self) -> typing.List[QgsMapLayer]: layers = set() diff --git a/eotimeseriesviewer/timeseries.py b/eotimeseriesviewer/timeseries.py index 5e4f6cbb..0af066f7 100644 --- a/eotimeseriesviewer/timeseries.py +++ b/eotimeseriesviewer/timeseries.py @@ -1261,6 +1261,7 @@ class TimeSeriesLoadingTask(QgsTask): def __init__(self, files: typing.List[str], + visibility: typing.List[bool] = None, description: str = "Load Images", callback=None, progress_interval: int = 3): @@ -1270,6 +1271,11 @@ class TimeSeriesLoadingTask(QgsTask): assert progress_interval >= 1 self.mFiles: typing.List[str] = files + if visibility: + assert isinstance(visibility, list) and len(visibility) == len(files) + self.mVisibility: typing.List[bool] = [b == True for b in visibility] + else: + self.mVisibility: typing.List[bool] = [True for f in files] self.mSources: typing.List[TimeSeriesSource] = [] self.mProgressInterval = datetime.timedelta(seconds=progress_interval) self.mCallback = callback @@ -1294,6 +1300,7 @@ class TimeSeriesLoadingTask(QgsTask): try: tss = TimeSeriesSource.create(path) assert isinstance(tss, TimeSeriesSource) + tss.setIsVisible(self.mVisibility[i]) self.mSources.append(tss) result_block.append(tss) del tss @@ -1829,13 +1836,17 @@ class TimeSeries(QAbstractItemModel): if len(addedDates) > 0: self.sigTimeSeriesDatesAdded.emit(addedDates) - def addSources(self, sources: list, runAsync: bool = None): + def addSources(self, + sources: list, + visibility: typing.List[bool] = None, + runAsync: bool = None): """ Adds source images to the TimeSeries :param sources: list of source images, e.g. a list of file paths :param runAsync: bool """ from eotimeseriesviewer.settings import value, Keys + if runAsync is None: runAsync = value(Keys.QgsTaskAsync, True) @@ -1852,6 +1863,7 @@ class TimeSeries(QAbstractItemModel): sourcePaths.append(path) qgsTask = TimeSeriesLoadingTask(sourcePaths, + visibility=visibility, callback=self.onTaskFinished, ) # tid = id(qgsTask) @@ -2151,7 +2163,7 @@ class TimeSeries(QAbstractItemModel): :param doc: :return: """ - tsNode = doc.createElement('EOTSV_TIMESERIES') + tsNode = doc.createElement('TimeSeries') for sensor in self.sensors(): sensorNode = doc.createElement('Sensor') @@ -2159,15 +2171,17 @@ class TimeSeries(QAbstractItemModel): tsNode.appendChild(sensorNode) for tss in self.sources(): - tssNode = doc.createElement('TIME_SERIES_SOURCE') + assert isinstance(tss, TimeSeriesSource) + tssNode = doc.createElement('TimeSeriesSource') + tssNode.setAttribute('isVisible', str(tss.isVisible())) tssNode.appendChild(doc.createTextNode((tss.uri()))) tsNode.appendChild(tssNode) node.appendChild(tsNode) return True def readXml(self, node: QDomNode): - if not node.nodeName() == 'EOTSV_TIMESERIES': - node = node.firstChildElement('EOTSV_TIMESERIES') + if not node.nodeName() == 'TimeSeries': + node = node.firstChildElement('TimeSeries') if node.isNull(): return None @@ -2184,17 +2198,23 @@ class TimeSeries(QAbstractItemModel): sensor = self.sensor(sid) if isinstance(sensor, SensorInstrument): sensor.setName(name) - sensorNode = sensorNode.nextSibling() + sensorNode = sensorNode.nextSiblingElement() - tssNode = node.firstChildElement('TIME_SERIES_SOURCE') + tssNode = node.firstChildElement('TimeSeriesSource') to_add = [] - while tssNode.nodeName() == 'TIME_SERIES_SOURCE': + tss_visibility = [] + while tssNode.nodeName() == 'TimeSeriesSource': uri = tssNode.firstChild().nodeValue() to_add.append(uri) - tssNode = tssNode.nextSibling() + if tssNode.hasAttribute('isVisible'): + tss_visibility.append(str(tssNode.attribute('isVisible')).lower() in ['1', 'true']) + else: + tss_visibility.append(True) + + tssNode = tssNode.nextSiblingElement() if len(to_add) > 0: - self.addSources(to_add, runAsync=True) + self.addSources(to_add, visibility=tss_visibility, runAsync=True) def data(self, index, role): """ -- GitLab