22from typing import Optional
33
44from osgeo import gdal
5+ from qgis .PyQt import uic
6+ from qgis .PyQt .QtWidgets import QDoubleSpinBox , QComboBox , QCheckBox , QToolButton , QLabel , QTabWidget , \
7+ QLineEdit , QTableWidget , QSpinBox
8+ from qgis .core import QgsRasterLayer , QgsSingleBandGrayRenderer , QgsRectangle , QgsMapLayer , \
9+ QgsContrastEnhancement , QgsRasterRenderer , QgsMultiBandColorRenderer , QgsSingleBandPseudoColorRenderer , \
10+ QgsMapLayerProxyModel , QgsRasterDataProvider , QgsRasterShader , QgsProject , QgsRasterTransparency
11+ from qgis .gui import (
12+ QgsDockWidget , QgsMapLayerComboBox , QgsCollapsibleGroupBox , QgsColorRampButton , QgsRangeSlider
13+ )
514
615from enmapbox .gui .dataviews .dockmanager import DockPanelUI
716from enmapbox .gui .enmapboxgui import EnMAPBox
1019from enmapbox .typeguard import typechecked
1120from enmapbox .utils import BlockSignals
1221from enmapboxprocessing .algorithm .createspectralindicesalgorithm import CreateSpectralIndicesAlgorithm
13- from enmapboxprocessing .rasterreader import RasterReader
22+ from enmapboxprocessing .rasterreader import RasterReader , metadataCache , setMetadataCache , buildMetadataCache
1423from enmapboxprocessing .rasterwriter import RasterWriter
1524from enmapboxprocessing .utils import Utils
16- from qgis .PyQt import uic
17- from qgis .PyQt .QtWidgets import QDoubleSpinBox , QComboBox , QCheckBox , QToolButton , QLabel , QTabWidget , \
18- QLineEdit , QTableWidget , QSpinBox
19- from qgis .core import QgsRasterLayer , QgsSingleBandGrayRenderer , QgsRectangle , QgsMapLayer , \
20- QgsContrastEnhancement , QgsRasterRenderer , QgsMultiBandColorRenderer , QgsSingleBandPseudoColorRenderer , \
21- QgsMapLayerProxyModel , QgsRasterDataProvider , QgsRasterShader , QgsProject , QgsRasterTransparency
22- from qgis .gui import (
23- QgsDockWidget , QgsMapLayerComboBox , QgsCollapsibleGroupBox , QgsColorRampButton , QgsRangeSlider
24- )
2525from rasterlayerstylingapp .rasterlayerstylingbandwidget import RasterLayerStylingBandWidget
2626from rasterlayerstylingapp .rasterlayerstylingpercentileswidget import RasterLayerStylingPercentilesWidget
2727
@@ -141,6 +141,8 @@ def __init__(self, enmapBox: EnMAPBox, parent=None):
141141 # init GUI
142142 self .mRenderer .setCurrentIndex (self .DefaultRendererTab )
143143
144+ self .initMinMax = 0
145+
144146 def project (self ) -> QgsProject :
145147 return self .enmapBox .project ()
146148
@@ -291,6 +293,11 @@ def onLayerChanged(self):
291293 self .disableGui ()
292294 return
293295
296+ hasNoMetadataCache = metadataCache (layer ) is None
297+ if hasNoMetadataCache :
298+ cache = buildMetadataCache (layer )
299+ setMetadataCache (layer , cache )
300+
294301 try :
295302 layer .rendererChanged .disconnect (self .onLayerRendererChanged )
296303 except Exception :
@@ -335,7 +342,9 @@ def onRendererTabChanged(self):
335342 if isinstance (self .originalRenderer , QgsMultiBandColorRenderer ):
336343 renderer = self .originalRenderer .clone ()
337344 else :
338- renderer = Utils .multiBandColorRenderer (layer .dataProvider (), [1 ] * 3 , [nan ] * 3 , [nan ] * 3 )
345+ renderer = Utils .multiBandColorRenderer (
346+ layer .dataProvider (), [1 ] * 3 , [self .initMinMax ] * 3 , [self .initMinMax ] * 3
347+ )
339348 layer .setRenderer (renderer )
340349
341350 for mBand , ce , bandNo in [
@@ -358,7 +367,7 @@ def onRendererTabChanged(self):
358367 if isinstance (self .originalRenderer , QgsSingleBandGrayRenderer ):
359368 renderer = self .originalRenderer .clone ()
360369 else :
361- renderer = Utils .singleBandGrayRenderer (layer .dataProvider (), 1 , nan , nan )
370+ renderer = Utils .singleBandGrayRenderer (layer .dataProvider (), 1 , self . initMinMax , self . initMinMax )
362371 layer .setRenderer (renderer )
363372 ce : QgsContrastEnhancement = renderer .contrastEnhancement ()
364373
@@ -377,7 +386,9 @@ def onRendererTabChanged(self):
377386 if isinstance (self .originalRenderer , QgsSingleBandPseudoColorRenderer ):
378387 renderer = self .originalRenderer .clone ()
379388 else :
380- renderer = Utils .singleBandPseudoColorRenderer (layer .dataProvider (), 1 , nan , nan , None )
389+ renderer = Utils .singleBandPseudoColorRenderer (
390+ layer .dataProvider (), 1 , self .initMinMax , self .initMinMax , None
391+ )
381392 layer .setRenderer (renderer )
382393 shader : QgsRasterShader = renderer .shader ()
383394
@@ -427,16 +438,22 @@ def onBandChanged(self):
427438 # If so, create a new renderer with correct type.
428439 if self .mRenderer .currentIndex () == self .RgbRendererTab :
429440 if not isinstance (layer .renderer (), QgsMultiBandColorRenderer ):
430- renderer = Utils .multiBandColorRenderer (layer .dataProvider (), [bandNo ] * 3 , [nan ] * 3 , [nan ] * 3 )
441+ renderer = Utils .multiBandColorRenderer (
442+ layer .dataProvider (), [bandNo ] * 3 , [self .initMinMax ] * 3 , [self .initMinMax ] * 3
443+ )
431444 layer .setRenderer (renderer )
432445 elif self .mRenderer .currentIndex () == self .GrayRendererTab :
433446 if not isinstance (layer .renderer (), QgsSingleBandGrayRenderer ):
434- renderer = Utils .singleBandGrayRenderer (layer .dataProvider (), bandNo , nan , nan )
447+ renderer = Utils .singleBandGrayRenderer (layer .dataProvider (), bandNo , self . initMinMax , self . initMinMax )
435448 layer .setRenderer (renderer )
436449 elif self .mRenderer .currentIndex () == self .PseudoRendererTab :
437450 if not isinstance (layer .renderer (), QgsSingleBandPseudoColorRenderer ):
438- renderer = Utils .singleBandPseudoColorRenderer (layer .dataProvider (), bandNo , nan , nan , None )
451+ renderer = Utils .singleBandPseudoColorRenderer (
452+ layer .dataProvider (), bandNo , self .initMinMax , self .initMinMax , None
453+ )
439454 layer .setRenderer (renderer )
455+ elif self .mRenderer .currentIndex () == self .DefaultRendererTab :
456+ pass
440457 else :
441458 raise ValueError ()
442459
@@ -534,6 +551,8 @@ def onTransparencyRangeChanged(self):
534551 lower , upper = provider .cumulativeCut (
535552 bandNo , max (p1 , 0 ) / 100. , min (p2 , 100 ) / 100. , layer .extent (), int (QgsRasterLayer .SAMPLE_SIZE )
536553 )
554+ if lower is nan or upper is nan :
555+ lower = upper = 0
537556 if p1 == 0 :
538557 self .mTransparencyLower .setText ('' )
539558 else :
@@ -591,6 +610,8 @@ def setCumulativeCut(bandNo: int, mBandMin: QLineEdit, mBandMax: QLineEdit):
591610 bandNo , self .mP1 .value () / 100. , self .mP2 .value () / 100. , extent ,
592611 self .currentSampleSize (self .mAccuracy .currentIndex ())
593612 )
613+ if vmin is nan or vmax is nan :
614+ vmin = vmax = 0
594615
595616 with BlockSignals (mBandMin , mBandMax ):
596617 mBandMin .setText (str (vmin ))
@@ -757,6 +778,13 @@ def updateLinkedLayerRenderer(self):
757778 self .currentSampleSize (accuracyType )
758779 )
759780
781+ if redMin is nan or redMax is nan :
782+ redMin = redMax = 0
783+ if greenMin is nan or greenMax is nan :
784+ greenMin = greenMax = 0
785+ if blueMin is nan or blueMax is nan :
786+ blueMin = blueMax = 0
787+
760788 elif stretchType == self .ReferenceLayerStrech :
761789 ce : QgsContrastEnhancement = renderer .redContrastEnhancement ()
762790 redMin = ce .minimumValue ()
@@ -831,6 +859,8 @@ def updateLinkedLayerRenderer(self):
831859 bandNo , p1 / 100. , p2 / 100. , self .currentExtent (layer2 , statisticsType ),
832860 self .currentSampleSize (accuracyType )
833861 )
862+ if redMin is nan or redMax is nan :
863+ redMin = redMax = 0
834864
835865 elif stretchType == self .ReferenceLayerStrech :
836866 ce : QgsContrastEnhancement = renderer .contrastEnhancement ()
@@ -871,6 +901,8 @@ def updateLinkedLayerRenderer(self):
871901 bandNo , p1 / 100. , p2 / 100. , self .currentExtent (layer2 , statisticsType ),
872902 self .currentSampleSize (accuracyType )
873903 )
904+ if redMin is nan or redMax is nan :
905+ redMin = redMax = 0
874906 elif stretchType == self .ReferenceLayerStrech :
875907 shader : QgsRasterShader = renderer .shader ()
876908 redMin = shader .minimumValue ()
@@ -953,6 +985,10 @@ def enableGui(self):
953985# utils
954986def tofloat (text : str ) -> float :
955987 try :
956- return float (text )
988+ value = float (text )
989+ if value is nan :
990+ value = 0
957991 except Exception :
958- return nan
992+ value = 0
993+
994+ return value
0 commit comments