Message posté par : Marcopololo
----------------------------------------
Bonjour,
Mon code fonctionne à peu près, mais il boucle deux fois au lieu d'une et je
n'arrive pas à en trouver l'origine...
Merci de votre aide
-----------------
Code :
# -*- coding: utf-8 -*-
"""
/***************************************************************************
CoordClick
A QGIS plugin
Affichage coordonnées sur click souris
Generated by Plugin Builder:
http://g-sherman.github.io/Qgis-Plugin-Builder/
-------------------
begin : 2025-03-31
git sha : $Format:%H$
copyright : (C) 2025 by Marc GROSJEAN
email : marc.grosjean(a)wanadoo.fr
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
"""
from qgis.PyQt.QtCore import QSettings, QTranslator, QCoreApplication
from qgis.PyQt.QtGui import QIcon
from qgis.PyQt.QtWidgets import QAction
from qgis.gui import QgsMapToolEmitPoint
from qgis.core import (
QgsProject,
QgsVectorLayer,
QgsFeature,
QgsGeometry,
QgsPointXY,
)#imports pour partie programme recherche parcelle
# Initialize Qt resources from file resources.py
from .resources import *
# Import the code for the dialog
from .coord_click_dialog import CoordClickDialog
import os.path
class CoordClick:
"""QGIS Plugin Implementation."""
def display_point(self, point, button):
# Affiche les coordonnées du clic
#Instances recherche id parcelle
projet = QgsProject.instance()
coucheParcelles = projet.mapLayersByName("parcelles moyenmoutier")[0]
entites = coucheParcelles.getFeatures()
self.dlg.hide() # cache la boite de dialogue
coords = "{}, {}".format(point.x(), point.y()) ## formatage des
coordonnées
print("coordo:",coords)
pc = QgsGeometry.fromPointXY(QgsPointXY(point.x(), point.y()))
pc2 = pc.asPoint()
# Affichage point et numéro parcelle correpondante
# création point en mémoire
layer = QgsVectorLayer('Point?crs=epsg:4326&field=id:integer',
'pointDemo', 'memory')
pr = layer.dataProvider()
point = QgsFeature()
point.setGeometry(pc)
#point.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(6.952679,48.381057)))
pr.addFeatures([point])
#layer.updateExtents() # Création couche pointDemo
#QgsProject.instance().addMapLayers([layer])
for e in entites:
if point.geometry().within(e.geometry()):
print(e.attributes()[1])
print(e.attributes()[4],e.attributes()[5])
self.dlg.coordClick.setText(coords) # affichage des coordonnées dans la
boite de dialogue
self.dlg.numParc.setText(e.attributes()[1])
self.dlg.coord2.setText((e.attributes()[4]) + (e.attributes()[5]))
self.dlg.show() # affiche de nouveau la boite de dialogue
def __init__(self, iface):
"""Constructor.
:param iface: An interface instance that will be passed to this class
which provides the hook by which you can manipulate the QGIS
application at run time.
:type iface: QgsInterface
"""
# Save reference to the QGIS interface
self.iface = iface
# initialize plugin directory
self.plugin_dir = os.path.dirname(__file__)
## Récupération du canvas courant
self.canvas = self.iface.mapCanvas()
## Création d'un outil émettant un point au clic
self.point_tool = QgsMapToolEmitPoint(self.canvas)
# initialize locale
locale = QSettings().value('locale/userLocale')[0:2]
locale_path = os.path.join(
self.plugin_dir,
'i18n',
'CoordClick_{}.qm'.format(locale))
if os.path.exists(locale_path):
self.translator = QTranslator()
self.translator.load(locale_path)
QCoreApplication.installTranslator(self.translator)
# Declare instance attributes
self.actions = []
self.menu = self.tr(u'&Coordonnées sur click')
# Check if plugin was started the first time in current QGIS session
# Must be set in initGui() to survive plugin reloads
self.first_start = None
# noinspection PyMethodMayBeStatic
def tr(self, message):
"""Get the translation for a string using Qt translation API.
We implement this ourselves since we do not inherit QObject.
:param message: String for translation.
:type message: str, QString
:returns: Translated version of message.
:rtype: QString
"""
# noinspection PyTypeChecker,PyArgumentList,PyCallByClass
return QCoreApplication.translate('CoordClick', message)
# Création de la boite de dialogue (après les traductions)
self.dlg = CoordClickDialog()
def add_action(
self,
icon_path,
text,
callback,
enabled_flag=True,
add_to_menu=True,
add_to_toolbar=True,
status_tip=None,
whats_this=None,
parent=None):
"""Add a toolbar icon to the toolbar.
:param icon_path: Path to the icon for this action. Can be a resource
path (e.g. ':/plugins/foo/bar.png') or a normal file system path.
:type icon_path: str
:param text: Text that should be shown in menu items for this action.
:type text: str
:param callback: Function to be called when the action is triggered.
:type callback: function
:param enabled_flag: A flag indicating if the action should be enabled
by default. Defaults to True.
:type enabled_flag: bool
:param add_to_menu: Flag indicating whether the action should also
be added to the menu. Defaults to True.
:type add_to_menu: bool
:param add_to_toolbar: Flag indicating whether the action should also
be added to the toolbar. Defaults to True.
:type add_to_toolbar: bool
:param status_tip: Optional text to show in a popup when mouse pointer
hovers over the action.
:type status_tip: str
:param parent: Parent widget for the new action. Defaults None.
:type parent: QWidget
:param whats_this: Optional text to show in the status bar when the
mouse pointer hovers over the action.
:returns: The action that was created. Note that the action is also
added to self.actions list.
:rtype: QAction
"""
icon = QIcon(icon_path)
action = QAction(icon, text, parent)
action.triggered.connect(callback)
action.setEnabled(enabled_flag)
if status_tip is not None:
action.setStatusTip(status_tip)
if whats_this is not None:
action.setWhatsThis(whats_this)
if add_to_toolbar:
# Adds plugin icon to Plugins toolbar
self.iface.addToolBarIcon(action)
if add_to_menu:
self.iface.addPluginToMenu(
self.menu,
action)
self.actions.append(action)
return action
def initGui(self):
"""Create the menu entries and toolbar icons inside the QGIS
GUI."""
icon_path = ':/plugins/coord_click/icon.png'
self.add_action(
icon_path,
text=self.tr(u'Infos parcelle et coordonnées'),
callback=self.run,
parent=self.iface.mainWindow())
# will be set False in run()
self.first_start = True
# connecte le signal que le canvas a été cliqué
self.point_tool.canvasClicked.connect(self.display_point)
def unload(self):
"""Removes the plugin menu item and icon from QGIS
GUI."""
for action in self.actions:
self.iface.removePluginMenu(
self.tr(u'&Coordonnées sur click'),
action)
self.iface.removeToolBarIcon(action)
def run(self):
"""Run method that performs all the real work"""
# Create the dialog with elements (after translation) and keep reference
# Only create GUI ONCE in callback, so that it will only load when the plugin is
started
if self.first_start == True:
self.first_start = False
#création boite de dialogue
self.dlg = CoordClickDialog()
# connecte le signal que le canvas a été cliqué
self.point_tool.canvasClicked.connect(self.display_point)
# Défini coorclick comme étant l'outil de carte actif
self.canvas.setMapTool(self.point_tool)
# show the dialog
# self.dlg.show()
# Run the dialog event loop
#result = self.dlg.exec_()
# See if OK was pressed
#if result:
# Do something useful here - delete the line containing pass and
# substitute with your code.
#pass
-----------------
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=372508#p372508
Pour y répondre : qgis_fr(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net