From 745e26c491d5b049b517ff7eb5afb05f96dbd240 Mon Sep 17 00:00:00 2001
From: unknown <geo_beja@PC-12-3465.geo.hu-berlin.de>
Date: Mon, 9 Nov 2015 17:46:10 +0100
Subject: [PATCH] daily backup

---
 qgis_add_ins.py             | 106 ++++++++++++++++++++++++
 sensecarbon_tsv.py          | 158 ++++++++++--------------------------
 sensecarbon_tsv_gui_base.ui |  91 ++++++++-------------
 3 files changed, 186 insertions(+), 169 deletions(-)
 create mode 100644 qgis_add_ins.py

diff --git a/qgis_add_ins.py b/qgis_add_ins.py
new file mode 100644
index 00000000..70d2dbb8
--- /dev/null
+++ b/qgis_add_ins.py
@@ -0,0 +1,106 @@
+from qgis.core import *
+from qgis.gui import *
+import qgis
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+class PointMapTool(QgsMapToolEmitPoint):
+
+    coordinateSelected = pyqtSignal(QgsPoint, object)
+
+
+    def __init__(self, canvas):
+        self.canvas = canvas
+        QgsMapToolEmitPoint.__init__(self, self.canvas)
+        self.marker = QgsVertexMarker(self.canvas)
+        self.marker.setColor(Qt.red)
+        self.marker.setIconSize(5)
+        self.marker.setIconType(QgsVertexMarker.ICON_CROSS) # or ICON_CROSS, ICON_X
+        self.marker.setPenWidth(3)
+
+
+    def canvasPressEvent(self, e):
+        point = self.toMapCoordinates(e.pos())
+
+        self.marker.setCenter(point)
+        self.marker.show()
+
+    def canvasReleaseEvent(self, e):
+        point = self.toMapCoordinates(e.pos())
+        self.coordinateSelected.emit(point, self.canvas.mapRenderer().destinationCrs().authid())
+        self.marker.setCenter(point)
+        self.marker.hide()
+
+
+
+
+class RectangleMapTool(QgsMapToolEmitPoint):
+
+    rectangleDrawed = pyqtSignal(QgsRectangle, object)
+
+
+    def __init__(self, canvas):
+        self.canvas = canvas
+        QgsMapToolEmitPoint.__init__(self, self.canvas)
+        self.rubberBand = QgsRubberBand(self.canvas, QGis.Polygon)
+        self.rubberBand.setColor(Qt.red)
+        self.rubberBand.setWidth(1)
+        self.reset()
+
+    def reset(self):
+        self.startPoint = self.endPoint = None
+        self.isEmittingPoint = False
+        self.rubberBand.reset(QGis.Polygon)
+
+    def canvasPressEvent(self, e):
+        self.startPoint = self.toMapCoordinates(e.pos())
+        self.endPoint = self.startPoint
+        self.isEmittingPoint = True
+        self.showRect(self.startPoint, self.endPoint)
+
+    def canvasReleaseEvent(self, e):
+        self.isEmittingPoint = False
+
+        r = self.rectangle()
+        if r is not None:
+            print("Rectangle:", r.xMinimum(), r.yMinimum(), r.xMaximum(), r.yMaximum())
+        self.reset()
+        self.rectangleDrawed.emit(r, self.canvas.mapRenderer().destinationCrs().authid())
+
+
+    def canvasMoveEvent(self, e):
+
+        if not self.isEmittingPoint:
+            return
+
+        self.endPoint = self.toMapCoordinates(e.pos())
+        self.showRect(self.startPoint, self.endPoint)
+
+    def showRect(self, startPoint, endPoint):
+        self.rubberBand.reset(QGis.Polygon)
+        if startPoint.x() == endPoint.x() or startPoint.y() == endPoint.y():
+            return
+
+        point1 = QgsPoint(startPoint.x(), startPoint.y())
+        point2 = QgsPoint(startPoint.x(), endPoint.y())
+        point3 = QgsPoint(endPoint.x(), endPoint.y())
+        point4 = QgsPoint(endPoint.x(), startPoint.y())
+
+        self.rubberBand.addPoint(point1, False)
+        self.rubberBand.addPoint(point2, False)
+        self.rubberBand.addPoint(point3, False)
+        self.rubberBand.addPoint(point4, True)    # true to update canvas
+        self.rubberBand.show()
+
+    def rectangle(self):
+        if self.startPoint is None or self.endPoint is None:
+            return None
+        elif self.startPoint.x() == self.endPoint.x() or self.startPoint.y() == self.endPoint.y():
+
+            return None
+
+        return QgsRectangle(self.startPoint, self.endPoint)
+
+    #def deactivate(self):
+    #   super(RectangleMapTool, self).deactivate()
+    #self.deactivated.emit()
diff --git a/sensecarbon_tsv.py b/sensecarbon_tsv.py
index 3270163c..09f4ace2 100644
--- a/sensecarbon_tsv.py
+++ b/sensecarbon_tsv.py
@@ -25,6 +25,7 @@ try:
     from qgis.core import *
     from qgis.gui import *
     import qgis
+    import qgis_add_ins
     qgis_available = True
 except:
     qgis_available = False
@@ -36,6 +37,11 @@ import numpy as np
 import pickle
 import six
 import multiprocessing
+#i don't know why but this is required to run this in QGIS
+path = os.path.abspath(os.path.join(sys.exec_prefix, '../../bin/pythonw.exe'))
+if os.path.exists(path):
+    multiprocessing.set_executable(path)
+    sys.argv = [ None ]
 
 from PyQt4.QtCore import *
 from PyQt4.QtGui import *
@@ -548,7 +554,7 @@ class TimeSeriesDatum(object):
             my_srs = self.getSpatialReference()
             if not my_srs.IsSame(srs):
                 #todo: consider srs differences
-                raise NotImplemented()
+                raise Exception('differeng SRS in bounding box request')
                 pass
 
         return ext
@@ -774,107 +780,6 @@ def Array2Image(d3d):
     return QImage(d3d.data, ns, nl, QImage.Format_RGB888)
 
 
-class PointMapTool(QgsMapToolEmitPoint):
-
-    coordinateSelected = pyqtSignal(QgsPoint, object)
-
-
-    def __init__(self, canvas):
-        self.canvas = canvas
-        QgsMapToolEmitPoint.__init__(self, self.canvas)
-        self.marker = QgsVertexMarker(self.canvas)
-        self.marker.setColor(Qt.red)
-        self.marker.setIconSize(5)
-        self.marker.setIconType(QgsVertexMarker.ICON_CROSS) # or ICON_CROSS, ICON_X
-        self.marker.setPenWidth(3)
-
-
-    def canvasPressEvent(self, e):
-        point = self.toMapCoordinates(e.pos())
-
-        self.marker.setCenter(point)
-        self.marker.show()
-
-    def canvasReleaseEvent(self, e):
-        point = self.toMapCoordinates(e.pos())
-        self.coordinateSelected.emit(point, self.canvas.mapRenderer().destinationCrs().authid())
-        self.marker.setCenter(point)
-        self.marker.hide()
-
-
-
-
-class RectangleMapTool(QgsMapToolEmitPoint):
-
-    rectangleDrawed = pyqtSignal(QgsRectangle, object)
-
-
-    def __init__(self, canvas):
-        self.canvas = canvas
-        QgsMapToolEmitPoint.__init__(self, self.canvas)
-        self.rubberBand = QgsRubberBand(self.canvas, QGis.Polygon)
-        self.rubberBand.setColor(Qt.red)
-        self.rubberBand.setWidth(1)
-        self.reset()
-
-    def reset(self):
-        self.startPoint = self.endPoint = None
-        self.isEmittingPoint = False
-        self.rubberBand.reset(QGis.Polygon)
-
-    def canvasPressEvent(self, e):
-        self.startPoint = self.toMapCoordinates(e.pos())
-        self.endPoint = self.startPoint
-        self.isEmittingPoint = True
-        self.showRect(self.startPoint, self.endPoint)
-
-    def canvasReleaseEvent(self, e):
-        self.isEmittingPoint = False
-
-        r = self.rectangle()
-        if r is not None:
-            print("Rectangle:", r.xMinimum(), r.yMinimum(), r.xMaximum(), r.yMaximum())
-        self.reset()
-        self.rectangleDrawed.emit(r, self.canvas.mapRenderer().destinationCrs().authid())
-
-
-    def canvasMoveEvent(self, e):
-
-        if not self.isEmittingPoint:
-            return
-
-        self.endPoint = self.toMapCoordinates(e.pos())
-        self.showRect(self.startPoint, self.endPoint)
-
-    def showRect(self, startPoint, endPoint):
-        self.rubberBand.reset(QGis.Polygon)
-        if startPoint.x() == endPoint.x() or startPoint.y() == endPoint.y():
-            return
-
-        point1 = QgsPoint(startPoint.x(), startPoint.y())
-        point2 = QgsPoint(startPoint.x(), endPoint.y())
-        point3 = QgsPoint(endPoint.x(), endPoint.y())
-        point4 = QgsPoint(endPoint.x(), startPoint.y())
-
-        self.rubberBand.addPoint(point1, False)
-        self.rubberBand.addPoint(point2, False)
-        self.rubberBand.addPoint(point3, False)
-        self.rubberBand.addPoint(point4, True)    # true to update canvas
-        self.rubberBand.show()
-
-    def rectangle(self):
-        if self.startPoint is None or self.endPoint is None:
-            return None
-        elif self.startPoint.x() == self.endPoint.x() or self.startPoint.y() == self.endPoint.y():
-
-            return None
-
-        return QgsRectangle(self.startPoint, self.endPoint)
-
-    #def deactivate(self):
-    #   super(RectangleMapTool, self).deactivate()
-    #self.deactivated.emit()
-
 
 class ImageChipBuffer(object):
 
@@ -892,7 +797,7 @@ class ImageChipBuffer(object):
     def getMissingBands(self, date, bands):
         missing = set(bands)
         if date in self.data.keys():
-            missing = missing - self.data[date].keys()
+            missing = missing - set(self.data[date].keys())
 
         return missing
 
@@ -936,6 +841,8 @@ class ImageChipBuffer(object):
             for i, c in enumerate(rgb):
                 rgb_data[i, is_masked[0], is_masked[1]] = c
 
+
+
         rgb_data = rgb_data.transpose([1,2,0]).copy()
         return QImage(rgb_data.data, ns, nl, QImage.Format_RGB888)
 
@@ -1035,9 +942,9 @@ class SenseCarbon_TSV:
             self.toolbar = self.iface.addToolBar(u'SenseCarbon TSV')
             self.toolbar.setObjectName(u'SenseCarbon TSV')
 
-            self.RectangleMapTool = RectangleMapTool(self.canvas)
+            self.RectangleMapTool = qgis_add_ins.RectangleMapTool(self.canvas)
             self.RectangleMapTool.rectangleDrawed.connect(self.ua_selectBy_Response)
-            self.PointMapTool = PointMapTool(self.canvas)
+            self.PointMapTool = qgis_add_ins.PointMapTool(self.canvas)
             self.PointMapTool.coordinateSelected.connect(self.ua_selectBy_Response)
             #self.RectangleMapTool..connect(self.ua_selectByRectangle_Done)
 
@@ -1064,7 +971,7 @@ class SenseCarbon_TSV:
         print(authid)
         print(type(authid))
         wkt = osr.GetUserInputAsWKT(str(authid))
-        print(wkt)
+        six.print_('{}'.format(wkt))
         canvas_srs.ImportFromWkt(wkt)
 
         if type(geometry) is QgsRectangle:
@@ -1269,7 +1176,7 @@ class SenseCarbon_TSV:
 
         D = self.dlg
         dx = D.doubleSpinBox_subset_size_x.value() * 0.5
-        dy = D.doubleSpinBox_subset_size_x.value() * 0.5
+        dy = D.doubleSpinBox_subset_size_y.value() * 0.5
 
         cx = D.spinBox_coordinate_x.value()
         cy = D.spinBox_coordinate_y.value()
@@ -1295,8 +1202,16 @@ class SenseCarbon_TSV:
         self.ImageChipBuffer.setBoundingBox(bb)
 
         D = self.dlg
-        size_x = D.spinBox_chipsize_x.value()
-        size_y = D.spinBox_chipsize_y.value()
+        ratio = dx / dy
+        size_px = D.spinBox_chipsize_max.value()
+        if ratio > 1: #x is largest side
+            size_x = size_px
+            size_y = int(size_px / ratio)
+        else: #y is largest
+            size_y = size_px
+            size_x = int(size_px * ratio)
+        #size_x = D.spinBox_chipsize_x.value()
+        #size_y = D.spinBox_chipsize_y.value()
 
         ScrollArea = D.scrollArea
         #S.setWidgetResizable(False)
@@ -1324,6 +1239,11 @@ class SenseCarbon_TSV:
         else:
             diff = set(dates_of_interest)
             diff = diff.symmetric_difference(self.CHIPWIDGETS.keys())
+
+        self.clearLayoutWidgets(self.CPV)
+        self.CHIPWIDGETS.clear()
+
+        if False:
             if len(diff) != 0:
                 self.clearLayoutWidgets(self.CPV)
                 self.CHIPWIDGETS.clear()
@@ -1346,11 +1266,11 @@ class SenseCarbon_TSV:
             self.CPV.addWidget(textLabel, 0, i)
             viewList = list()
             for j, view in enumerate(self.VIEWS):
-                imageLabel=QLabel()
+                imageLabel = QLabel()
                 imageLabel.setFrameShape(QFrame.StyledPanel)
                 imageLabel.setMinimumSize(size_x, size_y)
-                imageLabel.setMaximumSize(size_x, size_y)
-                imageLabel.setSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed)
+                imageLabel.setMaximumSize(size_x+1, size_y+1)
+                imageLabel.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
                 viewList.append(imageLabel)
                 self.CPV.addWidget(imageLabel,j+1, i)
             self.CHIPWIDGETS[date] = viewList
@@ -1387,13 +1307,19 @@ class SenseCarbon_TSV:
             for j, view in enumerate(self.VIEWS):
 
                 imageLabel = viewList[j]
+                imageLabel.clear()
+                #imageLabel.setScaledContents(True)
+
                 img = self.ImageChipBuffer.getChipImage(date, view)
                 pxMap = QPixmap.fromImage(img)
                 pxMap = pxMap.scaled(imageLabel.size(), Qt.KeepAspectRatio)
                 imageLabel.setPixmap(pxMap)
+                #imageLabel.update()
+                imageLabel.adjustSize()
 
                 s = ""
                 pass
+            self.CPV.layout().update()
         s = ""
 
         pass
@@ -1504,6 +1430,10 @@ class SenseCarbon_TSV:
         self.setViewNames()
 
 
+def showDataCube(data):
+    from scipy.misc import toimage
+    toimage(data).show()
+
 def run_tests():
 
     if False:
@@ -1574,11 +1504,11 @@ def run_tests():
         exit(0)
 
 
-    if False:
+    if True:
         import PyQt4.Qt
         a = PyQt4.Qt.QApplication([])
 
-        S = SenseCarbon_TSV(a)
+        S = SenseCarbon_TSV(None)
         S.run()
 
         if True:
diff --git a/sensecarbon_tsv_gui_base.ui b/sensecarbon_tsv_gui_base.ui
index 193f94a1..7fdce24e 100644
--- a/sensecarbon_tsv_gui_base.ui
+++ b/sensecarbon_tsv_gui_base.ui
@@ -240,7 +240,7 @@
           <widget class="QGroupBox" name="groupBox_spatialsubset">
            <property name="minimumSize">
             <size>
-             <width>150</width>
+             <width>0</width>
              <height>0</height>
             </size>
            </property>
@@ -376,48 +376,49 @@
           <widget class="QGroupBox" name="groupBox_rendering">
            <property name="minimumSize">
             <size>
-             <width>150</width>
-             <height>150</height>
+             <width>0</width>
+             <height>0</height>
             </size>
            </property>
            <property name="title">
-            <string>Chip Loading and Rendering</string>
+            <string>Chip Rendering</string>
            </property>
            <layout class="QGridLayout" name="gridLayout_2">
-            <item row="2" column="1">
-             <widget class="QSpinBox" name="spinBox_ncpu"/>
-            </item>
-            <item row="3" column="0">
+            <item row="2" column="0">
              <widget class="QLabel" name="label_6">
               <property name="text">
                <string>First date</string>
               </property>
              </widget>
             </item>
-            <item row="3" column="1" colspan="2">
+            <item row="0" column="0">
+             <widget class="QLabel" name="label_11">
+              <property name="text">
+               <string>max. size </string>
+              </property>
+             </widget>
+            </item>
+            <item row="2" column="1" colspan="2">
              <widget class="QComboBox" name="cb_centerdate"/>
             </item>
-            <item row="1" column="2">
-             <spacer name="horizontalSpacer_2">
-              <property name="orientation">
-               <enum>Qt::Horizontal</enum>
-              </property>
-              <property name="sizeHint" stdset="0">
-               <size>
-                <width>40</width>
-                <height>20</height>
-               </size>
+            <item row="1" column="1">
+             <widget class="QSpinBox" name="spinBox_ncpu">
+              <property name="toolTip">
+               <string>Number of CPUs used for parallel image chip calculation</string>
               </property>
-             </spacer>
+             </widget>
             </item>
             <item row="0" column="1">
-             <widget class="QSpinBox" name="spinBox_chipsize_x">
+             <widget class="QSpinBox" name="spinBox_chipsize_max">
               <property name="minimumSize">
                <size>
                 <width>100</width>
                 <height>0</height>
                </size>
               </property>
+              <property name="toolTip">
+               <string>Max. length of an image chip on screen.</string>
+              </property>
               <property name="suffix">
                <string>px</string>
               </property>
@@ -436,44 +437,24 @@
              </widget>
             </item>
             <item row="1" column="0">
-             <widget class="QLabel" name="label_10">
-              <property name="text">
-               <string>size y</string>
-              </property>
-             </widget>
-            </item>
-            <item row="0" column="0">
-             <widget class="QLabel" name="label_11">
+             <widget class="QLabel" name="label">
               <property name="text">
-               <string>size x</string>
+               <string>#cpu</string>
               </property>
              </widget>
             </item>
-            <item row="1" column="1">
-             <widget class="QSpinBox" name="spinBox_chipsize_y">
-              <property name="suffix">
-               <string>px</string>
-              </property>
-              <property name="minimum">
-               <number>20</number>
-              </property>
-              <property name="maximum">
-               <number>1000</number>
-              </property>
-              <property name="singleStep">
-               <number>10</number>
-              </property>
-              <property name="value">
-               <number>200</number>
+            <item row="0" column="2">
+             <spacer name="horizontalSpacer_2">
+              <property name="orientation">
+               <enum>Qt::Horizontal</enum>
               </property>
-             </widget>
-            </item>
-            <item row="2" column="0">
-             <widget class="QLabel" name="label">
-              <property name="text">
-               <string>#cpu</string>
+              <property name="sizeHint" stdset="0">
+               <size>
+                <width>40</width>
+                <height>20</height>
+               </size>
               </property>
-             </widget>
+             </spacer>
             </item>
            </layout>
           </widget>
@@ -550,8 +531,8 @@
              <rect>
               <x>0</x>
               <y>0</y>
-              <width>281</width>
-              <height>352</height>
+              <width>262</width>
+              <height>372</height>
              </rect>
             </property>
             <property name="sizePolicy">
-- 
GitLab