Skip to content
Snippets Groups Projects
main.py 45.2 KiB
Newer Older
unknown's avatar
unknown committed
# -*- coding: utf-8 -*-
"""
/***************************************************************************
 HUB TimeSeriesViewer
                                 A QGIS based time series viewer
unknown's avatar
unknown committed
                              -------------------
        begin                : 2015-08-20
        git sha              : $Format:%H$
        copyright            : (C) 2017 by HU-Berlin
        email                : benjamin.jakimow@geo.hu-berlin.de
unknown's avatar
unknown committed
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   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.                                   *
 *                                                                         *
 ***************************************************************************/
"""
unknown's avatar
unknown committed

# Import the code for the dialog
import os, sys, re, fnmatch, collections, copy, traceback, six
import logging
logger = logging.getLogger(__name__)
from qgis.core import *

from timeseriesviewer.utils import *
DEBUG = True
unknown's avatar
unknown committed

import numpy as np
import multiprocessing
Benjamin Jakimow's avatar
Benjamin Jakimow committed
#abbreviations
from timeseriesviewer import jp, mkdir, DIR_SITE_PACKAGES, file_search
from timeseriesviewer.timeseries import *
Benjamin Jakimow's avatar
Benjamin Jakimow committed

Benjamin Jakimow's avatar
Benjamin Jakimow committed

Benjamin Jakimow's avatar
Benjamin Jakimow committed

#I don't know why, but this is required to run this in QGIS
#todo: still required?
Benjamin Jakimow's avatar
Benjamin Jakimow committed
path = os.path.abspath(jp(sys.exec_prefix, '../../bin/pythonw.exe'))
unknown's avatar
unknown committed
if os.path.exists(path):
    multiprocessing.set_executable(path)
    sys.argv = [ None ]
unknown's avatar
unknown committed

Benjamin Jakimow's avatar
Benjamin Jakimow committed
#ensure that required non-standard modules are available
unknown's avatar
unknown committed

Benjamin Jakimow's avatar
Benjamin Jakimow committed

class TsvMimeDataUtils(QObject):
    def __init__(self, mimeData):
        assert isinstance(mimeData, QMimeData)
        super(TsvMimeDataUtils, self).__init__()

        self.mimeData = mimeData

        self.xmlDoc = QDomDocument()

        if self.mimeData.hasText():
            self.xmlDoc.setContent(self.mimeData.text())
        self.xmlRoot = self.xmlDoc.documentElement()
        pass

    def hasRasterStyle(self):
        if self.xmlRoot.tagName() == 'qgis':
            elem = self.xmlRoot.elementsByTagName('rasterrenderer')
            return elem.count() != 0

        return False


    def rasterStyle(self, qgisDataType):

        elem = self.xmlRoot.elementsByTagName('rasterrenderer').item(0).toElement()
        type = str(elem.attribute('type'))
        from qgis.core import QGis, QgsContrastEnhancement

        def bandSettings(colorName):
            band = int(elem.attribute(colorName + 'Band'))
            ceNode = elem.elementsByTagName(colorName + 'ContrastEnhancement').item(0)
            vMin = float(ceNode.firstChildElement('minValue').firstChild().nodeValue())
            vMax = float(ceNode.firstChildElement('maxValue').firstChild().nodeValue())
            ceName = ceNode.firstChildElement('algorithm').firstChild().nodeValue()
            ceAlg = QgsContrastEnhancement.contrastEnhancementAlgorithmFromString(ceName)
            ce = QgsContrastEnhancement(qgisDataType)
            ce.setContrastEnhancementAlgorithm(ceAlg)
            ce.setMinimumValue(vMin)
            ce.setMaximumValue(vMax)
            return band, ce

        style = None
        if type == 'multibandcolor':
                A = int(elem.attribute('alphaBand'))
                O = int(elem.attribute('opacity'))
                R, ceR = bandSettings('red')
                G, ceG = bandSettings('green')
                B, ceB = bandSettings('blue')

                style = QgsMultiBandColorRenderer(None, R, G, B)
                style.setRedContrastEnhancement(ceR)
                style.setGreenContrastEnhancement(ceG)
                style.setBlueContrastEnhancement(ceB)

        elif type == 'singlebandgrey':

            pass

        return style

class QgisTsvBridge(QObject):
    """
    Class to control interactions between TSV and a running QGIS instance
    """
    _instance = None


    @staticmethod
    def instance():
        return QgisTsvBridge._instance

        super(QgisTsvBridge, self).__init__()
        assert QgisTsvBridge._instance is None
        assert isinstance(TSV, TimeSeriesViewer)
        assert isinstance(iface, QgisInterface)
        self.iface = iface
        self.TSV = TSV
        self.ui = self.TSV.ui
        self.SpatTempVis = self
        self.syncBlocked = False

        from timeseriesviewer.ui.widgets import TimeSeriesViewerUI
        assert isinstance(self.ui, TimeSeriesViewerUI)
        self.cbQgsVectorLayer = self.ui.dockRendering.cbQgsVectorLayer
        self.gbQgsVectorLayer = self.ui.dockRendering.gbQgsVectorLayer
        self.cbQgsVectorLayer.setEnabled(True)
        self.gbQgsVectorLayer.setEnabled(True)
        self.qgsMapCanvas = self.iface.mapCanvas()
        assert isinstance(self.qgsMapCanvas, QgsMapCanvas)

        self.qgsMapCanvas.extentsChanged.connect(self.syncTsvWithQgs)
        self.qgsMapCanvas.destinationCrsChanged.connect(self.syncTsvWithQgs)


        assert isinstance(self.cbQgsVectorLayer, QgsMapLayerComboBox)
        assert isinstance(self.gbQgsVectorLayer, QgsCollapsibleGroupBox)

        self.TSV.spatialTemporalVis.sigSpatialExtentChanged.connect(self.syncQgsWithTsv)
        self.gbQgsVectorLayer.clicked.connect(self.onQgsVectorLayerChanged)
        self.cbQgsVectorLayer.layerChanged.connect(self.onQgsVectorLayerChanged)
        self.onQgsVectorLayerChanged(None)

    def syncTsvWithQgs(self, *args):
        if self.syncBlocked:
            return
        syncState = self.ui.dockNavigation.qgsSyncState()
        if any(syncState.values()):
            self.syncBlocked = True
            self.syncBlocked = True
            QTimer.singleShot(500, lambda: self.unblock())
            tsvExt = self.TSV.spatialTemporalVis.extent
            qgsExt = SpatialExtent.fromMapCanvas(self.qgsMapCanvas)
            newExtent = self.newExtent(tsvExt, syncState, qgsExt)
            self.TSV.spatialTemporalVis.setSpatialExtent(newExtent)
            self.syncBlocked = False

        pass


    def syncQgsWithTsv(self, spatialExtent):

        if self.syncBlocked:
            return


        syncState = self.ui.dockNavigation.qgsSyncState()
        if any(syncState.values()):
            self.syncBlocked = True
            QTimer.singleShot(500, lambda: self.unblock())
            tsvExt = self.TSV.spatialTemporalVis.extent
            qgsExt = SpatialExtent.fromMapCanvas(self.qgsMapCanvas)
            newExtent = self.newExtent(qgsExt, syncState, tsvExt)
            self.qgsMapCanvas.setDestinationCrs(newExtent.crs())
            self.qgsMapCanvas.setExtent(newExtent)
            self.syncBlocked = False

            QTimer.singleShot(1000, lambda : self.unblock())


    def unblock(self):
        self.syncBlocked = False

    def newExtent(self, oldExtent, syncState, newExtent):
Loading
Loading full blame...