Pages: 1
- Sujet précédent - QGIS: calculer la longueur des segments contenus le long d'une ligne - Sujet suivant
#1 Thu 03 August 2017 14:28
- hotegbe
- Participant occasionnel
- Date d'inscription: 28 Jun 2017
- Messages: 32
QGIS: calculer la longueur des segments contenus le long d'une ligne
Bonjour à tous.
La question que je vais poser a déjà été posée sur d'autres forums mais la mienne en est une petite nuance vu qu'elle n'a toujours pas de réponse claire à ce jour.
Je dispose d'une couche P de points et d'une couche L de ligne. mes points intersectent bien mes lignes en formant des nœuds le long de ma ligne.
Mon but est de calculer la longueur de chaque segment contenus le long de ma ligne comme ceci
[img][/img]
J'ai essayé le code suivant sans succès
Code:
import itertools layer = iface.activeLayer() features = layer.getFeatures() lines = [feature.geometry().asPolyline() for feature in features] k = 0 for points in lines: n = len(points) list = range(n) print "line" + str(k) + ", " + str(n) + " points" length_segments = [sqrt(points[i].sqrDist(points[j])) for i,j in itertools.combinations(list, 2) if (j - i) == 1] for length in length_segments: i = length_segments.index(length) print "segment = %d, length = %.2f" % (i, length) sum += length k += 1
sans succès.
pourriez vous m'aider svp?
Cordialement
Hors ligne
#2 Fri 04 August 2017 10:06
- mfangain
- Participant actif
- Date d'inscription: 12 Jun 2012
- Messages: 88
Re: QGIS: calculer la longueur des segments contenus le long d'une ligne
Bonjour,
vu le code que vous avez indiqué, je suppose que vos données ne sont pas dans un fichier shp mais plutôt en base de données?
Dans ce cas, vous pourriez éventuellement créer une vue de découpe des lignes par les points (fonction st_line_substring sous postgis), et calculer ensuite la longueur de ces linéraires.
Après tout dépend de ce que vous voulez en faire (est-ce une seule fois, des mises à jour doivent-elles être faites de façon dynamique, quelle exploitation ensuite,...)
MFANGAIN
Hors ligne
#3 Fri 04 August 2017 11:50
- YoLecomte
- Participant assidu
- Lieu: Epinal
- Date d'inscription: 7 Jul 2015
- Messages: 266
Re: QGIS: calculer la longueur des segments contenus le long d'une ligne
Est ce que les noeuds des lignes correspondent strictement aux points?
Auquel cas, la couche de point ne sert à rien...
Voila une fonction qui permet de faire ce que tu demandes :
Code:
import processing from PyQt4.QtCore import QVariant def calculate_length(layerSource): '''explose les lignes sources en bi-point, ajoute un champ 'temp' et le remplis avec la longueur de la ligne''' #exploser les lignes en bi-point et recuperer le layer resultat layer = processing.runalg("qgis:explodelines", layerSource.source(), None) print layer layer = QgsVectorLayer(layer.get('OUTPUT'), layerSource.name()+'_with_length','ogr') print layer layer.startEditing() #creer un champ temp pour y stocker la longueur et recuperer son id length_field = QgsField('temp', QVariant.Double) layer.dataProvider().addAttributes([length_field]) layer.commitChanges() layer.startEditing() idx_layer = layer.fieldNameIndex('temp') #calculer la longueur de chaque ligne et remplir le champ temp avec cette valeur for f in layer.getFeatures(): xy = f.geometry() length = xy.length() layer.changeAttributeValue(f.id(),idx_layer, length) layer.commitChanges() #ajouter la nouvelle couche au canevas QgsMapLayerRegistry.instance().addMapLayer(layer) calculate_length(iface.activeLayer())
Hors ligne
#4 Mon 07 August 2017 08:19
- hotegbe
- Participant occasionnel
- Date d'inscription: 28 Jun 2017
- Messages: 32
Re: QGIS: calculer la longueur des segments contenus le long d'une ligne
Bonjour,
les noeuds des lignes correspondent strictement à la couche des points.
Votre code me renvoie la longueur de tous les noeuds intersectant ma polyligne (j'ai vérifié cela avec l'outil de noeud dans qgis).
Pour ma part je ne recherche que la longueur des segments formés par les points de ma couche de points le long de ma ligne comme indiqué dans le fichier joint.
Avez vous une idée svp?
Merci
Hors ligne
#5 Mon 07 August 2017 10:16
- YoLecomte
- Participant assidu
- Lieu: Epinal
- Date d'inscription: 7 Jul 2015
- Messages: 266
Re: QGIS: calculer la longueur des segments contenus le long d'une ligne
Sur la capture d'écran, on a l'impression que c'est la longueur entre chaque noeud qui est affichée... Or, il semblerait que ce ne soit pas ce que vous recherchez.
Avez vous la possibilité de mettre une capture d'écran plus parlante?
Est ce que c'est la longueur entre chaque point en parcourant le réseau qu'il vous faut? Auquel cas il faut faire appel à des outils de routing.
Hors ligne
#6 Mon 07 August 2017 10:51
- hotegbe
- Participant occasionnel
- Date d'inscription: 28 Jun 2017
- Messages: 32
Re: QGIS: calculer la longueur des segments contenus le long d'une ligne
Exactement c'est la longueur entre chaque point en parcourant le réseau qu'il me faut.
en utilisant l'outil de noeud il y a des noeuds cachés qui s'affichent.
Ce qu'il me faut c'est la longueur entre les points du réseau. Sachant que les points peuvent être considérés comme des sommets d'un graphe dans le réseau
Hors ligne
#7 Mon 07 August 2017 10:56
- hotegbe
- Participant occasionnel
- Date d'inscription: 28 Jun 2017
- Messages: 32
Re: QGIS: calculer la longueur des segments contenus le long d'une ligne
Dans cette image on distingue bien un tronçon du réseau.
Les points correspondent à des points ou sommets du réseau.
C'est la distance entre ces points qu'il me faut
Hors ligne
#8 Mon 07 August 2017 11:54
- YoLecomte
- Participant assidu
- Lieu: Epinal
- Date d'inscription: 7 Jul 2015
- Messages: 266
Re: QGIS: calculer la longueur des segments contenus le long d'une ligne
OK alors vous pouvez utiliser l'algorithme de calcul du plus court chemin (dijkstra) que vous avez déjà en donnant ces points comme départ et arrivé. Il me semble que c'est le mieux.
Hors ligne
#9 Mon 07 August 2017 12:08
- hotegbe
- Participant occasionnel
- Date d'inscription: 28 Jun 2017
- Messages: 32
Re: QGIS: calculer la longueur des segments contenus le long d'une ligne
l'algorithme de dijkstra que j'ai déjà utlisé me permet de trouver le chemin le plus court dans mon réseau en donnant un point de départ et d'arrivée cela fonctionne bien.
Ce chemin court généré par l'algorithme de dijkstra passe par des points et ma problématique est de trouver à présent la distance entre tous ces points à travers lequel mon linéaire passe. Ces points constituent des sommets entre autre de mon graphe.
Je vous mets ci-joint le code complet de mon traitement
Code:
from PyQt4.QtCore import * from PyQt4.QtGui import * from qgis.core import * from qgis.gui import * from qgis.networkanalysis import * from shapely.geometry import MultiLineString vl = qgis.utils.iface.mapCanvas().currentLayer() director = QgsLineVectorLayerDirector(vl, -1, '', '', '', 3) properter = QgsDistanceArcProperter() director.addProperter(properter) crs = qgis.utils.iface.mapCanvas().mapRenderer().destinationCrs() builder = QgsGraphBuilder(crs) pStart = QgsPoint(794035.724801,2096061.91691) pStop = QgsPoint(794222.102796,2095908.42915) tiedPoints = director.makeGraph(builder, [pStart, pStop]) graph = builder.graph() tStart = tiedPoints[0] tStop = tiedPoints[1] idStart = graph.findVertex(tStart) idStop = graph.findVertex(tStop) (tree, cost) = QgsGraphAnalyzer.dijkstra(graph, idStart, 0) if tree[idStop] == -1: print "pas de cheminement" else: p = [] curPos = idStop while curPos != idStart: pnt = graph.vertex(graph.arc(tree[curPos]).inVertex()).point() p.append(pnt) curPos = graph.arc(tree[curPos]).outVertex() p.append(tStart) geom = QgsGeometry.fromPolyline(p) print p v_layer = None for layer in QgsMapLayerRegistry.instance().mapLayers().values(): if layer.name() == 'cable': v_layer = layer pr = v_layer.dataProvider() v_layer.startEditing() seg = QgsFeature() seg.setGeometry(geom) pr.addFeatures( [seg] ) v_layer.commitChanges().
Mon feature créé dans le layer cable est ma ligne.
Le but à présent est de calculer la longueur des segments formés par les sommets du graphe que cette ligne traverse.
Cordialement
Dernière modification par hotegbe (Mon 07 August 2017 12:11)
Hors ligne
#10 Mon 07 August 2017 14:03
- YoLecomte
- Participant assidu
- Lieu: Epinal
- Date d'inscription: 7 Jul 2015
- Messages: 266
Re: QGIS: calculer la longueur des segments contenus le long d'une ligne
c'est donc la longueur de la ligne créée par votre code. Où est le problème?
Hors ligne
#11 Mon 07 August 2017 15:00
- hotegbe
- Participant occasionnel
- Date d'inscription: 28 Jun 2017
- Messages: 32
Re: QGIS: calculer la longueur des segments contenus le long d'une ligne
Ce que je recherche ce n'est pas la longueur totale de la ligne créée par mon code mais plutôt la longueur de chaque tronçon (segment) contenu dans ma ligne.
Dernière modification par hotegbe (Mon 07 August 2017 15:01)
Hors ligne
#12 Mon 07 August 2017 17:30
- YoLecomte
- Participant assidu
- Lieu: Epinal
- Date d'inscription: 7 Jul 2015
- Messages: 266
Re: QGIS: calculer la longueur des segments contenus le long d'une ligne
alors il faut appliquer le code que j'ai proposé au début de cette discussion à la ligne créée par ton code
Dernière modification par YoLecomte (Mon 07 August 2017 17:42)
Hors ligne
#13 Tue 08 August 2017 12:06
- hotegbe
- Participant occasionnel
- Date d'inscription: 28 Jun 2017
- Messages: 32
Re: QGIS: calculer la longueur des segments contenus le long d'une ligne
Bonjour, l'application du code proposé à la ligne créee par mon code fourni le meme réultat.
Votre code revient à utiliser explode line de qgis. Il me donne la longueur de tous les segments formés par les noeuds de ma ligne.
mais moi je recherche plutôt la longueur des segments formés par les sommets de mon graphe par le quel ma ligne passe.
C'est pas la même chose
Hors ligne
#14 Tue 08 August 2017 12:27
- YoLecomte
- Participant assidu
- Lieu: Epinal
- Date d'inscription: 7 Jul 2015
- Messages: 266
Re: QGIS: calculer la longueur des segments contenus le long d'une ligne
Je ne comprend pas la difference...
Hors ligne
#15 Tue 08 August 2017 12:54
- hotegbe
- Participant occasionnel
- Date d'inscription: 28 Jun 2017
- Messages: 32
Re: QGIS: calculer la longueur des segments contenus le long d'une ligne
Comme vous pouvez le voir dans l'image ci-jointe.
La même ligne est affichée avec et sans nœuds.
Au départ on a une ligne simple qui traverse les sommets du graphe.
En appliquant l'outil de nœud sur cette ligne dans Qgis, on remarque que entre les sommets du graphe il existe des nœuds qui ne s'affichent que quand on applique l'outil de nœud à la ligne.
Votre code renvoie la longueur des segments contenus entre tous les nœuds y compris ceux qui ne s'affichent que quand on applique l'outil de nœud.
Le but est d'avoir uniquement la longueur compris entre les sommets du graphe sans prendre en compte les longueurs comprises entre les nœuds cachés..
J'espère que c'est plus clair maintenant.
Merci
Dernière modification par hotegbe (Tue 08 August 2017 12:56)
Hors ligne
#16 Tue 08 August 2017 13:32
- YoLecomte
- Participant assidu
- Lieu: Epinal
- Date d'inscription: 7 Jul 2015
- Messages: 266
Re: QGIS: calculer la longueur des segments contenus le long d'une ligne
Alors avec ton algorihme de djikstra, il y a ce qu'il faut. Il suffit de le faire tourner pour chaque paires de points beiges sur l'image. Ainsi, la ligne créée correpond au segment recherché.
Hors ligne
#17 Tue 08 August 2017 15:07
- hotegbe
- Participant occasionnel
- Date d'inscription: 28 Jun 2017
- Messages: 32
Re: QGIS: calculer la longueur des segments contenus le long d'une ligne
Comment boucler sur une paire de points? avez vous une fonction svp?
Merci
Hors ligne
#18 Tue 08 August 2017 15:58
- YoLecomte
- Participant assidu
- Lieu: Epinal
- Date d'inscription: 7 Jul 2015
- Messages: 266
Re: QGIS: calculer la longueur des segments contenus le long d'une ligne
le pseudo code serait du genre:
Code:
for paire_de_point in liste_de_paire_de_point: pstart = paire_de_point[0] pstop = paire_de_point[1] appliquer djikstra(pstart,pstop)
Hors ligne
Pages: 1
- Sujet précédent - QGIS: calculer la longueur des segments contenus le long d'une ligne - Sujet suivant