banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Mon 18 July 2016 11:19

CyprienAn
Juste Inscrit !
Date d'inscription: 14 Apr 2016
Messages: 3

QGIS & Python: coordonnées point d'intersection

Bonjour à tous,

Actuellement en stage, je dois réaliser un plugin QGIS pour une fédération de pêche.
Dans ce plugin, je dois obtenir au clique les coordonnées du point sur la rivière la plus proche. J'ai réussi à obtenir les coordonnées au clique mais n'arrive pas à "accrocher" mon point cliqué à la rivière (ces coordonnées servirons ensuite pour créer automatiquement une entité point accrocher à ma rivière).

J'ai trouvé cet exemple de plugin qui permet de trouver l'entité la plus proche du point cliqué et j'aimerai m'inspirer de celui-ci pour trouver le point d'intersection et donc les coordonnées accroché à ma rivière.

En simplifié, je voudrais appliquer une option d'accrochage avec une couche rivière à mon point cliqué et en récupérer les coordonnées.

En espérant avoir été assez clair sur mon problème, je vous remercie par avance de votre aide.

Code:

# -*- coding: utf-8 -*-
from qgis.gui import QgsMapTool
from qgis.core import QgsMapLayer, QgsMapToPixel, QgsFeature, QgsFeatureRequest, QgsGeometry
from PyQt4.QtGui import QCursor, QPixmap
from PyQt4.QtCore import Qt

class NearestFeatureMapTool(QgsMapTool):
    
    def __init__(self, canvas):
        super(QgsMapTool, self).__init__(canvas)
        self.canvas = canvas
        self.cursor = QCursor(Qt.CrossCursor)
        
    def activate(self):
        self.canvas.setCursor(self.cursor)
    
    def canvasReleaseEvent(self, mouseEvent): # méthode surchargée de QgsMapTool
        layerData = []
        
        for layer in self.canvas.layers():
            if layer.type() != QgsMapLayer.VectorLayer:
                # Ignore this layer as it's not a vector
                continue
            
            if layer.featureCount() == 0:
                # There are no features - skip
                continue
            
            layer.removeSelection()
            
            # Determine the location of the click in real-world coords
            layerPoint = self.toLayerCoordinates(layer, mouseEvent.pos() )
            
            print "point = " + str(layerPoint)
            
            shortestDistance = float("inf") #infini : + grande valeur possible de float
            closestFeatureId = -1
            
            # Loop through all features in the layer
            for f in layer.getFeatures():
                dist = f.geometry().distance(QgsGeometry.fromPoint(layerPoint))
                if dist < shortestDistance:
                    shortestDistance = dist
                    print dist
                    closestFeatureId = f.id()
            
            info = (layer, closestFeatureId, shortestDistance)
            layerData.append(info)
                
        if not len(layerData) > 0:
            # Looks like no vector layers were found - do nothing
            return
        
        # Sort the layer information by shortest distance
        layerData.sort(key=lambda element: element[2] ) #tri d'une liste de tuples
        
        # Select the closest feature
        layerWithClosestFeature, closestFeatureId, shortestDistance = layerData[0]
        layerWithClosestFeature.select( closestFeatureId )

Dernière modification par CyprienAn (Mon 18 July 2016 11:30)

Hors ligne

 

#2 Thu 21 July 2016 23:20

JD
Moderateur
Date d'inscription: 8 Aug 2013
Messages: 726

Re: QGIS & Python: coordonnées point d'intersection

Bonsoir,

voici un début de piste :

récupérer le clic du canvas
trouver le tronçon de rivière le plus proche de votre clic
faire une projection sur votre tronçon
récupérer les coordonnées du projeté

Est-ce cela que vous voulez faire ?

Je vous invite à regarder :

Code:

QgsSpatialIndex : nearestNeighbor()
QgsGeometry : nearestPoint()

Je vous laisse chercher un peu et je reviens vers vous quand j'ai un peu de temps

Dernière modification par lejedi76 (Thu 21 July 2016 23:20)

Hors ligne

 

#3 Fri 22 July 2016 14:29

CyprienAn
Juste Inscrit !
Date d'inscription: 14 Apr 2016
Messages: 3

Re: QGIS & Python: coordonnées point d'intersection

Cela me parait être une bonne solution en effet.
Étant débutant en Python, j'ai essayé de m'intéresser à votre proposition, j'en ai compris la logique mais n'ai pas réussi à la mettre en œuvre.

Grâce au code du plugin exemple, je réussi à récupérer la rivière la plus proche (ainsi que ça géométrie). Mais je n'arrive pas à récupérer le clic du canvas, j'ai donc essayé en récupérant les coordonnées et en en faisant un point avec QgsGeometry.fromPoint(QgsPoint(self.x,self.y)). Mais je n'arrive alors pas à utiliser le "nearestPoint() afin de projeter le point sur la rivière.

Je n'ai donc pas non plus utilisé "nearestNeighbor", n'ayant pas réussi à créer le QgsSpatialIndex.


En vous remerciant de l'aide que vous m'apportez.

Dernière modification par CyprienAn (Fri 22 July 2016 14:32)

Hors ligne

 

Pied de page des forums

Powered by FluxBB