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