J'ai deux couches vectorielles, dont l'une est une couche ponctuelle basée sur des "événements" par télédétection et la seconde est une couche linéaire issue de la recherche locale.
Dans mon cas, ce sont des tremblements de terre et des failles tectoniques, mais je suppose que l'on pourrait simplement choisir "les accidents de voiture et les routes" comme exemple général.
Donc, ce que je voudrais faire, c'est déplacer / copier les points sur le point le plus proche des lignes, tant que c'est dans une distance de tolérance (disons 1-2 km ou 0,0xx °), avec la nouvelle couche de points (+ attr déplacé o / n).
Des idées ?
Linux, QGIS 1.8
Réponses:
Publié un extrait de code (testé dans la console python) qui fait ce qui suit
Edit: Je viens de découvrir que la méthode @radouxju utilisant le plus procheSegmentWithContext donne les mêmes résultats en moins de lignes de code. Je me demande pourquoi ils ont trouvé ce nom de méthode étrange? aurait dû être quelque chose comme le plus prochePointOnGeometry.
Nous pouvons donc éviter les galbes et faire comme,
la source
voici un pseudo-code pour commencer. J'espère que cela aide et que quelqu'un aura le temps de fournir le code complet (je n'en ai pas pour le moment)
La première chose à faire est de boucler sur le point et de sélectionner les lignes situées à l'intérieur de la distance seuil de chaque point. Cela peut être fait avec QgsSpatialIndex
Dans la première boucle, la deuxième chose à faire est de boucler sur les lignes sélectionnées et de trouver le point le plus proche sur la ligne. Cela peut être fait directement sur la base de QgsGeometry :: narrowSegmentWithContext
la troisième étape (au sein de la première boucle) consisterait à mettre à jour la géométrie du point avec la géométrie du minDistPoint avec la plus petite distance
mise à jour avec du code (sur QGIS3)
la source