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
Example #2
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
Example #3
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