QGIS/python/plugins/sextante/core/QGisLayers.py

155 lines
5.5 KiB
Python

from qgis.core import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4 import QtGui
from os import path
from sextante.core.SextanteConfig import SextanteConfig
class QGisLayers:
'''This class contains method to communicate SEXTANTE with the QGIS interface,
mostly for retrieving layers and adding new ones to the QGIS canvas'''
ALL_TYPES = -1
iface = None;
@staticmethod
def getRasterLayers():
layers = QGisLayers.iface.legendInterface().layers()
raster = list()
for layer in layers:
if layer.type() == layer.RasterLayer:
if layer.usesProvider() and layer.providerKey() == 'gdal':#only gdal file-based layers
raster.append(layer)
return raster
@staticmethod
def getVectorLayers(shapetype=-1):
layers = QGisLayers.iface.legendInterface().layers()
vector = list()
for layer in layers:
if layer.type() == layer.VectorLayer:
if shapetype == QGisLayers.ALL_TYPES or layer.geometryType() == shapetype:
uri = unicode(layer.source())
if not uri.endswith("csv") and not uri.endswith("dbf"):
vector.append(layer)
return vector
@staticmethod
def getAllLayers():
layers = []
layers += QGisLayers.getRasterLayers();
layers += QGisLayers.getVectorLayers();
return layers
@staticmethod
def getTables():
layers = QGisLayers.iface.legendInterface().layers()
tables = list()
for layer in layers:
if layer.type() == layer.VectorLayer :
uri = unicode(layer.source())
if uri.endswith("csv") or uri.endswith("dbf"):
tables.append(layer)
return tables
@staticmethod
def setInterface(iface):
QGisLayers.iface = iface
@staticmethod
def loadList(layers):
for layer in layers:
QGisLayers.load(layer)
@staticmethod
def load(layer, name = None, crs = None, style = None):
if layer == None:
return
prjSetting = None
settings = QSettings()
if crs != None:
prjSetting = settings.value("/Projections/defaultBehaviour")
settings.setValue("/Projections/defaultBehaviour", QVariant(""))
if name == None:
name = path.split(layer)[1]
qgslayer = QgsVectorLayer(layer, name , 'ogr')
if qgslayer.isValid():
if crs != None:
qgslayer.setCrs(crs,False)
if style == None:
if qgslayer.geometryType == 0:
style = SextanteConfig.getSetting(SextanteConfig.VECTOR_POINT_STYLE)
elif qgslayer.geometryType == 1:
style = SextanteConfig.getSetting(SextanteConfig.VECTOR_LINE_STYLE)
else:
style = SextanteConfig.getSetting(SextanteConfig.VECTOR_POLYGON_STYLE)
qgslayer.loadNamedStyle(style)
QgsMapLayerRegistry.instance().addMapLayer(qgslayer)
else:
qgslayer = QgsRasterLayer(layer, name)
if qgslayer.isValid():
if crs != None:
qgslayer.setCrs(crs,False)
if style == None:
style = SextanteConfig.getSetting(SextanteConfig.RASTER_STYLE)
qgslayer.loadNamedStyle(style)
QgsMapLayerRegistry.instance().addMapLayer(qgslayer)
QGisLayers.iface.legendInterface().refreshLayerSymbology(qgslayer)
else:
if prjSetting:
settings.setValue("/Projections/defaultBehaviour", prjSetting)
raise RuntimeError("Could not load layer: " + unicode(layer)
+"\nCheck the SEXTANTE log to look for errors in algorithm execution")
if prjSetting:
settings.setValue("/Projections/defaultBehaviour", prjSetting)
@staticmethod
def loadFromDict(layersdict, crs):
for name in layersdict.keys():
QGisLayers.load(layersdict[name], name, crs)
@staticmethod
def getObjectFromUri(uri, forceLoad = True):
if uri is None:
return None
layers = QGisLayers.getRasterLayers()
for layer in layers:
if layer.source() == uri:
return layer
layers = QGisLayers.getVectorLayers()
for layer in layers:
if layer.source() == uri:
return layer
if forceLoad:
settings = QSettings()
prjSetting = settings.value("/Projections/defaultBehaviour")
settings.setValue("/Projections/defaultBehaviour", QVariant(""))
#if is not opened, we open it
layer = QgsVectorLayer(uri, uri , 'ogr')
if layer.isValid():
if prjSetting:
settings.setValue("/Projections/defaultBehaviour", prjSetting)
return layer
layer = QgsRasterLayer(uri, uri)
if layer.isValid():
if prjSetting:
settings.setValue("/Projections/defaultBehaviour", prjSetting)
return layer
if prjSetting:
settings.setValue("/Projections/defaultBehaviour", prjSetting)
else:
return None