Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
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

Suite à un problème technique intervenu entre le 22 et le 23 mars, nous avons du procéder dans la soirée du 25 mars, à la restauration de la base de données du 24 mars (matinée).

En clair, nous avons perdu vos contributions et inscriptions du dimanche 24 et du lundi 25 mars.
Nous vous prions de nous excuser.

#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


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

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: 236

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


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#5 Mon 07 August 2017 10:16

YoLecomte
Participant assidu
Lieu: Epinal
Date d'inscription: 7 Jul 2015
Messages: 236

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


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#8 Mon 07 August 2017 11:54

YoLecomte
Participant assidu
Lieu: Epinal
Date d'inscription: 7 Jul 2015
Messages: 236

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: 236

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: 236

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: 236

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)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#16 Tue 08 August 2017 13:32

YoLecomte
Participant assidu
Lieu: Epinal
Date d'inscription: 7 Jul 2015
Messages: 236

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: 236

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

 

Pied de page des forums

Powered by FluxBB