Beispiel #1
0
    def __createCtrlLayers(self, requete):
        """
        Création des couches de contrôles
        - selon une requête SQL dans la base de données (choix  ou des contrôle par l'utilisateur)
        - selon une zone géographique définie par l'utilisateur
        :param requete: liste des requêtes
        """

        self.__iface.messageBar().clearWidgets()
        progressMessageBar = self.__iface.messageBar()
        # ajout d'une barre de progression pour voir le chargement progressif des couches
        progress = QProgressBar()
        progress.setMaximum(100)
        progressMessageBar.pushWidget(progress)

        # récupérer la géométrie définie par l'utilisateur pour l'utiliser dans les requêtes SQL
        # conversion en géométrie binaire et dans le bon système de coordonnée)
        self.__crs = self.__iface.mapCanvas().mapSettings().destinationCrs(
        ).postgisSrid()
        # défintion du système de coordonnées en sortie (par défaut 21781), récupérer des paramètres du projets
        bbox = "(SELECT ST_GeomFromText('" + self.geom.exportToWkt(
        ) + "'," + str(self.__crs) + "))"

        # paramètres de la source des couches à ajouter au projet
        uri = QgsDataSourceURI()
        uri.setConnection(self.__db.hostName(), str(self.__db.port()),
                          self.__db.databaseName(), self.__db.userName(),
                          self.__db.password())
        uri.setSrid(str(self.__crs))
        outputLayers = [
        ]  # listes des couches de résultats à charger dans le projet
        styleLayers = []  # listes des styles de couches (fichier qml)
        i = 0
        totalError = 0  # décompte des erreurs détectées (nombre d'objets dans chaque couche)
        for name in requete:
            for q in self.__layerCfgControl.getFeatures(
                    QgsFeatureRequest(int(name))):
                query_fct = q["sql_function"]
                query_fct = query_fct.replace("bbox", bbox)
                geom_type = QgsWKBTypes.parseType(q["geom_type"])
                # récupérer le type de géométrie QGIS "QgsWKBTypes" depuis un type de géométrie WKT Postgis
                uri.setWkbType(geom_type)
                uri.setDataSource('', query_fct, q["geom_name"], "",
                                  q["key_attribute"])
                layer = QgsVectorLayer(uri.uri(), q["layer_name"], "postgres")

                totalError = totalError + layer.featureCount()
                if layer.featureCount() > 0:
                    outputLayers.append(layer)
                    styleLayers.append(str(q["layer_style"]))
            percent = (
                float(i + 1.0) / float(len(requete))
            ) * 100  # Faire évoluer la barre de progression du traitement
            progress.setValue(percent)
            i += 1
        if len(outputLayers) > 0:
            self.__addCtrlLayers(outputLayers, styleLayers)
            self.__iface.messageBar().clearWidgets()
            self.__iface.messageBar().pushMessage(
                "Info",
                QCoreApplication.translate(
                    "VDLTools",
                    "All layers have been charged with success in the projet. |"
                ) + QCoreApplication.translate("VDLTools", "Total errors : ") +
                str(totalError),
                level=QgsMessageBar.INFO,
                duration=10)
        else:
            self.__iface.messageBar().clearWidgets()
            self.__iface.messageBar().pushMessage(
                "Info",
                QCoreApplication.translate(
                    "VDLTools",
                    "Good !! No error detected on the defined area"),
                level=QgsMessageBar.INFO,
                duration=5)