From 9a61462bb23b55d1bdaea5c38fd2c5a06159f761 Mon Sep 17 00:00:00 2001 From: "benjamin.jakimow@geo.hu-berlin.de" <q8DTkxUg-BB> Date: Mon, 19 Jun 2017 15:02:49 +0200 Subject: [PATCH] fixed errors related to sensor specific map rendering --- timeseriesviewer/mapcanvas.py | 11 +++--- timeseriesviewer/mapvisualization.py | 52 ++++++++++++++++++++-------- 2 files changed, 45 insertions(+), 18 deletions(-) diff --git a/timeseriesviewer/mapcanvas.py b/timeseriesviewer/mapcanvas.py index bdf89e88..41764aad 100644 --- a/timeseriesviewer/mapcanvas.py +++ b/timeseriesviewer/mapcanvas.py @@ -8,8 +8,6 @@ from qgis.gui import * from PyQt4.QtCore import * from PyQt4.QtGui import * from timeseriesviewer import SETTINGS -from timeseriesviewer.timeseries import TimeSeriesDatum -from mapvisualization import MapView from timeseriesviewer.utils import * from timeseriesviewer.ui.widgets import TsvScrollArea @@ -234,7 +232,7 @@ class MapCanvas(QgsMapCanvas): def stretchToCurrentExtent(self): se = self.spatialExtent() - + ceAlg = QgsContrastEnhancement.StretchToMinimumMaximum for l in self.layers(): if isinstance(l, QgsRasterLayer): r = l.renderer() @@ -248,7 +246,10 @@ class MapCanvas(QgsMapCanvas): def getCE(band, ce): stats = dp.bandStatistics(band, QgsRasterBandStats.All, extent, 500) - ce = QgsContrastEnhancement(ce) + if stats.maximumValue is None: + s = "" + ce = QgsContrastEnhancement(dp.dataType(band)) + ce.setContrastEnhancementAlgorithm(ceAlg) ce.setMinimumValue(stats.minimumValue) ce.setMaximumValue(stats.maximumValue) return ce @@ -290,6 +291,8 @@ class MapCanvas(QgsMapCanvas): SETTINGS.setValue('CANVAS_SAVE_IMG_DIR', os.path.dirname(path)) + + def setRenderer(self, renderer): #lyrs = [l for l in self.mapLayersToRender() if str(l.source()) == targetLayerUri] diff --git a/timeseriesviewer/mapvisualization.py b/timeseriesviewer/mapvisualization.py index 740dd074..c4ee4275 100644 --- a/timeseriesviewer/mapvisualization.py +++ b/timeseriesviewer/mapvisualization.py @@ -12,7 +12,7 @@ from timeseriesviewer.main import TimeSeriesViewer from timeseriesviewer.timeseries import SensorInstrument, TimeSeriesDatum from timeseriesviewer.ui.docks import TsvDockWidgetBase, load from timeseriesviewer.ui.widgets import TsvMimeDataUtils, maxWidgetSizes - +from timeseriesviewer.mapcanvas import MapCanvas class MapView(QObject): @@ -38,7 +38,7 @@ class MapView(QObject): self.ui = MapViewDefinitionUI(self, parent=parent) self.ui.create() - self.mMapCanvases = [] + self.mMapCanvases = dict() self.setVisibility(True) self.vectorLayer = None @@ -123,16 +123,19 @@ class MapView(QObject): #set basic settings sensorView = self.sensorViews[sensor] + assert isinstance(sensorView, MapViewSensorSettings) + sensorView.registerMapCanvas(mapCanvas) + + #register signals sensor specific signals mapCanvas.setRenderer(sensorView.layerRenderer()) - #register signals - sensorView.sigSensorRendererChanged.connect(mapCanvas.setRenderer) + #register non-sensor specific signals for this mpa view self.sigMapViewVisibility.connect(mapCanvas.refresh) self.sigCrosshairStyleChanged.connect(mapCanvas.setCrosshairStyle) self.sigShowCrosshair.connect(mapCanvas.setShowCrosshair) self.sigVectorLayerChanged.connect(mapCanvas.refresh) self.sigVectorVisibility.connect(mapCanvas.refresh) - self.mMapCanvases.append(mapCanvas) + @@ -195,7 +198,7 @@ class MapViewSensorSettings(QObject): Describes the rendering of images of one Sensor """ - sigSensorRendererChanged = pyqtSignal(QgsRasterRenderer) + #sigSensorRendererChanged = pyqtSignal(QgsRasterRenderer) def __init__(self, sensor, parent=None): """Constructor.""" @@ -208,7 +211,7 @@ class MapViewSensorSettings(QObject): self.ui.create() self.sensor.sigNameChanged.connect(self.onSensorNameChanged) self.onSensorNameChanged(self.sensor.name()) - + self.mMapCanvases = [] self.ui.bandNames = sensor.bandNames self.multiBandMinValues = [self.ui.tbRedMin, self.ui.tbGreenMin, self.ui.tbBlueMin] @@ -311,7 +314,7 @@ class MapViewSensorSettings(QObject): self.ui.actionSetSWIR.triggered.connect(lambda: self.setBandSelection('swIR')) - self.ui.actionApplyStyle.triggered.connect(lambda : self.sigSensorRendererChanged.emit(self.layerRenderer())) + self.ui.actionApplyStyle.triggered.connect(self.applyStyle) self.ui.actionCopyStyle.triggered.connect(lambda : QApplication.clipboard().setMimeData(self.mimeDataStyle())) self.ui.actionPasteStyle.triggered.connect(lambda : self.pasteStyleFromClipboard()) @@ -342,6 +345,13 @@ class MapViewSensorSettings(QObject): QApplication.clipboard().dataChanged.connect(self.onClipboardChange) self.onClipboardChange() + def registerMapCanvas(self, mapCanvas): + + assert isinstance(mapCanvas, MapCanvas) + self.mMapCanvases.append(mapCanvas) + mapCanvas.sigChangeSVRequest.connect(self.onMapCanvasRendererChangeRequest) + + def onSensorNameChanged(self, newName): self.sensor.sigNameChanged.connect(self.ui.labelTitle.setText) self.ui.labelTitle.setText(self.sensor.name()) @@ -354,13 +364,19 @@ class MapViewSensorSettings(QObject): if renderer is not None: self.setLayerRenderer(renderer) - def applyStyle(self): - self.sigSensorRendererChanged.emit(self.layerRenderer()) + def applyStyle(self, *args): + #self.sigSensorRendererChanged.emit(self.layerRenderer()) + r = self.layerRenderer() + for mapCanvas in self.mMapCanvases: + assert isinstance(mapCanvas, MapCanvas) + mapCanvas.setRenderer(r) def onClipboardChange(self): utils = TsvMimeDataUtils(QApplication.clipboard().mimeData()) self.ui.btnPasteStyle.setEnabled(utils.hasRasterStyle()) + def onMapCanvasRendererChangeRequest(self, mapCanvas, renderer): + self.setLayerRenderer(renderer) def setBandSelection(self, key): @@ -407,7 +423,8 @@ class MapViewSensorSettings(QObject): self.ui.labelSummary.setText(text) if MapViewSensorSettings.SignalizeImmediately: - self.sigSensorRendererChanged.emit(self.layerRenderer()) + #self.sigSensorRendererChanged.emit(self.layerRenderer()) + self.applyStyle() def setLayerRenderer(self, renderer): ui = self.ui @@ -426,13 +443,19 @@ class MapViewSensorSettings(QObject): for s in self.multiBandSliders: s.blockSignals(False) + ceRed = renderer.redContrastEnhancement() ceGreen = renderer.greenContrastEnhancement() ceBlue = renderer.blueContrastEnhancement() + if ceRed is None: + ceRed = ceGreen = ceBlue = QgsContrastEnhancement(self.sensor.bandDataType) + s = "" for i, ce in enumerate([ceRed, ceGreen, ceBlue]): - self.multiBandMinValues[i].setText(str(ce.minimumValue())) - self.multiBandMaxValues[i].setText(str(ce.maximumValue())) + vMin = ce.minimumValue() + vMax = ce.maximumValue() + self.multiBandMinValues[i].setText(str(vMin)) + self.multiBandMaxValues[i].setText(str(vMax)) idx = self.ceAlgs.values().index(ceRed.contrastEnhancementAlgorithm()) ui.comboBoxContrastEnhancement.setCurrentIndex(idx) @@ -456,7 +479,8 @@ class MapViewSensorSettings(QObject): self.updateUi() if updated and MapViewSensorSettings.SignalizeImmediately: - self.sigSensorRendererChanged.emit(renderer.clone()) + #self.sigSensorRendererChanged.emit(renderer.clone()) + self.applyStyle() def mimeDataStyle(self): r = self.layerRenderer() -- GitLab