Пример #1
0
    def sauverOpePrev(self):
        # Fonction à lancer quans le bouton "OK" est cliqué
        # Entre en base les infos sélectionnées dans QGIS, et saisies dans le formulaire par l'utilisateur

        coucheactive= self.iface.activeLayer()

        if coucheactive.geometryType()==0:
            nom_table='list_gestprev_pts'
            typegeom=QGis.Point
        elif coucheactive.geometryType()==1:
            nom_table='list_gestprev_lgn'
            typegeom=QGis.Line
        elif coucheactive.geometryType()==2:
            nom_table='list_gestprev_surf'
            typegeom=QGis.Polygon
        else: 
            print "ce ne sont pas des points, des lignes ou des polygones"

        geomprev2=convert_geometries([QgsGeometry(feature.geometry()) for feature in coucheactive.selectedFeatures()], typegeom)

        #lancement de la requête SQL qui introduit les données géographiques et du formulaire dans la base de données.
        querysauvope = QtSql.QSqlQuery(self.db)
        query = u"""insert into bdtravaux.{zr_nomtable} (prev_codesite, prev_codeope, prev_typeope, prev_lblope, prev_annprev, prev_pdg, the_geom) values (\'{zr_codesite}\', '{zr_codeope}', '{zr_typeope}', '{zr_lblope}', '{zr_annprev}', '{zr_pdg}', st_setsrid(st_geometryfromtext ('{zr_the_geom}'),2154))""".format (zr_nomtable=nom_table,\
        zr_codesite = self.ui.prevcbo_codesite.itemData(self.ui.prevcbo_codesite.currentIndex()),\
        zr_codeope = self.ui.prevledit_gh.text(),\
        zr_typeope = self.ui.prevlist_typeope.currentItem().text().replace("\'","\'\'"),\
        zr_lblope = self.ui.prevtedit_lblope.toPlainText().replace("\'","\'\'"),\
        zr_annprev = self.ui.prevledit_annprev.text(),\
        zr_pdg = self.ui.prevlist_pdg.currentItem().text(),\
        zr_the_geom = geomprev2.exportToWkt())
        ok = querysauvope.exec_(query)
        if not ok:
            QtGui.QMessageBox.warning(self, 'Alerte', u'Requête ratée')
        self.close
Пример #2
0
    def sauverOpe(self):
        # Fonction à lancer quans les boutons "OK" ou "Dernier - Editer CR" sont cliqués
        # Entre en base les infos sélectionnées dans QGIS, et saisies dans le formulaire par l'utilisateur
        # Gère les erreurs "pas assez de points sélectionnés pour construire une ligne ou un polygone"
        # Gère également la transformation géométrique, via le module convert_geoms

        # Récupération de la géométrie finale. On en déduit la table où sera stockée l'information, et on gère les erreurs
        # "pas assez de points pour faire la transformation"
        geom_cbbx = self.ui.trsf_geom.itemText(self.ui.trsf_geom.currentIndex())
        if geom_cbbx == "Points":
            geom_output = QGis.Point
            self.nom_table = "operation_pts"
        elif geom_cbbx == "Lignes":
            geom_output = QGis.Line
            self.nom_table = "operation_lgn"
            if self.iface.activeLayer().geometryType() == 0:
                if self.iface.activeLayer().selectedFeatureCount() < 2:
                    mess2pts = QtGui.QMessageBox()
                    mess2pts.setText(u"Pas assez de points sélectionnés")
                    mess2pts.setInformativeText(
                        u"Il faut au moins 2 points pour faire une ligne. Merci d'en sélectionner plus"
                    )
                    mess2pts.setIcon(QtGui.QMessageBox.Warning)
                    mess2pts.setStandardButtons(QtGui.QMessageBox.Ok)
                    ret = mess2pts.exec_()
                    return
        elif geom_cbbx == "Surfaces":
            geom_output = QGis.Polygon
            self.nom_table = "operation_poly"
            if self.iface.activeLayer().geometryType() == 0:
                if self.iface.activeLayer().selectedFeatureCount() < 3:
                    mess3pts = QtGui.QMessageBox()
                    mess3pts.setText(u"Pas assez de points sélectionnés")
                    mess3pts.setInformativeText(
                        u"Il faut au moins 3 points pour faire un polygone. Merci d'en sélectionner plus"
                    )
                    mess3pts.setIcon(QtGui.QMessageBox.Warning)
                    mess3pts.setStandardButtons(QtGui.QMessageBox.Ok)
                    ret = mess3pts.exec_()
                    return

        # copie des entités sélectionnées dans une couche "memory". Evite les problèmes avec les types de couches "non  éditables" (comme les GPX).
        coucheactive = self.iface.activeLayer()
        entselect = [QgsGeometry(feature.geometry()) for feature in coucheactive.selectedFeatures()]
        if entselect[0].type() == QGis.Line:
            typegeom = "LineString"
        elif entselect[0].type() == QGis.Point:
            typegeom = "Point"
        elif entselect[0].type() == QGis.Polygon:
            typegeom = "Polygon"
        else:
            print "ce ne sont pas des points, des lignes ou des polygones"

        # Création de la couche memlayer et début de la session d'édition
        if self.iface.activeLayer().crs().authid() == u"EPSG:4326":
            memlayer = QgsVectorLayer("{zr_typegeom}?crs=epsg:4326".format(zr_typegeom=typegeom), "memlayer", "memory")
        if self.iface.activeLayer().crs().authid() == u"EPSG:2154":
            memlayer = QgsVectorLayer("{zr_typegeom}?crs=epsg:2154".format(zr_typegeom=typegeom), "memlayer", "memory")
        QgsMapLayerRegistry.instance().addMapLayer(memlayer, False)
        root = QgsProject.instance().layerTreeRoot()
        memlayerNode = QgsLayerTreeLayer(memlayer)
        root.insertChildNode(0, memlayerNode)
        self.iface.setActiveLayer(memlayer)
        memlayer.startEditing()

        # Pour chaque entité sélectionnée, si elle est multipartie, on ajoute chacune de ses parties individuellement à la couche memlayer. Sinon, on l'ajoute directement à "memlayer". Puis, on clot la session d'édition et on sélectionne toutes les entités de memlayer.
        for feature in coucheactive.selectedFeatures():
            geom = feature.geometry()
            temp_feature = QgsFeature(feature)
            # check if feature geometry is multipart
            if geom.isMultipart():
                # if feature is multipart creates a new feature using the geometry of each part
                for part in geom.asGeometryCollection():
                    temp_feature.setGeometry(part)
                    memlayer.dataProvider().addFeatures([temp_feature])
                    memlayer.updateExtents()
                # if feature is singlepart, simply adds it to the layer memory
            else:
                temp_feature.setGeometry(geom)
                memlayer.dataProvider().addFeatures([temp_feature])
                memlayer.updateExtents()
        memlayer.commitChanges()
        memlayer.commitChanges()
        memlayer.selectAll()

        # lancement de convert_geoms.py pour transformer les entités sélectionnées dans le type d'entités choisi.

        # compréhension de liste : [fonction for x in liste]
        geom2 = convert_geometries(
            [QgsGeometry(feature.geometry()) for feature in memlayer.selectedFeatures()], geom_output
        )
        # export de la géométrie en WKT et transformation de la projection si les données ne sont pas saisies en Lambert 93
        if memlayer.crs().authid() == u"EPSG:2154":
            thegeom = "st_setsrid(st_geometryfromtext ('{zr_geom2}'), 2154)".format(zr_geom2=geom2.exportToWkt())
        elif memlayer.crs().authid() == u"EPSG:4326":
            thegeom = "st_transform(st_setsrid(st_geometryfromtext ('{zr_geom2}'),4326), 2154)".format(
                zr_geom2=geom2.exportToWkt()
            )
        else:
            print u"La projection de la couche active n'est pas supportee"

        # lancement de la fonction qui vérifie si l'opération fait partie d'un chantier de volontaires.
        self.recupIdChantvol()
        self.recupAnneeSortie()
        # lancement de la requête SQL qui introduit les données géographiques et du formulaire dans la base de données.
        querysauvope = QtSql.QSqlQuery(self.db)
        query = u"""insert into bdtravaux.{zr_nomtable} (sortie, descriptio, chantfini, the_geom, ope_chvol, anneereal) values ({zr_sortie}, '{zr_libelle}', '{zr_chantfini}', {zr_the_geom}, '{zr_opechvol}', '{zr_anneereal}')""".format(
            zr_nomtable=self.nom_table,
            zr_sortie=self.ui.sortie.itemData(self.ui.sortie.currentIndex()),
            zr_libelle=self.ui.descriptio.toPlainText().replace("'", "''"),
            zr_chantfini=str(self.ui.chantfini.isChecked()).lower(),
            zr_the_geom=thegeom,
            zr_opechvol=self.id_opechvol,
            zr_anneereal=self.annsortie,
        )
        ok = querysauvope.exec_(query)
        if not ok:
            QtGui.QMessageBox.warning(self, "Alerte", u"Requête sauver Ope ratée")
            self.erreurSaisieBase = "1"
        self.rempliJoin()
        self.iface.setActiveLayer(coucheactive)
        QgsMapLayerRegistry.instance().removeMapLayer(memlayer.id())
        self.ui.buttonBox.button(QtGui.QDialogButtonBox.Ok).setEnabled(0)
        self.ui.compoButton.setEnabled(0)
        if self.erreurSaisieBase == "0":
            QtGui.QMessageBox.information(self, "Information", u"Données correctement saisies dans la base")
        else:
            QtGui.QMessageBox.warning(
                self, "Alerte", u"Il y a eu une erreur lors de la saisie. Données non saisies en base."
            )
        self.close()
Пример #3
0
    def sauverOpe(self):
        # Fonction à lancer quans les boutons "OK" ou "Dernier - Editer CR" sont cliqués
        # Entre en base les infos sélectionnées dans QGIS, et saisies dans le formulaire par l'utilisateur
        # Gère les erreurs "pas assez de points sélectionnés pour construire une ligne ou un polygone"
        # Gère également la transformation géométrique, via le module convert_geoms


        # Récupération de la géométrie finale. On en déduit la table où sera stockée l'information, et on gère les erreurs 
        # "pas assez de points pour faire la transformation"
        geom_cbbx=self.ui.trsf_geom.itemText(self.ui.trsf_geom.currentIndex())
        if geom_cbbx == 'Points' :
            geom_output=QGis.Point
            self.nom_table='operation_pts'
        elif geom_cbbx == 'Lignes':
            geom_output=QGis.Line
            self.nom_table='operation_lgn'
            if self.iface.activeLayer().geometryType()==0:
                if self.iface.activeLayer().selectedFeatureCount()<2:
                    mess2pts=QtGui.QMessageBox()
                    mess2pts.setText(u'Pas assez de points sélectionnés')
                    mess2pts.setInformativeText(u'Il faut au moins 2 points pour faire une ligne. Merci d\'en sélectionner plus')
                    mess2pts.setIcon(QtGui.QMessageBox.Warning)
                    mess2pts.setStandardButtons(QtGui.QMessageBox.Ok)
                    ret = mess2pts.exec_()
                    return
        elif geom_cbbx == 'Surfaces':
            geom_output=QGis.Polygon
            self.nom_table='operation_poly'
            if self.iface.activeLayer().geometryType()==0:
                if self.iface.activeLayer().selectedFeatureCount()<3:
                    mess3pts=QtGui.QMessageBox()
                    mess3pts.setText(u'Pas assez de points sélectionnés')
                    mess3pts.setInformativeText(u'Il faut au moins 3 points pour faire un polygone. Merci d\'en sélectionner plus')
                    mess3pts.setIcon(QtGui.QMessageBox.Warning)
                    mess3pts.setStandardButtons(QtGui.QMessageBox.Ok)
                    ret = mess3pts.exec_()
                    return

        #copie des entités sélectionnées dans une couche "memory". Evite les problèmes avec les types de couches "non  éditables" (comme les GPX).
        coucheactive=self.iface.activeLayer()
        entselect=[QgsGeometry(feature.geometry()) for feature in coucheactive.selectedFeatures()]
        if entselect[0].type() == QGis.Line:
            typegeom='LineString'
        elif entselect[0].type() == QGis.Point:
            typegeom='Point'
        elif entselect[0].type() == QGis.Polygon:
            typegeom='Polygon'
        else: 
            print "ce ne sont pas des points, des lignes ou des polygones"
        self.iface.actionCopyFeatures().trigger()
        if self.iface.activeLayer().crs().authid() == u'EPSG:4326':
           memlayer=QgsVectorLayer("{zr_typegeom}?crs=epsg:4326".format(zr_typegeom = typegeom), "memlayer", "memory")
        if self.iface.activeLayer().crs().authid() == u'EPSG:2154':
           memlayer=QgsVectorLayer("{zr_typegeom}?crs=epsg:2154".format(zr_typegeom = typegeom), "memlayer", "memory")
        QgsMapLayerRegistry.instance().addMapLayer(memlayer, False)
        root = QgsProject.instance().layerTreeRoot()
        memlayerNode = QgsLayerTreeLayer(memlayer)
        root.insertChildNode(0, memlayerNode)
        self.iface.setActiveLayer(memlayer)
        memlayer.startEditing()
        self.iface.actionPasteFeatures().trigger()
        memlayer.commitChanges()

        #lancement de convert_geoms.py pour transformer les entités sélectionnées dans le type d'entités choisi.

                                #compréhension de liste : [fonction for x in liste]
        geom2=convert_geometries([QgsGeometry(feature.geometry()) for feature in memlayer.selectedFeatures()],geom_output)

        #export de la géométrie en WKT et transformation de la projection si les données ne sont pas saisies en Lambert 93
        if memlayer.crs().authid() == u'EPSG:2154':
            thegeom='st_setsrid(st_geometryfromtext (\'{zr_geom2}\'), 2154)'.format(zr_geom2=geom2.exportToWkt())
        elif memlayer.crs().authid() == u'EPSG:4326':
            thegeom='st_transform(st_setsrid(st_geometryfromtext (\'{zr_geom2}\'),4326), 2154)'.format(zr_geom2=geom2.exportToWkt())
        else :
            print u'La projection de la couche active n\'est pas supportée'

        #lancement de la fonction qui vérifie si l'opération fait partie d'un chantier de volontaires.
        self.recupIdChantvol()
        #lancement de la requête SQL qui introduit les données géographiques et du formulaire dans la base de données.
        querysauvope = QtSql.QSqlQuery(self.db)
        query = u"""insert into bdtravaux.{zr_nomtable} (sortie, plangestion, code_gh, descriptio, chantfini, the_geom, ope_chvol) values ({zr_sortie}, '{zr_plangestion}', '{zr_code_gh}', '{zr_libelle}', '{zr_chantfini}', {zr_the_geom}, '{zr_opechvol}')""".format (zr_nomtable=self.nom_table,\
        zr_sortie = self.ui.sortie.itemData(self.ui.sortie.currentIndex()),\
        zr_plangestion = self.ui.opprev.currentItem().text().split("/")[-1],\
        zr_code_gh = self.ui.opprev.currentItem().text().split("/")[1],\
#        zr_ope_typ = self.ui.opreal.currentItem().text().replace("\'","\'\'"),\
        zr_libelle = self.ui.descriptio.toPlainText().replace("\'","\'\'"),\
        zr_chantfini = str(self.ui.chantfini.isChecked()).lower(),\
        zr_the_geom = thegeom,\
        #geom2.exportToWkt(),\
        #st_transform(st_setsrid(st_geometryfromtext ('{zr_the_geom}'),4326), 2154) si besoin de transformer la projection
        zr_opechvol = self.id_opechvol)
        ok = querysauvope.exec_(query)
        if not ok:
            QtGui.QMessageBox.warning(self, 'Alerte', u'Requête sauver Ope ratée')
#            print unicode(query)
        self.rempliJoinOpe()
        self.iface.setActiveLayer(coucheactive)
        QgsMapLayerRegistry.instance().removeMapLayer(memlayer.id())
        self.ui.buttonBox.button(QtGui.QDialogButtonBox.Ok).setEnabled(0)
        self.ui.compoButton.setEnabled(0)
        self.close
Пример #4
0
    def sauverOpe(self):
        # Fonction à lancer quans les boutons "OK" ou "Dernier - Editer CR" sont cliqués
        # Entre en base les infos sélectionnées dans QGIS, et saisies dans le formulaire par l'utilisateur
        # Gère les erreurs "pas assez de points sélectionnés pour construire une ligne ou un polygone"
        # Gère également la transformation géométrique, via le module convert_geoms

        # Récupération de la géométrie finale. On en déduit la table où sera stockée l'information, et on gère les erreurs
        # "pas assez de points pour faire la transformation"
        geom_cbbx = self.ui.trsf_geom.itemText(
            self.ui.trsf_geom.currentIndex())
        if geom_cbbx == 'Points':
            geom_output = QGis.Point
            self.nom_table = 'operation_pts'
        elif geom_cbbx == 'Lignes':
            geom_output = QGis.Line
            self.nom_table = 'operation_lgn'
            if self.iface.activeLayer().geometryType() == 0:
                if self.iface.activeLayer().selectedFeatureCount() < 2:
                    mess2pts = QtGui.QMessageBox()
                    mess2pts.setText(u'Pas assez de points sélectionnés')
                    mess2pts.setInformativeText(
                        u'Il faut au moins 2 points pour faire une ligne. Merci d\'en sélectionner plus'
                    )
                    mess2pts.setIcon(QtGui.QMessageBox.Warning)
                    mess2pts.setStandardButtons(QtGui.QMessageBox.Ok)
                    ret = mess2pts.exec_()
                    return
        elif geom_cbbx == 'Surfaces':
            geom_output = QGis.Polygon
            self.nom_table = 'operation_poly'
            if self.iface.activeLayer().geometryType() == 0:
                if self.iface.activeLayer().selectedFeatureCount() < 3:
                    mess3pts = QtGui.QMessageBox()
                    mess3pts.setText(u'Pas assez de points sélectionnés')
                    mess3pts.setInformativeText(
                        u'Il faut au moins 3 points pour faire un polygone. Merci d\'en sélectionner plus'
                    )
                    mess3pts.setIcon(QtGui.QMessageBox.Warning)
                    mess3pts.setStandardButtons(QtGui.QMessageBox.Ok)
                    ret = mess3pts.exec_()
                    return

        #copie des entités sélectionnées dans une couche "memory". Evite les problèmes avec les types de couches "non  éditables" (comme les GPX).
        coucheactive = self.iface.activeLayer()
        entselect = [
            QgsGeometry(feature.geometry())
            for feature in coucheactive.selectedFeatures()
        ]
        if entselect[0].type() == QGis.Line:
            typegeom = 'LineString'
        elif entselect[0].type() == QGis.Point:
            typegeom = 'Point'
        elif entselect[0].type() == QGis.Polygon:
            typegeom = 'Polygon'
        else:
            print "ce ne sont pas des points, des lignes ou des polygones"
        self.iface.actionCopyFeatures().trigger()
        if self.iface.activeLayer().crs().authid() == u'EPSG:4326':
            memlayer = QgsVectorLayer(
                "{zr_typegeom}?crs=epsg:4326".format(zr_typegeom=typegeom),
                "memlayer", "memory")
        if self.iface.activeLayer().crs().authid() == u'EPSG:2154':
            memlayer = QgsVectorLayer(
                "{zr_typegeom}?crs=epsg:2154".format(zr_typegeom=typegeom),
                "memlayer", "memory")
        QgsMapLayerRegistry.instance().addMapLayer(memlayer, False)
        root = QgsProject.instance().layerTreeRoot()
        memlayerNode = QgsLayerTreeLayer(memlayer)
        root.insertChildNode(0, memlayerNode)
        self.iface.setActiveLayer(memlayer)
        memlayer.startEditing()
        self.iface.actionPasteFeatures().trigger()
        memlayer.commitChanges()

        #lancement de convert_geoms.py pour transformer les entités sélectionnées dans le type d'entités choisi.

        #compréhension de liste : [fonction for x in liste]
        geom2 = convert_geometries([
            QgsGeometry(feature.geometry())
            for feature in memlayer.selectedFeatures()
        ], geom_output)

        #export de la géométrie en WKT et transformation de la projection si les données ne sont pas saisies en Lambert 93
        if memlayer.crs().authid() == u'EPSG:2154':
            thegeom = 'st_setsrid(st_geometryfromtext (\'{zr_geom2}\'), 2154)'.format(
                zr_geom2=geom2.exportToWkt())
        elif memlayer.crs().authid() == u'EPSG:4326':
            thegeom = 'st_transform(st_setsrid(st_geometryfromtext (\'{zr_geom2}\'),4326), 2154)'.format(
                zr_geom2=geom2.exportToWkt())
        else:
            print u'La projection de la couche active n\'est pas supportée'

        #lancement de la fonction qui vérifie si l'opération fait partie d'un chantier de volontaires.
        self.recupIdChantvol()
        #lancement de la requête SQL qui introduit les données géographiques et du formulaire dans la base de données.
        querysauvope = QtSql.QSqlQuery(self.db)
        query = u"""insert into bdtravaux.{zr_nomtable} (sortie, plangestion, code_gh, descriptio, chantfini, the_geom, ope_chvol) values ({zr_sortie}, '{zr_plangestion}', '{zr_code_gh}', '{zr_libelle}', '{zr_chantfini}', {zr_the_geom}, '{zr_opechvol}')""".format (zr_nomtable=self.nom_table,\
        zr_sortie = self.ui.sortie.itemData(self.ui.sortie.currentIndex()),\
        zr_plangestion = self.ui.opprev.currentItem().text().split("/")[-1],\
        zr_code_gh = self.ui.opprev.currentItem().text().split("/")[1],\
#        zr_ope_typ = self.ui.opreal.currentItem().text().replace("\'","\'\'"),\
        zr_libelle = self.ui.descriptio.toPlainText().replace("\'","\'\'"),\
        zr_chantfini = str(self.ui.chantfini.isChecked()).lower(),\
        zr_the_geom = thegeom,\
        #geom2.exportToWkt(),\
        #st_transform(st_setsrid(st_geometryfromtext ('{zr_the_geom}'),4326), 2154) si besoin de transformer la projection


        zr_opechvol = self.id_opechvol)
        ok = querysauvope.exec_(query)
        if not ok:
            QtGui.QMessageBox.warning(self, 'Alerte',
                                      u'Requête sauver Ope ratée')
#            print unicode(query)
        self.rempliJoinOpe()
        self.iface.setActiveLayer(coucheactive)
        QgsMapLayerRegistry.instance().removeMapLayer(memlayer.id())
        self.ui.buttonBox.button(QtGui.QDialogButtonBox.Ok).setEnabled(0)
        self.ui.compoButton.setEnabled(0)
        self.close