diff --git a/eotimeseriesviewer/main.py b/eotimeseriesviewer/main.py index 0eded9ad88adb5722c9a581b9ae49c1ad64e2d39..2d18bee4c0c8f2796190f4187451ebe7b5d9e251 100644 --- a/eotimeseriesviewer/main.py +++ b/eotimeseriesviewer/main.py @@ -385,6 +385,8 @@ class TimeSeriesViewer(QgisInterface, QObject): mw.sigSpatialExtentChanged.connect(self.timeSeries().setCurrentSpatialExtent) mw.sigVisibleDatesChanged.connect(self.timeSeries().setVisibleDates) mw.sigMapViewAdded.connect(self.onMapViewAdded) + mw.sigCurrentLocationChanged.connect(self.setCurrentLocation) + self.ui.actionNextTSD.triggered.connect(mw.moveToNextTSD) self.ui.actionPreviousTSD.triggered.connect(mw.moveToPreviousTSD) diff --git a/eotimeseriesviewer/mapcanvas.py b/eotimeseriesviewer/mapcanvas.py index 1c62bdf18394ecf86f9911674e2f1c0717a3dcbf..54eac45c117f3c97ed810f15d0271253db6b48b1 100644 --- a/eotimeseriesviewer/mapcanvas.py +++ b/eotimeseriesviewer/mapcanvas.py @@ -292,7 +292,7 @@ class MapCanvas(QgsMapCanvas): saveFileDirectories = dict() - sigShowProfiles = pyqtSignal(SpatialPoint, str) + #sigShowProfiles = pyqtSignal(SpatialPoint, str) sigSpatialExtentChanged = pyqtSignal(SpatialExtent) #sigChangeDVRequest = pyqtSignal(QgsMapCanvas, str) #sigChangeMVRequest = pyqtSignal(QgsMapCanvas, str) diff --git a/eotimeseriesviewer/mapvisualization.py b/eotimeseriesviewer/mapvisualization.py index 1684bb5aecee17b4b2d54e3ce5901adbd75704c7..5018e0f78384ea33266a41e619f5526f993ad92b 100644 --- a/eotimeseriesviewer/mapvisualization.py +++ b/eotimeseriesviewer/mapvisualization.py @@ -825,6 +825,7 @@ class MapWidget(QFrame, loadUIFormClass(jp(DIR_UI, 'mapwidget.ui'))): sigMapViewAdded = pyqtSignal(MapView) sigMapViewRemoved = pyqtSignal(MapView) sigCurrentDateChanged = pyqtSignal(TimeSeriesDate) + sigCurrentLocationChanged = pyqtSignal(SpatialPoint, MapCanvas) sigVisibleDatesChanged = pyqtSignal(list) sigViewModeChanged = pyqtSignal(ViewMode) @@ -842,6 +843,7 @@ class MapWidget(QFrame, loadUIFormClass(jp(DIR_UI, 'mapwidget.ui'))): self.mMapLayerStore = QgsMapLayerStore() self.mMapViews = [] self.mCanvases = dict() + self.mCanvasSignals = dict() self.mTimeSeries = None self.mMapToolKey = MapTools.Pan @@ -1236,11 +1238,15 @@ class MapWidget(QFrame, loadUIFormClass(jp(DIR_UI, 'mapwidget.ui'))): mapCanvas.sigSpatialExtentChanged.connect(self.setSpatialExtent) mapCanvas.sigDestinationCrsChanged.connect(self.setCrs) mapCanvas.sigCrosshairPositionChanged.connect(self.onCrosshairPositionChanged) + mapCanvas.mapTools().mtCursorLocation.sigLocationRequest[SpatialPoint, QgsMapCanvas].connect(self.sigCurrentLocationChanged) def _disconnectCanvasSignals(self, mapCanvas:MapCanvas): mapCanvas.sigSpatialExtentChanged.disconnect(self.setSpatialExtent) mapCanvas.sigDestinationCrsChanged.disconnect(self.setCrs) mapCanvas.sigCrosshairPositionChanged.disconnect(self.onCrosshairPositionChanged) + mapCanvas.mapTools().mtCursorLocation.sigLocationRequest[SpatialPoint, QgsMapCanvas].disconnect( + self.sigCurrentLocationChanged) + def onCrosshairPositionChanged(self, spatialPoint:SpatialPoint): canvas = self.sender() @@ -1267,9 +1273,11 @@ class MapWidget(QFrame, loadUIFormClass(jp(DIR_UI, 'mapwidget.ui'))): def _updateGrid(self): import time t0 = time.time() + oldCanvases = self.findChildren(MapCanvas) + self._cropGrid() #remove canvases that we do not need - oldCanvases = self.findChildren(MapCanvas) + usedCanvases = [] self.mCanvases.clear() @@ -1353,9 +1361,16 @@ class MapWidget(QFrame, loadUIFormClass(jp(DIR_UI, 'mapwidget.ui'))): visibleBefore = self.visibleTSDs() bTSDChanged = False + + + layerCache = dict() + for c in self.findChildren(MapCanvas): + layerCache[(c.tsd(), c.mapView())] = c.layers() + if not (isinstance(self.mCurrentDate, TimeSeriesDate) and isinstance(self.timeSeries(), TimeSeries)): for c in self.findChildren(MapCanvas): assert isinstance(c, MapCanvas) + c.setTSD(None) bTSDChanged = True else: @@ -1377,6 +1392,9 @@ class MapWidget(QFrame, loadUIFormClass(jp(DIR_UI, 'mapwidget.ui'))): assert isinstance(canvas, MapCanvas) if canvas.tsd() != tsd: canvas.setTSD(tsd) + key = (tsd, mapView) + if key in layerCache.keys(): + canvas.setLayers(layerCache.pop(key)) bTSDChanged = True # canvas.setLayers() @@ -1887,217 +1905,3 @@ class MapViewDock(QgsDockWidget, loadUI('mapviewdock.ui')): if isinstance(w, MapView): return w return None - -class SpatialTemporalVisualization(QObject): - """ - - """ - sigShowProfiles = pyqtSignal(SpatialPoint, MapCanvas, str) - sigShowMapLayerInfo = pyqtSignal(dict) - sigSpatialExtentChanged = pyqtSignal(SpatialExtent) - sigMapSizeChanged = pyqtSignal(QSize) - sigCRSChanged = pyqtSignal(QgsCoordinateReferenceSystem) - sigActivateMapTool = pyqtSignal(str) - sigMapViewAdded = pyqtSignal(MapView) - sigMapViewRemoved = pyqtSignal(MapView) - - sigVisibleDatesChanged = pyqtSignal(list) - - def __init__(self, timeSeriesViewer): - super(SpatialTemporalVisualization, self).__init__() - # assert isinstance(timeSeriesViewer, TimeSeriesViewer), timeSeriesViewer - - # default map settings - self.mSpatialExtent = SpatialExtent.world() - #self.mCRS = self.mSpatialExtent.crs() - self.ui = timeSeriesViewer.ui - self.TSV = timeSeriesViewer - self.TS = timeSeriesViewer.timeSeries() - - self.mMapWidget = self.ui.mapWidget - assert isinstance(self.mMapWidget, MapWidget) - self.mMapWidget.mMapLayerStore = self.TSV.mapLayerStore() - self.mMapViewDock = self.ui.dockMapViews - assert isinstance(self.mMapViewDock, MapViewDock) - - self.mMapViewDock.setTimeSeries(self.TS) - self.mMapWidget.setTimeSeries(self.TS) - self.mMapWidget.setMapSize(self.mapSize()) - - # map-tool handling - self.mMapToolKey = MapTools.Pan - self.mMapToolMode = None - - for mv in self.mMapViewDock: - self.mMapWidget.addMapView(mv) - - self.mMapViewDock.sigShowProfiles.connect(self.sigShowProfiles.emit) - - self.mMapViewDock.sigMapViewAdded.connect(self.mMapWidget.addMapView) - self.mMapViewDock.sigMapViewRemoved.connect(self.mMapWidget.removeMapView) - self.mMapViewDock.sigMapViewAdded.connect(self.sigMapViewAdded.emit) - self.mMapViewDock.sigMapViewRemoved.connect(self.sigMapViewRemoved.emit) - self.mMapViewDock.sigMapsPerMapViewChanged.connect(self.mMapWidget.setMapsPerMapView) - self.mMapViewDock.sigCrsChanged.connect(self.mMapWidget.setCrs) - - self.vectorOverlay = None - - if len(self.TS) > 0: - self.setSpatialExtent(self.TS.maxSpatialExtent()) - - self.mCurrentLayer = None - - self.mSyncLock = False - - def setMapTool(self, mapToolKey, mode): - self.mMapWidget.setMapTool(mapToolKey, mode) - - - - def setCurrentLayer(self, layer:QgsMapLayer): - """ - Sets the current map layer some map tools can operate on - :param layer: QgsMapLayer - """ - assert layer is None or isinstance(layer, QgsMapLayer) - self.mCurrentLayer = layer - for mapView in self.mapViews(): - mapView.setCurrentLayer(self.mCurrentLayer) - - def visibleMaps(self)->list: - """ - Returns a list of mapcanvas visible to the user - :return: [list-of-MapCanvases - """ - return [m for m in self.mapCanvases() if m.isVisibleToViewport()] - - def visibleTSDs(self): - """ - Returns an ordered list of visible time series dates. - :return: [list-of-TimeSeriesDates] - """ - - return self.mMapWidget.visibleTSDs() - - def timedCanvasRefresh(self, *args, force:bool=False): - self.mMapWidget.timedRefresh() - - - def createMapView(self, name:str=None)->MapView: - """ - Create a new MapWiew - :return: MapView - """ - return self.mMapViewDock.createMapView(name=name) - - - def onCrosshairChanged(self, spatialPoint:SpatialPoint): - """ - Synchronizes all crosshair positions. Takes care of CRS differences. - :param spatialPoint: SpatialPoint of new Crosshair position - """ - from eotimeseriesviewer import CrosshairStyle - - srcCanvas = self.sender() - if isinstance(srcCanvas, MapCanvas): - dstCanvases = [c for c in self.mapCanvases() if c != srcCanvas] - else: - dstCanvases = [c for c in self.mapCanvases()] - - if isinstance(spatialPoint, SpatialPoint): - for mapCanvas in dstCanvases: - mapCanvas.setCrosshairPosition(spatialPoint, emitSignal=False) - - - def setCrosshairStyle(self, crosshairStyle:CrosshairStyle): - """ - Sets a crosshair style to all map canvas - :param crosshairStyle: CrosshairStyle - - """ - for mapView in self.mapViews(): - assert isinstance(mapView, MapView) - mapView.setCrosshairStyle(crosshairStyle) - - - def setCrosshairVisibility(self, b:bool): - """ - Sets the Crosshair visiblity - :param b: bool - """ - assert isinstance(b, bool) - self.onCrosshairChanged(b) - - - def setMapSize(self, size:QSize): - """ - Sets the MapCanvas size. - :param size: QSize - """ - self.mMapWidget.setMapSize(size) - - - def mapSize(self)->QSize: - """ - Returns the MapCanvas size - :return: QSize - """ - return self.mMapViewDock.mapSize() - - - def refresh(self): - """ - Refreshes all visible MapCanvases - """ - for c in self.mapCanvases(): - assert isinstance(c, MapCanvas) - c.refresh() - - #self.mMapRefreshTimer.stop() - - def doAdjustScrollArea(self): - m = self.targetLayout.contentsMargins() - nX = len(self.DVC) - w = h = 0 - - s = QSize() - r = None - tsdViews = [v for v in self.DVC if v.ui.isVisible()] - mapViews = [v for v in self.mMapViewDock if v.isVisible()] - nX = len(tsdViews) - nY = len(mapViews) - spacing = self.targetLayout.spacing() - margins = self.targetLayout.contentsMargins() - - sizeX = 1 - sizeY = 50 - if nX > 0: - s = tsdViews[0].ui.sizeHint().width() - s = nX * (s + spacing) + margins.left() + margins.right() - sizeX = s - if nY > 0 and nX > 0: - s = tsdViews[0].ui.sizeHint().height() - s = s + margins.top() + margins.bottom() - sizeY = s - - #s = tsdViews[0].ui.sizeHint() - #s = QSize(nX * (s.width() + spacing) + margins.left() + margins.right(), - # s.height() + margins.top() + margins.bottom()) - - #print(sizeX, sizeY) - self.targetLayout.parentWidget().resize(QSize(sizeX, sizeY)) - - def onLocationRequest(self, pt:SpatialPoint, canvas:QgsMapCanvas): - - self.sigShowProfiles.emit(pt, canvas, "") - - - - - def navigateToTSD(self, tsd:TimeSeriesDate): - """ - Changes the viewport of the scroll window to show the requested TimeSeriesDate - :param TSD: TimeSeriesDate - """ - self.mMapWidget.setCurrentDate(tsd) -