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@geo.hu-berlin.de
committed
import os, sys, re, fnmatch, collections, copy, traceback, six, bisect
import logging
logger = logging.getLogger(__name__)
from qgis.core import *

benjamin.jakimow@geo.hu-berlin.de
committed
from PyQt4.QtXml import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *

benjamin.jakimow@geo.hu-berlin.de
committed
import numpy as np
from timeseriesviewer.utils import *
from timeseriesviewer.timeseries import SensorInstrument, TimeSeriesDatum, TimeSeries
from timeseriesviewer.ui.docks import TsvDockWidgetBase, loadUi

benjamin.jakimow@geo.hu-berlin.de
committed
from timeseriesviewer.ui.widgets import TsvMimeDataUtils, maxWidgetSizes

benjamin.jakimow@geo.hu-berlin.de
committed
from timeseriesviewer.ui.mapviewscrollarea import MapViewScrollArea
from timeseriesviewer.mapcanvas import MapCanvas
class MapViewUI(QFrame, loadUi('mapviewdefinition.ui')):
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)

benjamin.jakimow@geo.hu-berlin.de
committed
self.gbVectorRendering.toggled.connect(self.actionToggleMapViewVisibility.toggle)
#self.btnToggleMapViewVisibility.setDefaultAction(self.actionToggleMapViewVisibility)
#self.btnToggleVectorOverlay.setDefaultAction(self.actionToggleVectorVisibility)
self.btnToggleCrosshair.setDefaultAction(self.actionToggleCrosshairVisibility)
def addSensor(self, sensor):
assert isinstance(sensor, SensorInstrument)
w = MapViewSensorSettings(sensor)

benjamin.jakimow@geo.hu-berlin.de
committed
#sizePolicy = QSizePolicy(QSize)
#w.ui.
l = self.renderSettingsLayout

benjamin.jakimow@geo.hu-berlin.de
committed
lastWidgetIndex = l.count()-1
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@geo.hu-berlin.de
committed
l = self.renderSettingsLayout
l.removeWidget(sensorSettings.ui)
sensorSettings.ui.close()
#self.resize(self.sizeHint())

benjamin.jakimow@geo.hu-berlin.de
committed
class MapView(QObject):
sigRemoveMapView = pyqtSignal(object)
sigMapViewVisibility = pyqtSignal(bool)
sigVectorVisibility = pyqtSignal(bool)

benjamin.jakimow@geo.hu-berlin.de
committed
sigSensorRendererChanged = pyqtSignal(SensorInstrument, QgsRasterRenderer)

benjamin.jakimow@geo.hu-berlin.de
committed
sigCrosshairStyleChanged = pyqtSignal(CrosshairStyle)
sigShowCrosshair = pyqtSignal(bool)
sigVectorLayerChanged = pyqtSignal()

benjamin.jakimow@geo.hu-berlin.de
committed
sigShowProfiles = pyqtSignal(SpatialPoint)

benjamin.jakimow@geo.hu-berlin.de
committed
def __init__(self, mapViewCollection, name='Map View', recommended_bands=None, parent=None):

benjamin.jakimow@geo.hu-berlin.de
committed
super(MapView, self).__init__()
assert isinstance(mapViewCollection, MapViewCollectionDock)
self.ui = MapViewUI(mapViewCollection.stackedWidget)
self.ui.show()
self.ui.cbQgsVectorLayer.setFilters(QgsMapLayerProxyModel.VectorLayer)
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@geo.hu-berlin.de
committed
self.mVectorLayer = None

benjamin.jakimow@geo.hu-berlin.de
committed
self.setVectorLayer(None)

benjamin.jakimow@geo.hu-berlin.de
committed
self.mCrosshairStyle = CrosshairStyle()
self.mShowCrosshair = True

benjamin.jakimow@geo.hu-berlin.de
committed
self.ui.actionToggleVectorVisibility.toggled.connect(self.setShowVectorOverlay)
self.ui.actionToggleCrosshairVisibility.toggled.connect(self.setShowCrosshair)
self.ui.actionToggleMapViewVisibility.toggled.connect(lambda b: self.setIsVisible(not b))
self.setTitle(name)
#forward actions with reference to this band view

benjamin.jakimow@geo.hu-berlin.de
committed
def setIsVisible(self, b):
assert isinstance(b, bool)
for mapCanvas in self.mapCanvases():
assert isinstance(mapCanvas, MapCanvas)
mapCanvas.setVisible(b)
if changed:
self.sigMapViewVisibility.emit(b)
def isVisible(self):
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@geo.hu-berlin.de
committed
def setVectorLayer(self, lyr):
if isinstance(lyr, QgsVectorLayer):
#add vector layer
self.mVectorLayer = lyr
self.mVectorLayer.rendererChanged.connect(self.sigVectorLayerChanged)

benjamin.jakimow@geo.hu-berlin.de
committed
for mapCanvas in self.mapCanvases():
assert isinstance(mapCanvas, MapCanvas)

benjamin.jakimow@geo.hu-berlin.de
committed
mapCanvas.setLayers([l for l in mapCanvas.layers() if isinstance(l, QgsRasterLayer)])
mapCanvas.setLazyVectorSources([lyr])
mapCanvas.refresh()

benjamin.jakimow@geo.hu-berlin.de
committed
else:
#remove vector layers
self.mVectorLayer = None
for mapCanvas in self.mapCanvases():
mapCanvas.setLayers([l for l in mapCanvas.mLayers if not isinstance(l, QgsVectorLayer)])

benjamin.jakimow@geo.hu-berlin.de
committed
def applyStyles(self):
for sensorView in self.sensorViews.values():
sensorView.applyStyle()
def setTitle(self, title):
old = self.title()
if old != title:
self.ui.tbName.setText(title)

benjamin.jakimow@geo.hu-berlin.de
committed
def title(self):
Loading
Loading full blame...