#1 Mon 15 January 2018 09:44
- hotegbe
- Participant occasionnel
- Date d'inscription: 28 Jun 2017
- Messages: 32
QGIS: ordonnancement de points le long d'une ligne
Bonjour à tous,
je recherche un script python me permettant de parcourir une ligne intersectant des points dans le sens de mon choix.
le premier point rencontré dans le sens de parcours aura pour numéro 1, le deuxième point aura le numéro 2 et ainsi de suite jusqu'à la fin de mon parcours.
auriez vous des propositions de code svp?
merci
Cordialement, Hotegbe
Hors ligne
#2 Tue 16 January 2018 10:43
Re: QGIS: ordonnancement de points le long d'une ligne
Bonjour,
On dirait un parcours de graphe. Il vous faudra sans doute faire appel à la QGIS network analysis library
En voici un exemple : https://gis.stackexchange.com/questions … -algorithm
A noter que dans la dernière version de QGIS, il y a des scripts déjà faits dans la boîte à outils traitement, onglet Analyse de réseau, relatifs aux plus courts chemins. Notamment, il y a un script appelé "de point à point", qui semble répondre à votre question de façon assez proche
geodata au cerema et petits billets en géomatique
Hors ligne
#3 Tue 16 January 2018 14:45
- hotegbe
- Participant occasionnel
- Date d'inscription: 28 Jun 2017
- Messages: 32
Re: QGIS: ordonnancement de points le long d'une ligne
je ne recherche pas le chemin le plus court dans mon réseau je recherche à mémoriser les points qui intersectent ma ligne dans selon le sens de parcours de ma ligne. si je parcours ma ligne de bas en haut par exemple le premier point intersecté sera le 1 le deuxième le 2 le 3eme le 3 ainsi de suite.
j'ai essayé le code suivant mais n'ayant pas beaucoup d’expériences en python je suis un peu bloqué. :
Code:
[cofor f in CB.getFeatures(): geom2 = f.geometry() if f['numero']==1: for b in BP.getFeatures(): geom1 = b.geometry() liste2.append(geom1) if geom2.intersects(geom1): liste1.append(b[0])
mais j'obtiens mais mes entités dans ma liste dans un ordre aléatoire.
dans l'image ci-jointe si je parcours ma ligne de bas en haut je dois stocker dans mon tableau les valeurs : [24, 20, 29, 28, 27, 26, 21]
or avec mon code je récupère dans mon tableau :[21, 24., 26., 27, 28, 29, 30].
Merci d'avance pour vos aides
Dernière modification par hotegbe (Tue 16 January 2018 14:55)
Hors ligne
#4 Tue 16 January 2018 15:21
Re: QGIS: ordonnancement de points le long d'une ligne
Bonjour,
Dans l'API, vous avez une fonction appelée lineLocatePoint qui semble répondre à votre question.
https://qgis.org/api/classQgsGeometry.h … b005f673ca
Elle vous donnera une valeur de distance qui est la distance entre le début de la ligne et le point situé sur la ligne qui est le plus proche du point source à projeter.
A partir de cette valeur, vous pourrez ordonner les points de votre liste et leur affecter le bon identifiant numérique
geodata au cerema et petits billets en géomatique
Hors ligne
#5 Tue 16 January 2018 15:42
- hotegbe
- Participant occasionnel
- Date d'inscription: 28 Jun 2017
- Messages: 32
Re: QGIS: ordonnancement de points le long d'une ligne
Malheureusement cette fonction ne résout pas mon problème car mon code doit tourner pour n lignes différentes et je ne vais pas à chaque fois choisir un point de départ; il faudra juste pour moi à minima spécifier ma ligne et un sens de parcours de la ligne
Hors ligne
#6 Wed 17 January 2018 10:24
Re: QGIS: ordonnancement de points le long d'une ligne
Bonjour,
Cette fonction ne nécessite pas de point de départ. A minima, pour affecter un ordre de parcours, il faut bien s'appuyer sur un sens de parcours, et la fonction pré-citée lineLocatePoint, donne la distance de chaque point par rapport au début de la ligne (début qui dépend de son sens).
Sans forcément aller dans le code, ce que vous conseille, c'est :
- d'inverser le sens de certaines lignes si besoin est avec le plugin" swap line direction" ou en codage : https://gis.stackexchange.com/questions … on-in-qgis
-> itérer sur chaque ligne :
-> pour chaque ligne :
- avoir la distance pour chaque point de la ligne auquel il est associé (cela signifie qu'il faut avoir une association point-ligne issue d'intersection, ou un champ attributaire idLigne pour les points) : lineLocatePoint
- ordonner les points en fonction de la distance et donner un id numérique en fonction de l'ordre
J'espère avoir bien répondu à votre questionnement
geodata au cerema et petits billets en géomatique
Hors ligne