#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