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é ?

#1 Mon 23 May 2016 21:21

Sophie_Géo
Participant actif
Lieu: Nantes
Date d'inscription: 16 Jul 2012
Messages: 59

QGIS: Récupérer les noms des Noeuds aux extrémités d'une polyligne

Bonjour,

J'ai un fichier de noeuds et un fichier de polylignes, je suis sous spatialite (c'est le même SQL que pgsql).

Dans mon fichier polylignes, j'ai 2 champs, "NOEUDA" et "NOEUDB" qui sont vides.
Dans mon fichier noeuds, j'ai un champ "identifiant" unique pour chaque noeud.

Je souhaite récupérer grâce à une petite ligne de code l'identifiant du noeud à chaque extrémité de ma polyligne.

Je sais qu'il y a un st_intersect, st_startpoint, st_endpoint mais je ne sais pas comment les articuler pour remplir mes 2 champs dans ma table polylignes...

J'ai essayé ça, qui sélectionne bien mes points intersectant avec mes lignes mais comment remplir ensuite mes champs NOEUD A et NOEUD B? :
"select id from polylignes, noeuds where st_intersects(polylignes.geom,noeuds.geom)"

Merci pour votre aide précieuse

Sophie

Hors ligne

 

#2 Tue 24 May 2016 07:45

SIGEAL
Participant assidu
Lieu: Saint Laurent des Combes
Date d'inscription: 5 Sep 2005
Messages: 195
Site web

Re: QGIS: Récupérer les noms des Noeuds aux extrémités d'une polyligne

Bonjour,

Une sous-requête peut faire l'affaire (pas très rapide, mais ça fonctionne) :

Code:

select id,
(select id_arret from noeuds n where st_within(st_startpoint(p.geometry), st_buffer(n.geometry, 1))) n_deb,
(select id_arret from noeuds n where st_within(st_endpoint(p.geometry), st_buffer(n.geometry, 1))) n_fin
from polylignes p;

À adapter pour mettre à jour la table polylignes.


Christophe Damour (SIGéal)

Hors ligne

 

#3 Fri 27 May 2016 16:25

Sophie_Géo
Participant actif
Lieu: Nantes
Date d'inscription: 16 Jul 2012
Messages: 59

Re: QGIS: Récupérer les noms des Noeuds aux extrémités d'une polyligne

Bonjour,

Merci, ça me mets déjà pas mal sur la piste. Cependant ça ne me donne pas les bons NOEUDA et NOEUDB aux extrémités des polylignes...
Et je ne vois pas du tout comment remplir ces données dans mes champs NOEUDA et NOEUDB.

Merci pour votre aide,

Sophie

Hors ligne

 

#4 Fri 27 May 2016 17:22

SIGEAL
Participant assidu
Lieu: Saint Laurent des Combes
Date d'inscription: 5 Sep 2005
Messages: 195
Site web

Re: QGIS: Récupérer les noms des Noeuds aux extrémités d'une polyligne

Bonjour,

ça ne me donne pas les bons NOEUDA et NOEUDB aux extrémités des polylignes


Pouvez-vous être plus précise ?
Vos couches sont-elles topologiquement correctes (noeuds superposés aux extrémités de polylignes) ?
Vos polylignes sont-elle simples, ou des collections (multilinestring) ?

Pour la mise à jour, il faut utiliser update :

Code:

update polylignes set noeuda = 
(select a.id_arret from noeuds as a where st_within(st_startpoint(polylignes.geometry), st_buffer(noeuds.geometry, 1)))

Requête non testée, une recherche sur spatialite update join vous donnera plus d'informations.


Christophe Damour (SIGéal)

Hors ligne

 

#5 Mon 30 May 2016 10:39

Sophie_Géo
Participant actif
Lieu: Nantes
Date d'inscription: 16 Jul 2012
Messages: 59

Re: QGIS: Récupérer les noms des Noeuds aux extrémités d'une polyligne

Bonjour,

Oui je connais plutôt bien le problème.

Lors de l'import des shapes dans spatialite il me convertit les lignes en multilignes et les points en multipoint. C'est la raison pour laquelle je suppose que ça ne fonctionne pas super bien. D'ailleurs sur un ST_stratpoint seul, mes champs sont tous vides...

J'ai essayé de faire comme sur postgresql  :

alter table matable alter column the_geom type geometry(Linestring, <srid>)using st_geometryN(the_geom, 1);

Mais spatialite ne tolère pas les commandes alter table et alter column. Je sais pas par quoi les remplacer?

Merci pour votre réponse.

Sophie

Hors ligne

 

#6 Mon 30 May 2016 10:53

SIGEAL
Participant assidu
Lieu: Saint Laurent des Combes
Date d'inscription: 5 Sep 2005
Messages: 195
Site web

Re: QGIS: Récupérer les noms des Noeuds aux extrémités d'une polyligne

Bonjour,

Plutôt que de modifier le type de colonne, ce qui n'est effectivement pas possible sous SQLite, essayez d'extraire la première polyligne de la collection :

Code:

update polylignes set noeuda = 
(select a.id_arret from noeuds as a where st_within(st_startpoint(st_geometryN(polylignes.geometry, 1)), st_buffer(noeuds.geometry, 1)))

Il faudrait cependant vérifier préalablement la topologie de votre couche : Y a-t-il des polylignes avec plusieurs secitons ? Si oui pourquoi ?


Christophe Damour (SIGéal)

Hors ligne

 

#7 Mon 30 May 2016 11:07

Sophie_Géo
Participant actif
Lieu: Nantes
Date d'inscription: 16 Jul 2012
Messages: 59

Re: QGIS: Récupérer les noms des Noeuds aux extrémités d'une polyligne

Il n'y a pas de polylignes en plusieurs sections, c'est juste une 4 lignes droites parfaitement jointes par des points réparties un peu partout dans l'espace. J'ai crée un projet d'exemple tout simple.

Dernière modification par Sophie_Géo (Mon 30 May 2016 11:08)

Hors ligne

 

#8 Mon 30 May 2016 14:05

SIGEAL
Participant assidu
Lieu: Saint Laurent des Combes
Date d'inscription: 5 Sep 2005
Messages: 195
Site web

Re: QGIS: Récupérer les noms des Noeuds aux extrémités d'une polyligne

Alors ça devrait fonctionner, sinon vous pouvez mettre vos données en pièce jointe.


Christophe Damour (SIGéal)

Hors ligne

 

#9 Mon 30 May 2016 15:13

Sophie_Géo
Participant actif
Lieu: Nantes
Date d'inscription: 16 Jul 2012
Messages: 59

Re: QGIS: Récupérer les noms des Noeuds aux extrémités d'une polyligne

Je dois avouer que cela m'as un peu gonflée donc je suis passée sur pgsql et j'ai correctement transformé mes multilignes en lignestring.
Du coup j'ai lancé votre 1ère requête avec le update et il me dit en erreur :

ERREUR:  référence invalide d'une entrée de la clause FROM pour la table « noeuds »

Hors ligne

 

#10 Mon 30 May 2016 15:40

SIGEAL
Participant assidu
Lieu: Saint Laurent des Combes
Date d'inscription: 5 Sep 2005
Messages: 195
Site web

Re: QGIS: Récupérer les noms des Noeuds aux extrémités d'une polyligne

Il y avait une coquille dans mon exemple :

Code:

update polylignes set noeuda = 
(select a.id_arret from noeuds as a where st_within(st_startpoint(st_geometryN(polylignes.geometry, 1)), st_buffer(a.geometry, 1)))

Christophe Damour (SIGéal)

Hors ligne

 

#11 Mon 30 May 2016 16:58

Sophie_Géo
Participant actif
Lieu: Nantes
Date d'inscription: 16 Jul 2012
Messages: 59

Re: QGIS: Récupérer les noms des Noeuds aux extrémités d'une polyligne

Bonjour,

Merci pour votre aide.

Nous avons cherché avec mon collègue et cette requête fonctionne aussi:

Code:

update polylignes set noeuda = ( select idnoeud from (select idnoeud,polylignes.gid from noeuds, polylignes where st_within(st_startpoint(polylignes.geom), st_buffer(noeuds.geom, 1))) as a where a.gid=polylignes.gid)

Merci à vous, vous nous avez été d'une grande aide!

Sophie

Dernière modification par Sophie_Géo (Mon 30 May 2016 16:58)

Hors ligne

 

#12 Mon 30 May 2016 17:25

Sophie_Géo
Participant actif
Lieu: Nantes
Date d'inscription: 16 Jul 2012
Messages: 59

Re: QGIS: Récupérer les noms des Noeuds aux extrémités d'une polyligne

EDIT :

J'ai tout de même essayé votre requête et ça ne fonctionne pas.

Il me renvoie toujours l'erreur :
ERREUR:  plus d'une ligne renvoyée par une sous-requête utilisée comme une expression

Il manque dans votre ligne une condition " = " à une table de référence qui point vers une ligne en particulier et non une matrice...

Du coup notre ligne de code focntionne.

Si ça peut être utile.

Merci

Hors ligne

 

#13 Sat 28 January 2017 08:49

Ludivine
Juste Inscrit !
Date d'inscription: 27 Jan 2017
Messages: 1

Re: QGIS: Récupérer les noms des Noeuds aux extrémités d'une polyligne

Bonjour,

Je souhaiterai faire exactement ce qui est décrit ici, mais lorsque j'utilise le code (en modifiant les noms de couches/champs), ça ne fonctionne pas, j'ai une erreur de syntaxe...

Je n'ai pas l'habitude de passer par les lignes de code, aussi peut-être que je fais... n'importe quoi!... J'ai essayé de rechercher comment faire, mais je m'y perds un peu...

Pour utiliser le code, j'ouvre la console Python, et je colle directement le code en modifiant ce qu'il faut: chez moi ça donne ça:

update pipe set NODE1 = ( select DC_ID from (select DC_ID,pipe.gid from junction, pipe where st_within(st_startpoint(pipe.geom), st_buffer(junction.geom, 1))) as a where a.gid=pipe.gid)

puis je valide...

Quelqu'un pourrait-il m'aider un peu?

Merci
Ludivine

(j'utilise QGIS 2.18)

EDIT:
Bon, faute de réponses, j'ai fait autrement, par des créations de champs intermédiaires + jointures...
Toutefois, j'aurai bien aimé comprendre malgré tout comment faire ce type de manip... Quelqu'un pourrait-il m'éclairer ou m'indiquer ou trouver l'info (malgré mes recherches, je n'ai rien trouvé)?
Merci

Dernière modification par Ludivine (Fri 03 February 2017 09:53)

Hors ligne

 

Pied de page des forums

Powered by FluxBB