Skip to content
Snippets Groups Projects
mapvisualization.py 62.8 KiB
Newer Older
# -*- coding: utf-8 -*-
"""
/***************************************************************************
                              HUB TimeSeriesViewer
                              -------------------
        begin                : 2015-08-20
        git sha              : $Format:%H$
        copyright            : (C) 2017 by HU-Berlin
        email                : benjamin.jakimow@geo.hu-berlin.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.                                   *
 *                                                                         *
 ***************************************************************************/
"""
# noinspection PyPep8Naming
Benjamin Jakimow's avatar
Benjamin Jakimow committed
from __future__ import absolute_import, unicode_literals
import os, sys, re, fnmatch, collections, copy, traceback, six, bisect
import logging
logger = logging.getLogger(__name__)
from qgis.core import *
from PyQt4.QtXml import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import numpy as np
from timeseriesviewer.utils import *
Benjamin Jakimow's avatar
Benjamin Jakimow committed
from timeseriesviewer.timeseries import SensorInstrument, TimeSeriesDatum, TimeSeries
from timeseriesviewer.ui.docks import TsvDockWidgetBase, loadUI
from timeseriesviewer.main import TsvMimeDataUtils
from timeseriesviewer.ui.mapviewscrollarea import MapViewScrollArea
from timeseriesviewer.mapcanvas import MapCanvas
Benjamin Jakimow's avatar
Benjamin Jakimow committed
from timeseriesviewer.crosshair import CrosshairStyle

class MapViewUI(QFrame, loadUI('mapviewdefinition.ui')):
Benjamin Jakimow's avatar
Benjamin Jakimow committed


    def __init__(self, parent=None):
        super(MapViewUI, self).__init__(parent)
        self.setupUi(self)
        self.mSensors = collections.OrderedDict()

        m = QMenu(self.btnToggleCrosshair)
        m.addAction(self.actionSetCrosshairStyle)
        #a = m.addAction('Set Crosshair Style')

        self.btnToggleCrosshair.setMenu(m)

        #connect the QActions with the QgsCollapsibleGroupBoxes
        self.gbVectorRendering.toggled.connect(self.actionToggleVectorVisibility.toggle)
        self.gbRasterRendering.toggled.connect(self.actionToggleRasterVisibility.toggle)

        self.actionToggleVectorVisibility.toggled.connect(self.gbVectorRendering.setChecked)
        self.actionToggleRasterVisibility.toggled.connect(self.gbRasterRendering.setChecked)
        #self.actionToggleRasterVisibility.toggled.connect(self.dummy)

Benjamin Jakimow's avatar
Benjamin Jakimow committed
        self.btnToggleCrosshair.setDefaultAction(self.actionToggleCrosshairVisibility)
        self.btnToggleMapViewVisibility.setDefaultAction(self.actionToggleMapViewVisibility)

    def dummy(self, *args):
        print((self.sender(), args))
        print(args)
Benjamin Jakimow's avatar
Benjamin Jakimow committed

    def addSensor(self, sensor):
        assert isinstance(sensor, SensorInstrument)

        w = MapViewSensorSettings(sensor)
        #sizePolicy = QSizePolicy(QSize)
        #w.ui.
        l = self.renderSettingsLayout
Benjamin Jakimow's avatar
Benjamin Jakimow committed
        assert sensor not in self.mSensors.keys()

Benjamin Jakimow's avatar
Benjamin Jakimow committed
        l.insertWidget(lastWidgetIndex, w.ui)
        self.mSensors[sensor] = w
        #self.resize(self.sizeHint())

        return w


    def removeSensor(self, sensor):

        assert isinstance(sensor, SensorInstrument)
        sensorSettings = self.mSensors.pop(sensor)
        assert isinstance(sensorSettings, MapViewSensorSettings)

Benjamin Jakimow's avatar
Benjamin Jakimow committed
        l.removeWidget(sensorSettings.ui)
        sensorSettings.ui.close()
        #self.resize(self.sizeHint())
class MapView(QObject):

    sigRemoveMapView = pyqtSignal(object)
    sigMapViewVisibility = pyqtSignal(bool)
    #sigVectorVisibility = pyqtSignal(bool)
    #sigRasterVisibility = pyqtSignal(bool)
Benjamin Jakimow's avatar
Benjamin Jakimow committed
    sigTitleChanged = pyqtSignal([str],[unicode])
    sigSensorRendererChanged = pyqtSignal(SensorInstrument, QgsRasterRenderer)
Benjamin Jakimow's avatar
Benjamin Jakimow committed

    sigCrosshairStyleChanged = pyqtSignal(CrosshairStyle)
    sigShowCrosshair = pyqtSignal(bool)
    sigVectorLayerChanged = pyqtSignal()

    sigShowProfiles = pyqtSignal(SpatialPoint, MapCanvas, str)
Benjamin Jakimow's avatar
Benjamin Jakimow committed
    def __init__(self, mapViewCollection, name='Map View', recommended_bands=None, parent=None):
Benjamin Jakimow's avatar
Benjamin Jakimow committed
        assert isinstance(mapViewCollection, MapViewCollectionDock)

        self.ui = MapViewUI(mapViewCollection.stackedWidget)
        self.ui.show()
        self.ui.cbQgsVectorLayer.setFilters(QgsMapLayerProxyModel.VectorLayer)
        self.ui.cbQgsVectorLayer.layerChanged.connect(self.setVectorLayer)
Benjamin Jakimow's avatar
Benjamin Jakimow committed
        self.ui.tbName.textChanged.connect(self.sigTitleChanged)
        from timeseriesviewer.crosshair import getCrosshairStyle
        self.ui.actionSetCrosshairStyle.triggered.connect(
            lambda : self.setCrosshairStyle(getCrosshairStyle(
                parent=self.ui,
                crosshairStyle=self.mCrosshairStyle))
        )

        self.mapViewCollection = mapViewCollection
        self.sensorViews = collections.OrderedDict()
Benjamin Jakimow's avatar
Benjamin Jakimow committed
        self.mCrosshairStyle = CrosshairStyle()
        self.mShowCrosshair = True
Benjamin Jakimow's avatar
Benjamin Jakimow committed

Benjamin Jakimow's avatar
Benjamin Jakimow committed
        self.mIsVisible = True
        self.mVectorsVisible = True
        self.mRastersVisible = True

        self.ui.actionToggleVectorVisibility.setChecked(True)
        self.ui.actionToggleVectorVisibility.toggled.connect(self.setVectorVisibility)

        self.ui.actionToggleRasterVisibility.setChecked(True)
        self.ui.actionToggleRasterVisibility.toggled.connect(self.setRasterVisibility)
Benjamin Jakimow's avatar
Benjamin Jakimow committed
        self.ui.actionToggleCrosshairVisibility.toggled.connect(self.setShowCrosshair)
benjamin.jakimow@geo.hu-berlin.de's avatar
benjamin.jakimow@geo.hu-berlin.de committed
        self.ui.actionToggleMapViewVisibility.toggled.connect(lambda b: self.setIsVisible(not b))
Benjamin Jakimow's avatar
Benjamin Jakimow committed



        self.ui.actionToggleVectorVisibility.setChecked(True)
        self.ui.actionToggleRasterVisibility.setChecked(True)

Benjamin Jakimow's avatar
Benjamin Jakimow committed
        self.setTitle(name)
        #forward actions with reference to this band view
    def dummy(self, *args):
        print(args)
Benjamin Jakimow's avatar
Benjamin Jakimow committed
    def setIsVisible(self, b):
        assert isinstance(b, bool)
benjamin.jakimow@geo.hu-berlin.de's avatar
benjamin.jakimow@geo.hu-berlin.de committed
        changed = b != self.mIsVisible

Benjamin Jakimow's avatar
Benjamin Jakimow committed
        self.mIsVisible = b

benjamin.jakimow@geo.hu-berlin.de's avatar
benjamin.jakimow@geo.hu-berlin.de committed
        for mapCanvas in self.mapCanvases():
            assert isinstance(mapCanvas, MapCanvas)
            mapCanvas.setVisible(b)
        if changed:
            self.sigMapViewVisibility.emit(b)


    def isVisible(self):
Benjamin Jakimow's avatar
Benjamin Jakimow committed
        return self.mIsVisible

    def mapCanvases(self):
        m = []
        for sensor, sensorView in self.sensorViews.items():
            m.extend(sensorView.mapCanvases())
        return m

    def vectorLayerRenderer(self):
        if isinstance(self.mVectorLayer, QgsVectorLayer):
            return self.mVectorLayer.rendererV2()
        return None

    def setVectorLayerRenderer(self, renderer):
        if isinstance(renderer, QgsFeatureRendererV2) and \
            isinstance(self.mVectorLayer, QgsVectorLayer):
            self.mVectorLayer.setRendererV2(renderer)

Benjamin Jakimow's avatar
Benjamin Jakimow committed

            #add vector layer
            self.mVectorLayer = lyr
            self.mVectorLayer.rendererChanged.connect(self.sigVectorLayerChanged)
Loading
Loading full blame...