From 955f5b80ae166d5cd47a58208f56045aba25f85b Mon Sep 17 00:00:00 2001
From: "benjamin.jakimow@geo.hu-berlin.de" <q8DTkxUg-BB>
Date: Thu, 10 Aug 2017 21:05:26 +0200
Subject: [PATCH] fixed handling of vector layers after vector overlay change
 added __main__.py (in progress) added option to load center pixel
 automatically

---
 timeseriesviewer/__main__.py         | 39 +++++++++++++
 timeseriesviewer/main.py             | 28 +++++----
 timeseriesviewer/mapcanvas.py        | 21 +++----
 timeseriesviewer/mapvisualization.py |  5 +-
 timeseriesviewer/pixelloader.py      |  1 +
 timeseriesviewer/ui/renderingdock.ui | 87 ++++++++++++++++++----------
 6 files changed, 130 insertions(+), 51 deletions(-)
 create mode 100644 timeseriesviewer/__main__.py

diff --git a/timeseriesviewer/__main__.py b/timeseriesviewer/__main__.py
new file mode 100644
index 00000000..21294df5
--- /dev/null
+++ b/timeseriesviewer/__main__.py
@@ -0,0 +1,39 @@
+# -*- coding: utf-8 -*-
+
+"""
+***************************************************************************
+    
+    ---------------------
+    Date                 : 10.08.2017
+    Copyright            : (C) 2017 by Benjamin Jakimow
+    Email                : benjamin jakimow at geo dot hu-berlin dot de
+***************************************************************************
+*                                                                         *
+*   This program is free software; you can redistribute it and/or modify  *
+*   it under the terms of the GNU General Public License as published by  *
+*   the Free Software Foundation; either version 2 of the License, or     *
+*   (at your option) any later version.                                   *
+*                                                                         *
+***************************************************************************
+"""
+from __future__ import absolute_import
+import sys
+
+class run():
+
+    # add site-packages to sys.path as done by enmapboxplugin.py
+
+    from timeseriesviewer.sandbox import initQgisEnvironment
+    qgsApp = initQgisEnvironment()
+    from timeseriesviewer.main import TimeSeriesViewer
+    S = TimeSeriesViewer(None)
+    S.ui.show()
+    S.run()
+
+    #close QGIS
+    qgsApp.exec_()
+    qgsApp.exitQgis()
+
+if __name__ == '__main__':
+    from timeseriesviewer.main import __main__
+    __main__()
diff --git a/timeseriesviewer/main.py b/timeseriesviewer/main.py
index 333c1ff6..b2b441b4 100644
--- a/timeseriesviewer/main.py
+++ b/timeseriesviewer/main.py
@@ -20,10 +20,12 @@
 """
 # noinspection PyPep8Naming
 from __future__ import absolute_import
+from qgis.core import *
 import os, sys, re, fnmatch, collections, copy, traceback, six
 import logging
 logger = logging.getLogger(__name__)
-from qgis.core import *
+
+
 import qgis.utils
 from timeseriesviewer.utils import *
 
@@ -154,11 +156,12 @@ class QgisTsvBridge(QObject):
 
     sigQgisProjectClosed = pyqtSignal()
 
-    def __init__(self):
+    def __init__(self, parent=None):
         assert QgisTsvBridge._instance is None, 'Can not instantiate QgsTsvBridge twice'
+        super(QgisTsvBridge, self).__init__(parent)
         self.TSV = None
-
-
+        self.ui = None
+        self.SpatTempVis = None
     def isValid(self):
         return isinstance(self.iface, QgisInterface) and isinstance(self.TSV, TimeSeriesViewer)
 
@@ -220,7 +223,8 @@ class QgisTsvBridge(QObject):
             center = center.toCrs(extTsv.crs())
             if center:
                 self.TSV.spatialTemporalVis.setSpatialCenter(center)
-
+                if self.ui.dockRendering.cbLoadCenterPixelProfile.isChecked():
+                    self.TSV.spectralTemporalVis.loadCoordinate(center)
 
         if request == 'tsvExtent2qgsExtent':
             extent = extTsv.toCrs(extQgs.crs())
@@ -232,6 +236,8 @@ class QgisTsvBridge(QObject):
             extent = extQgs.toCrs(extTsv.crs())
             if extent:
                 self.TSV.spatialTemporalVis.setSpatialExtent(extent)
+                if self.ui.dockRendering.cbLoadCenterPixelProfile.isChecked():
+                    self.TSV.spectralTemporalVis.loadCoordinate(extent.spatialCenter())
 
 
 class TimeSeriesViewerUI(QMainWindow,
@@ -638,15 +644,17 @@ def disconnect_signal(signal):
             break
 
 
-
-if __name__ == '__main__':
-
+def main():
     # add site-packages to sys.path as done by enmapboxplugin.py
     from timeseriesviewer.sandbox import initQgisEnvironment, sandboxGui
     qgsApp = initQgisEnvironment()
 
     sandboxGui()
 
-    #close QGIS
+    # close QGIS
     qgsApp.exec_()
-    qgsApp.exitQgis()
\ No newline at end of file
+    qgsApp.exitQgis()
+
+if __name__ == '__main__':
+
+    main()
\ No newline at end of file
diff --git a/timeseriesviewer/mapcanvas.py b/timeseriesviewer/mapcanvas.py
index c36a7284..7f106bb5 100644
--- a/timeseriesviewer/mapcanvas.py
+++ b/timeseriesviewer/mapcanvas.py
@@ -135,17 +135,18 @@ class MapCanvas(QgsMapCanvas):
 
         return self.mLayers
 
-    def addLazyRasterSources(self, sources):
+    def setLazyRasterSources(self, sources):
+        del self.mLazyRasterSources[:]
         assert isinstance(sources, list)
         self.mLazyRasterSources.extend(sources[:])
 
-    def addLazyVectorSources(self, sourceLayers):
+    def setLazyVectorSources(self, sourceLayers):
         assert isinstance(sourceLayers, list)
+        del self.mLazyVectorSources[:]
         for lyr in sourceLayers:
             assert isinstance(lyr, QgsVectorLayer)
             self.mLazyVectorSources.append((lyr, lyr.source(), lyr.name(), lyr.providerType()))
 
-
     def mapSummary(self):
         from PyQt4.QtXml import QDomDocument
         dom = QDomDocument()
@@ -166,14 +167,14 @@ class MapCanvas(QgsMapCanvas):
     def setLayers(self, mapLayers):
 
 
-        oldLayerSet = set(self.layers())
-        newLayerSet = set(mapLayers)
-        diffLayers = len(oldLayerSet.symmetric_difference(newLayerSet)) > 0
-        if diffLayers:
+        oldLayers = self.layers()
+        newLayers = [l for l in mapLayers if l not in oldLayers]
+
+        if len(newLayers) > 0:
             reg = QgsMapLayerRegistry.instance()
-            reg.addMapLayers(mapLayers, False)
-            self.mLayers = mapLayers[:]
-            super(MapCanvas, self).setLayerSet([QgsMapCanvasLayer(l) for l in self.mLayers])
+            reg.addMapLayers(newLayers, False)
+        self.mLayers = mapLayers[:]
+        super(MapCanvas, self).setLayerSet([QgsMapCanvasLayer(l) for l in self.mLayers])
 
         #self.refresh()
 
diff --git a/timeseriesviewer/mapvisualization.py b/timeseriesviewer/mapvisualization.py
index bd3b03f1..87387d0e 100644
--- a/timeseriesviewer/mapvisualization.py
+++ b/timeseriesviewer/mapvisualization.py
@@ -100,7 +100,8 @@ class MapView(QObject):
 
             for mapCanvas in self.mapCanvases():
                 assert isinstance(mapCanvas, MapCanvas)
-                mapCanvas.addLazyVectorSources([lyr])
+                mapCanvas.setLayers([l for l in mapCanvas.layers() if isinstance(l, QgsRasterLayer)])
+                mapCanvas.setLazyVectorSources([lyr])
                 mapCanvas.refresh()
 
         else:
@@ -740,7 +741,7 @@ class DatumView(QObject):
         from timeseriesviewer.mapcanvas import MapCanvas
         assert isinstance(mapCanvas, MapCanvas)
         self.mapCanvases[mapView] = mapCanvas
-        mapCanvas.addLazyRasterSources([self.TSD.pathImg])
+        mapCanvas.setLazyRasterSources([self.TSD.pathImg])
         #mapCanvas.setLayers([QgsRasterLayer(self.TSD.pathImg)])
         self.L.insertWidget(self.wOffset + len(self.mapCanvases), mapCanvas)
         self.ui.update()
diff --git a/timeseriesviewer/pixelloader.py b/timeseriesviewer/pixelloader.py
index 44950183..22848262 100644
--- a/timeseriesviewer/pixelloader.py
+++ b/timeseriesviewer/pixelloader.py
@@ -30,6 +30,7 @@ import numpy as np
 from timeseriesviewer.utils import SpatialPoint, SpatialExtent, geo2px, px2geo
 from osgeo import gdal, gdal_array, osr
 import multiprocessing as mp
+#mp.freeze_support()
 from timeseriesviewer.sandbox import initQgisEnvironment
 DEBUG = False
 
diff --git a/timeseriesviewer/ui/renderingdock.ui b/timeseriesviewer/ui/renderingdock.ui
index f487e4b7..9e84e850 100644
--- a/timeseriesviewer/ui/renderingdock.ui
+++ b/timeseriesviewer/ui/renderingdock.ui
@@ -7,7 +7,7 @@
     <x>0</x>
     <y>0</y>
     <width>220</width>
-    <height>387</height>
+    <height>336</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -236,7 +236,7 @@
     <item>
      <widget class="QGroupBox" name="gbSyncQgs">
       <property name="sizePolicy">
-       <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+       <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
         <horstretch>0</horstretch>
         <verstretch>0</verstretch>
        </sizepolicy>
@@ -244,7 +244,7 @@
       <property name="minimumSize">
        <size>
         <width>0</width>
-        <height>25</height>
+        <height>0</height>
        </size>
       </property>
       <property name="maximumSize">
@@ -259,7 +259,7 @@
       <property name="flat">
        <bool>false</bool>
       </property>
-      <layout class="QGridLayout" name="gridLayout_2" rowstretch="1,0,0">
+      <layout class="QGridLayout" name="gridLayout_2" rowstretch="1,0,0,0,0">
        <property name="sizeConstraint">
         <enum>QLayout::SetMinimumSize</enum>
        </property>
@@ -269,17 +269,7 @@
        <property name="spacing">
         <number>2</number>
        </property>
-       <item row="0" column="1">
-        <widget class="QToolButton" name="btnSetQGISCenter">
-         <property name="toolTip">
-          <string>Set QGIS Map to the same map center</string>
-         </property>
-         <property name="text">
-          <string>Set Center</string>
-         </property>
-        </widget>
-       </item>
-       <item row="1" column="1">
+       <item row="2" column="1">
         <widget class="QToolButton" name="btnGetQGISCenter">
          <property name="toolTip">
           <string>Take the map center from QGIS</string>
@@ -289,17 +279,7 @@
          </property>
         </widget>
        </item>
-       <item row="0" column="2">
-        <widget class="QToolButton" name="btnSetQGISExtent">
-         <property name="toolTip">
-          <string>Try to set the QGIS map extent to the same spatial extent</string>
-         </property>
-         <property name="text">
-          <string>Set Extent</string>
-         </property>
-        </widget>
-       </item>
-       <item row="0" column="3">
+       <item row="1" column="3">
         <spacer name="horizontalSpacer">
          <property name="orientation">
           <enum>Qt::Horizontal</enum>
@@ -312,7 +292,7 @@
          </property>
         </spacer>
        </item>
-       <item row="1" column="2">
+       <item row="2" column="2">
         <widget class="QToolButton" name="btnGetQGISExtent">
          <property name="toolTip">
           <string>Take the spatial map extent from QGIS</string>
@@ -322,8 +302,44 @@
          </property>
         </widget>
        </item>
-       <item row="2" column="0" colspan="4">
+       <item row="1" column="2">
+        <widget class="QToolButton" name="btnSetQGISExtent">
+         <property name="toolTip">
+          <string>Try to set the QGIS map extent to the same spatial extent</string>
+         </property>
+         <property name="text">
+          <string>Set Extent</string>
+         </property>
+        </widget>
+       </item>
+       <item row="1" column="1">
+        <widget class="QToolButton" name="btnSetQGISCenter">
+         <property name="toolTip">
+          <string>Set QGIS Map to the same map center</string>
+         </property>
+         <property name="text">
+          <string>Set Center</string>
+         </property>
+        </widget>
+       </item>
+       <item row="0" column="1" colspan="2">
+        <widget class="QCheckBox" name="cbLoadCenterPixelProfile">
+         <property name="toolTip">
+          <string>Loads the temporal profile of the map center pixel</string>
+         </property>
+         <property name="text">
+          <string>Load center profile</string>
+         </property>
+        </widget>
+       </item>
+       <item row="3" column="0" colspan="4">
         <widget class="QgsCollapsibleGroupBox" name="gbQgsVectorLayer">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
          <property name="title">
           <string>Show Vector Overlay</string>
          </property>
@@ -357,7 +373,7 @@
             <property name="minimumSize">
              <size>
               <width>0</width>
-              <height>23</height>
+              <height>0</height>
              </size>
             </property>
            </widget>
@@ -365,6 +381,19 @@
          </layout>
         </widget>
        </item>
+       <item row="4" column="0">
+        <spacer name="verticalSpacer_2">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>0</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
       </layout>
      </widget>
     </item>
-- 
GitLab