示例#1
0
 def processAlgorithm(self, parameters, context, feedback):
     """
     Here is where the processing itself takes place.
     """
     host = self.parameterAsString(
         parameters,
         self.HOST,
         context
     )
     port = self.parameterAsString(
         parameters,
         self.PORT,
         context
     )
     database = self.parameterAsString(
         parameters,
         self.DATABASE,
         context
     )
     user = self.parameterAsString(
         parameters,
         self.USER,
         context
     )
     password = self.parameterAsString(
         parameters,
         self.PASSWORD,
         context
     )
     layerStringList = self.parameterAsString(
         parameters,
         self.LAYER_LIST,
         context
     )
     loadToCanvas = self.parameterAsBoolean(
         parameters,
         self.LOAD_TO_CANVAS,
         context
     )
     uniqueLoad = self.parameterAsBoolean(
         parameters,
         self.UNIQUE_LOAD,
         context
     )
     abstractDb = self.getAbstractDb(host, port, database, user, password)
     inputParamList = layerStringList.split(',')
     layerLoader = LayerLoaderFactory().makeLoader(
         iface, abstractDb
     )
     if loadToCanvas:
         iface.mapCanvas().freeze(True)
     outputLayers = layerLoader.loadLayersInsideProcessing(
         inputParamList,
         uniqueLoad=uniqueLoad,
         addToCanvas=loadToCanvas,
         feedback=feedback
     )
     if loadToCanvas:
         iface.mapCanvas().freeze(False)
     return {self.OUTPUT: [i.id() for i in outputLayers]}
 def loadFrameLayer(self):
     """
     Loads the frame layer case it is not loaded yet.
     """
     loader = LayerLoaderFactory().makeLoader(self.iface,
                                              self.widget.abstractDb)
     if loader.provider == 'postgres':
         layerMeta = {
             'cat': 'aux',
             'geom': 'geom',
             'geomType': 'MULTIPOLYGON',
             'lyrName': 'moldura_a',
             'tableName': 'aux_moldura_a',
             'tableSchema': 'public',
             'tableType': 'BASE TABLE'
         }
     elif loader.provider == 'spatialite':
         layerMeta = {
             'cat': 'aux',
             'geom': 'GEOMETRY',
             'geomType': 'MULTIPOLYGON',
             'lyrName': 'moldura_a',
             'tableName': 'aux_moldura_a',
             'tableSchema': 'public',
             'tableType': 'BASE TABLE'
         }
     else:
         layerMeta = None
     layerDict = loader.load([layerMeta], uniqueLoad=True)
     if layerMeta['lyrName'] in list(layerDict.keys()):
         layer = layerDict[layerMeta['lyrName']]
     else:
         layer = None
     return layer
示例#3
0
 def getLayerLoader(self):
     """
     Returns the layer loader for given datasource.
     :return: (EDGVLayerLoader) layer loader.
     """
     abstracDb = self.getDatasource()
     return LayerLoaderFactory().makeLoader(iface=iface, abstractDb=abstracDb) if abstracDb else None
 def readSpatiaLite(self, path):
     """
     Reads a SpatiaLite database and gets its vector layers.
     :param path: (str) path do the SpatiaLite database.
     :return: (dict) map to the SpatiaLite database's layers.
     """
     uri = QgsDataSourceUri()
     uri.setDatabase(path)
     db = self.connectToSpatialite(path)
     layerLoader = LayerLoaderFactory().makeLoader(iface, db)
     layers = dict()
     for l in list(db.listClassesWithElementsFromDatabase([]).keys()):
         layers[l] = layerLoader.getLayerByName(l)
     for l in db.listComplexClassesFromDatabase():
         layers[l] = layerLoader.getComplexLayerByName(l)
     return layers
示例#5
0
 def getLayerLoader(self):
     """
     Gets the shapefile layer loader as designed in DSGTools plugin.
     LAYER LOADERS SHOULD NOT be imported in abstract db. (Shapefile AbstractDb)s are
     a concept extrapolation, and this is specific for this case.
     :return: (ShapefileLayerLoader) shapefile layer loader object. 
     """
     # DIAMOND PROBLEM ALERT: this method requires care to be used; similar methods should be avoided!
     return LayerLoaderFactory().makeLoader(iface, self)
示例#6
0
 def processAlgorithm(self, parameters, context, feedback):
     """
     Here is where the processing itself takes place.
     """
     host = self.parameterAsString(parameters, self.HOST, context)
     port = self.parameterAsString(parameters, self.PORT, context)
     database = self.parameterAsString(parameters, self.DATABASE, context)
     user = self.parameterAsString(parameters, self.USER, context)
     password = self.parameterAsString(parameters, self.PASSWORD, context)
     layerStringList = self.parameterAsString(parameters, self.LAYER_LIST,
                                              context)
     loadToCanvas = self.parameterAsBoolean(parameters, self.LOAD_TO_CANVAS,
                                            context)
     uniqueLoad = self.parameterAsBoolean(parameters, self.UNIQUE_LOAD,
                                          context)
     tableSchema = self.parameterAsString(parameters, self.SCHEMA_NAME,
                                          context)
     abstractDb = self.getAbstractDb(host, port, database, user, password)
     inputParamList = [(tableSchema, i) for i in layerStringList.split(',')]
     layerLoader = LayerLoaderFactory().makeLoader(iface, abstractDb)
     if loadToCanvas:
         iface.mapCanvas().freeze(True)
     multiStepFeedback = QgsProcessingMultiStepFeedback(2, feedback)
     multiStepFeedback.setCurrentStep(0)
     outputLayers = layerLoader.loadLayersInsideProcessing(
         inputParamList,
         uniqueLoad=uniqueLoad,
         addToCanvas=loadToCanvas,
         nonSpatial=True,
         feedback=multiStepFeedback)
     multiStepFeedback.setCurrentStep(1)
     output = processing.run('dsgtools:grouplayers', {
         'INPUT_LAYERS':
         outputLayers,
         'CATEGORY_EXPRESSION':
         "to_string('{name}')".format(name=tableSchema),
         'OUTPUT':
         ':memory'
     },
                             context=context,
                             feedback=multiStepFeedback)
     if loadToCanvas:
         iface.mapCanvas().freeze(False)
     return {self.OUTPUT: [i.id() for i in outputLayers]}
示例#7
0
    def readInputLayers(self, datasourcePath, feedback=None):
        """
        Reads all input datasources and return its layers.
        :param datasourcePath: (str) input's datasource path.
        :param feedback: (QgsProcessingMultiStepFeedback) QGIS tool for progress tracking.
        :return: (dict) a map for input's layers.
        """
        inputLayerMap = dict()
        parameters = self.parseDatasourcePath(datasourcePath)
        abstractDb = self.connectToDb(parameters=parameters)
        if abstractDb is None:
            return {}
        layerLoader = LayerLoaderFactory().makeLoader(self.iface, abstractDb)

        geometricLayers = list(
            abstractDb.listClassesWithElementsFromDatabase([]).keys())
        complexLayers = abstractDb.listComplexClassesFromDatabase()

        if feedback is not None:
            stepSize = 100 / (len(geometricLayers) +
                              len(complexLayers)) if len(
                                  geometricLayers) + len(complexLayers) else 0
        curr = 0
        for curr, l in enumerate(geometricLayers):
            if feedback is not None and feedback.isCanceled():
                return inputLayerMap
            vl = layerLoader.getLayerByName(l)
            inputLayerMap[vl.name()] = vl
            if feedback is not None:
                feedback.setProgress(curr * stepSize)

        for currComplex, l in enumerate(complexLayers):
            if feedback is not None and feedback.isCanceled():
                return inputLayerMap
            vl = layerLoader.getComplexLayerByName(l)
            if vl.featureCount() > 0:
                inputLayerMap[vl.name()] = vl
            if feedback is not None:
                feedback.setProgress((curr + currComplex) * stepSize)
        # after reading its layers, db connection will not be used again
        del abstractDb
        return inputLayerMap
示例#8
0
    def readOutputLayers(self, datasourcePath, feedback=None):
        """
        Prepares output layers to be filled.
        :param datasourcePath: (str) output's datasource path.
        :param context: (QgsProcessingContext) environment parameters in which processing tools are used.
        :param feedback: (QgsProcessingMultiStepFeedback) QGIS tool for progress tracking.
        :return: (dict) a map for output's layers.
        """
        parameters = self.parseDatasourcePath(datasourcePath)
        abstractDb = self.connectToDb(parameters=parameters)
        if abstractDb is None:
            return {}
        layerLoader = LayerLoaderFactory().makeLoader(self.iface, abstractDb)
        outputLayerMap = dict()

        geometricLayers = abstractDb.listGeomClassesFromDatabase([])
        complexLayers = abstractDb.listComplexClassesFromDatabase()
        if feedback is not None:
            multiStepFeedback = QgsProcessingMultiStepFeedback(
                len(geometricLayers) + len(complexLayers), feedback)

        for curr, l in enumerate(geometricLayers):
            if feedback is not None and multiStepFeedback.isCanceled():
                return outputLayerMap
            vl = layerLoader.getLayerByName(l)
            outputLayerMap[vl.name()] = vl
            if feedback is not None:
                multiStepFeedback.setCurrentStep(curr)

        for currComplex, l in enumerate(complexLayers):
            if feedback is not None and multiStepFeedback.isCanceled():
                return outputLayerMap
            vl = layerLoader.getComplexLayerByName(l)
            outputLayerMap[vl.name()] = vl
            if feedback is not None:
                multiStepFeedback.setCurrentStep(curr + currComplex)
        # after reading its layers, db connection will not be used again
        del abstractDb
        return outputLayerMap
示例#9
0
 def processAlgorithm(self, parameters, context, feedback):
     """
     Here is where the processing itself takes place.
     """
     host = self.parameterAsString(parameters, self.HOST, context)
     port = self.parameterAsString(parameters, self.PORT, context)
     database = self.parameterAsString(parameters, self.DATABASE, context)
     user = self.parameterAsString(parameters, self.USER, context)
     password = self.parameterAsString(parameters, self.PASSWORD, context)
     layerStringList = self.parameterAsString(parameters, self.LAYER_LIST,
                                              context)
     inputParamList = layerStringList.split(',')
     layerLoader = LayerLoaderFactory().makeLoader(iface, abstractDb)
     iface.mapCanvas().freeze(True)
     outputLayers = layerLoader.loadLayersInsideProcessing(
         inputParamList,
         uniqueLoad=True,
         addToCanvas=True,
         feedback=feedback)
     iface.mapCanvas().freeze(False)
     #TODO: Resto
     return {self.OUTPUT: [i.id() for i in outputLayers]}
示例#10
0
    def __init__(self, iface, parent=None):
        """
        Constructor
        """
        super(self.__class__, self).__init__(parent)
        self.setupUi(self)
        self.iface = iface
        self.layerFactory = LayerLoaderFactory()
        self.selectedClasses = []
        self.widget.tabWidget.setTabEnabled(0,True)
        self.widget.tabWidget.setTabEnabled(1,False)
        self.widget.tabWidget.setCurrentIndex(0)
        self.bar = QgsMessageBar()
        self.setLayout(QtGui.QGridLayout(self))
        self.layout().setContentsMargins(0,0,0,0)
        self.layout().setAlignment(QtCore.Qt.AlignTop)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed)
        self.bar.setSizePolicy(sizePolicy)
        self.layout().addWidget(self.bar, 0,0,1,1)

        QtCore.QObject.connect(self.widget, QtCore.SIGNAL(("problemOccurred()")), self.pushMessage)
        self.widget.dbChanged.connect(self.widgetConv.setDatabase)
示例#11
0
class LoadAuxStruct(QtWidgets.QDialog, FORM_CLASS):
    def __init__(self, iface, parent=None):
        """
        Constructor
        """
        super(self.__class__, self).__init__(parent)
        self.setupUi(self)
        self.iface = iface
        self.layerFactory = LayerLoaderFactory()
        self.selectedClasses = []
        self.widget.tabWidget.setTabEnabled(0,True)
        self.widget.tabWidget.setTabEnabled(1,False)
        self.widget.tabWidget.setCurrentIndex(0)
        self.bar = QgsMessageBar()
        self.setLayout(QtGui.QGridLayout(self))
        self.layout().setContentsMargins(0,0,0,0)
        self.layout().setAlignment(QtCore.Qt.AlignTop)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed)
        self.bar.setSizePolicy(sizePolicy)
        self.layout().addWidget(self.bar, 0,0,1,1)

        QtCore.QObject.connect(self.widget, QtCore.SIGNAL(("problemOccurred()")), self.pushMessage)
        self.widget.dbChanged.connect(self.widgetConv.setDatabase)

    @pyqtSlot(bool)
    def on_pushButtonCancel_clicked(self):
        """
        Closes the dialog
        """
        self.close()
        
    def pushMessage(self, msg):
        """
        Pushes a message into message bar
        """
        self.bar.pushMessage("", msg, level=QgsMessageBar.CRITICAL)

    @pyqtSlot(bool)
    def on_pushButtonOk_clicked(self):
        """
        Checks the linee-centroid structure and loads the correspondent layers 
        """
        QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
        if self.widgetConv.settingDict == dict():
            QApplication.restoreOverrideCursor()
            self.bar.pushMessage(self.tr("Error!"), self.tr("Could not load auxiliary classes! Check log for details!"), level=QgsMessageBar.CRITICAL)
        else:
            self.loadLayers()
        QApplication.restoreOverrideCursor()
        self.close()

    def loadLayers(self):
        """
        Loads the layers defined in the line-centroid structure
        """
        try:
            if self.widget.abstractDb.getDatabaseVersion() == 'Non_EDGV':
                isEdgv = False
            else:
                isEdgv = True
            auxClassesDict = self.widgetConv.settingDict['earthCoverageDict']
            auxClasses = []
            for key in list(auxClassesDict.keys()):
                for cl in auxClassesDict[key]:
                    if cl not in auxClasses:
                        if '.' in cl:
                            classToLoad = cl.split('.')[-1]
                        else:
                            classToLoad = cl
                        auxClasses.append(classToLoad)
            auxCentroids = self.widgetConv.abstractDb.getEarthCoverageCentroids()
            auxClasses = auxClasses + auxCentroids
            auxClasses.sort(reverse=True)
            auxClasses = [self.widgetConv.settingDict['frameLayer'].split('.')[-1]]+auxClasses
            factory = self.layerFactory.makeLoader(self.iface, self.widget.abstractDb, loadCentroids=True)
            factory.load(auxClasses, uniqueLoad = True, isEdgv = isEdgv)
        except Exception as e:
                QgsMessageLog.logMessage(':'.join(e.args), "DSGTools Plugin", Qgis.Critical)
                self.bar.pushMessage(self.tr("Error!"), self.tr("Could not load auxiliary classes! Check log for details!"), level=QgsMessageBar.CRITICAL)