Skip to content
Snippets Groups Projects
mapcanvas.py 44.2 KiB
Newer Older
# -*- coding: utf-8 -*-
"""
/***************************************************************************
                              -------------------
        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
import os, time, types, enum
Benjamin Jakimow's avatar
Benjamin Jakimow committed
from timeseriesviewer import CursorLocationMapTool
from qgis.core import *
from qgis.gui import *

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtXml import QDomDocument
from .utils import *
from .timeseries import TimeSeriesDatum
Benjamin Jakimow's avatar
Benjamin Jakimow committed
from qps.crosshair.crosshair import CrosshairDialog, CrosshairStyle
from qps.maptools import *
from .labeling import LabelAttributeTableModel, labelShortcutLayers, layerClassSchemes, applyShortcutsToRegisteredLayers
Benjamin Jakimow's avatar
Benjamin Jakimow committed
from qps.classification.classificationscheme import ClassificationScheme, ClassInfo
Benjamin Jakimow's avatar
Benjamin Jakimow committed

def toQgsMimeDataUtilsUri(mapLayer:QgsMapLayer):

    uri = QgsMimeDataUtils.Uri()
    uri.name = mapLayer.name()
    uri.providerKey = mapLayer.dataProvider().name()
    uri.uri = mapLayer.source()
    if isinstance(mapLayer, QgsRasterLayer):
        uri.layerType = 'raster'
    elif isinstance(mapLayer, QgsVectorLayer):
        uri.layerType = 'vector'
    else:
        raise NotImplementedError()
    return uri

Benjamin Jakimow's avatar
Benjamin Jakimow committed
class MapCanvasLayerModel(QAbstractTableModel):

    class LayerItem(object):

        def __init__(self, src):

            self.mLyr = None
            self.mUri = None
            self.mIsVisible = True
            self.mExternalControl = False

            if isinstance(src, QgsMimeDataUtils.Uri):
                self.mUri = src
                self.mExternalControl = False
            else:
                assert isinstance(src, QgsMapLayer)
                self.mLyr = src
                self.mUri = toQgsMimeDataUtilsUri(src)
                self.mExternalControl = True
                s  = ""
            assert isinstance(self.mUri, QgsMimeDataUtils.Uri)

        def name(self)->str:
            return self.mUri.name

        def source(self)->str:
            return self.mUri.uri

        def layerType(self)->str:
            return self.mUri.layerType

        def isVisible(self)->bool:
            return self.mIsVisible

Benjamin Jakimow's avatar
Benjamin Jakimow committed
        def providerKey(self)->str:
            return self.mUri.providerKey
Benjamin Jakimow's avatar
Benjamin Jakimow committed

        def hasMapLayerInstance(self)->bool:
            return isinstance(self.mLyr, QgsMapLayer)


Benjamin Jakimow's avatar
Benjamin Jakimow committed
        def mapLayer(self)->QgsMapLayer:

            if not self.hasMapLayerInstance():
                assert isinstance(self.mUri, QgsMimeDataUtils.Uri)
                if self.layerType() == 'raster':
                    self.mLyr = QgsRasterLayer(self.source(), self.name(), self.providerKey())
                elif self.layerType() == 'vector':
                    self.mLyr = QgsVectorLayer(self.source(), self.name(), self.providerKey())
                else:
                    raise Exception()


            return self.mLyr
Benjamin Jakimow's avatar
Benjamin Jakimow committed

    """
    A model to create QgsMapLayer instances and control its visibility.
    """
    def __init__(self, parent=None):

        super(MapCanvasLayerModel, self).__init__()
        self.cnName = 'Name'
        self.cnUri = 'Uri'
        self.cnLayerType = 'Type'

        self.mColumnNames = [self.cnName, self.cnLayerType, self.cnUri]

        self.mVectorsVisible = True
        self.mRastersVisible = True

        self.mDefaultRasterRenderer = None
        self.mDefaultVectorRenderer = None

        self.mItems = []

    def __iter__(self):
        return iter(self.mItems)

    def __len__(self)->int:
        return len(self.mItems)

    def setDefaultRasterRenderer(self, renderer:QgsRasterRenderer):
        if isinstance(renderer, QgsRasterRenderer):
            self.mDefaultRasterRenderer = renderer
Benjamin Jakimow's avatar
Benjamin Jakimow committed

            for item in self.mItems:
                assert isinstance(item, MapCanvasLayerModel.LayerItem)
                if not item.mExternalControl and isinstance(item.mLyr, QgsRasterLayer):
                    item.mLyr.setRenderer(renderer.clone())
Benjamin Jakimow's avatar
Benjamin Jakimow committed

    def setDefaultVectorRenderer(self, renderer:QgsFeatureRenderer):
        assert isinstance(renderer, QgsFeatureRenderer)
        self.mDefaultVectorRenderer = renderer

        for item in self.mItems:
            assert isinstance(item, MapCanvasLayerModel.LayerItem)
            if not item.mExternalControl and isinstance(item.mLyr, QgsVectorLayer):
                item.mLyr.setRenderer(renderer.clone())

    def setLayerVisibility(self, cls, b:bool):

        assert isinstance(b, bool)
        if isinstance(cls, int):
            item = self.mItems[cls]
            assert isinstance(item, MapCanvasLayerModel.LayerItem)
            item.mIsVisible = b

        elif cls == QgsRasterLayer:
            self.mRastersVisible = b
            for item in [i for i in self if i.layerType() == 'raster']:
                assert isinstance(item, MapCanvasLayerModel.LayerItem)
                item.mIsVisible = b

        elif cls == QgsVectorLayer:
            self.mVectorsVisible = b
            for item in [i for i in self if i.layerType() == 'vector']:
                assert isinstance(item, MapCanvasLayerModel.LayerItem)
                item.mIsVisible = b
        else:
            raise NotImplementedError()

    def clear(self):
        """
        Removes all layers
        """
        self.beginRemoveRows(QModelIndex(), 0, len(self)-1)
        self.mItems.clear()
        self.endRemoveRows()


    def addMapLayerSources(self, src):

        i = len(self.mItems)

        self.insertMapLayerSources(i, src)

    def insertMapLayerSources(self, index:int, mapLayerSources):
        assert isinstance(mapLayerSources, (list, types.GeneratorType))
        items = [MapCanvasLayerModel.LayerItem(src) for src in mapLayerSources]

        self.beginInsertRows(QModelIndex(), index, index + len(items) - 1)
        i = index
        for item in items:
Loading
Loading full blame...