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
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()
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
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