#1 Mon 10 July 2017 12:06
- Zakh
- Participant occasionnel
- Date d'inscription: 23 Jul 2015
- Messages: 38
[POSTGIS] - ST_MakeLine entre deux couches
Bonjour à tous,
Je me met à l'utilisation un peu plus avancée de PG, mais je me confronte à certains soucis d'utilisation des fonctions.
J'ai deux tables différentes, toute deux en MultiPoints :
-pb1 : table des poubelles
-node : table des noeud
node permet de créer un point défini sur une tournée de récolte, sur laquelle se rattache différentes poubelles de la table pb1. Pour chaque poubelle, je souhaite créer une ligne (un segment) entre elle et son noeud. J'ai mis une référence externe dans la table pb1 pour la relation, et j'essaie d'utiliser ST_MakeLine :
Code:
SELECT ST_MakeLine(node.geom,pb1.geom) as my_line from( SELECT node.obj_id, node.geom, pb1.ref_key_node, pb1.geom FROM pb.node, pb.pb1 WHERE node.obj_id = pb1.ref_key_node)as sub_query;
Mais une erreur "entrée manquante de la clause FROM pour la table « node »" persiste...
Je ne parviens pas à comprendre où se situe le problème, mais là encore... je débute avec ce type de fonction.
Hors ligne
#2 Mon 10 July 2017 12:59
Re: [POSTGIS] - ST_MakeLine entre deux couches
Bonjour,
hypothèse : Ton select fait appel à la table node et ta sous requête a pb.node du coup je pense que la requête ne trouve pas la table de ton premier select.
Freelance traitements ETL FME certifié: www.sitdi-france.fr Twitter : @sitdifrance
Site perso ~ www.partir-en-vtt.com
Hors ligne
#3 Mon 10 July 2017 13:02
- Zakh
- Participant occasionnel
- Date d'inscription: 23 Jul 2015
- Messages: 38
Re: [POSTGIS] - ST_MakeLine entre deux couches
bonjour,
le pb fait référence au schéma, en mettant ceci partout, je conserve la meme erreur
Code:
SELECT ST_MakeLine(pb.node.geom,pb.pb1.geom) as my_line from( SELECT pb.node.obj_id, pb.node.geom, pb.pb1.ref_key_node, pb.pb1.geom FROM pb.node, pb.pb1 WHERE pb.node.obj_id = pb.pb1.ref_key_node)as sub_query;
ERREUR: entrée manquante de la clause FROM pour la table « node »
SQL state: 42P01
Character: 20
Dernière modification par Zakh (Mon 10 July 2017 13:02)
Hors ligne
#4 Mon 10 July 2017 13:48
- ppluvinet
- Participant assidu
- Lieu: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
Re: [POSTGIS] - ST_MakeLine entre deux couches
Bonjour,
Une proposition : renommez vos geom dans la subquery et utilisez-les dans le st_makeline.
Code:
SELECT ST_MakeLine(geomnode,geompb1) as my_line from( SELECT pb.node.obj_id, pb.node.geom as geomnode, pb.pb1.ref_key_node, pb.pb1.geom as geompb1 FROM pb.node, pb.pb1 WHERE pb.node.obj_id = pb.pb1.ref_key_node)as sub_query;
Bon courage,
Pascal PLUVINET
Hors ligne
#5 Mon 10 July 2017 13:57
- Zakh
- Participant occasionnel
- Date d'inscription: 23 Jul 2015
- Messages: 38
Re: [POSTGIS] - ST_MakeLine entre deux couches
Bonjour,
Merci pour la proposition. Malheureusement j'obtiens une autre erreur :
ERREUR: Input geometries must be points or lines
********** Error **********
ERREUR: Input geometries must be points or lines
SQL state: XX000
Ceci est un poil plus embêtant. J'ai essayé
SELECT ST_MakeLine('MULTIPOINT(1 2, 17 6)', 'MULTIPOINT(4 5, 7 9, 18 -1)');
Pour vérifier simplement la syntaxe... et j'obtiens le même message d'erreur. Est-ce que ceci peut provenir d'une mauvaise configuration de ma base?
*EDIT : il semble que le Multipoint pose problème. En suivant à la lettre ce site : http://www.h2gis.org/docs/1.2/ST_MakeLine/ je parviens à des résultats pour les geom "Point" mais pas pour les Multipoints... Une idée?
Dernière modification par Zakh (Mon 10 July 2017 14:02)
Hors ligne
#6 Mon 10 July 2017 14:37
Re: [POSTGIS] - ST_MakeLine entre deux couches
Salut, un petit ST_dump() ?
Freelance traitements ETL FME certifié: www.sitdi-france.fr Twitter : @sitdifrance
Site perso ~ www.partir-en-vtt.com
Hors ligne
#7 Mon 10 July 2017 15:27
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- Site web
Re: [POSTGIS] - ST_MakeLine entre deux couches
Bonjour,
un extrait de la doc postgis pour la fonction Makeline()
Availability: 2.3.0 - Support for multipoint input elements was introduced
Availability: 2.0.0 - Support for linestring input elements was introduced
Availability: 1.4.0 - ST_MakeLine(geomarray) was introduced. ST_MakeLine aggregate functions was enhanced to handle more points faster.
Donc ...
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#8 Mon 10 July 2017 16:16
- Zakh
- Participant occasionnel
- Date d'inscription: 23 Jul 2015
- Messages: 38
Re: [POSTGIS] - ST_MakeLine entre deux couches
Salut, un petit ST_dump() ?
Je vois l'idée, je vais devoir extraire la partie géométrie des éléments du résultat de ST_Dump(). En l'état faire un ST_MakeLine(ST_Dump()) ne semble pas fonctionner (c'est peut-être une approche un peu trop bourine aussi...)
Merci pour la piste, je teste ça dès que possible!
Hors ligne
#9 Mon 10 July 2017 16:52
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- Site web
Re: [POSTGIS] - ST_MakeLine entre deux couches
Bonjour,
Au cas où l'anglais pose un pb, c'est à partir de la 2.3.0 que multipoint est supporté.
Pour st_dump c'est (st_dump(mageom)).geom qu'il faut utiliser pour avoir la géométrie.
Je me met à l'utilisation un peu plus avancée de PG
Dans ce cas lire la documentation sur les fonctions c'est très utile.
.
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#10 Tue 11 July 2017 09:14
- Zakh
- Participant occasionnel
- Date d'inscription: 23 Jul 2015
- Messages: 38
Re: [POSTGIS] - ST_MakeLine entre deux couches
Au cas où l'anglais pose un pb, c'est à partir de la 2.3.0 que multipoint est supporté.
Oui, bien entendu, j'ai vu ça, et l'anglais n'est absolument pas un problème pour moi. Étant en 2.3.1, ça devrait jouer... Mais quelque chose bloque... d'où ma question. (J'espère ne pas faire perdre du temps aux membres de ce forum pour une question triviale de version ou une bêtise du genre, même si en scripting, ça arrive plus souvent qu'on pense).
Pour st_dump c'est (st_dump(mageom)).geom qu'il faut utiliser pour avoir la géométrie.
Il semble que ça fonctionne comme ça. C'est la syntaxe du langage qui me pose problème en fait. Et la doc ne me convient pas énormément, venant de langage avec plus de helpfiles (matlab, python, etc.).
Code:
SELECT ST_MakeLine(geomnode,geompb1) as my_line from( SELECT pb.node.obj_id, (ST_Dump(pb.node.geom)).geom as geomnode, pb.pb1.ref_key_node, (ST_Dump(pb.pb1.geom)).geom as geompb1 FROM pb.node, pb.pb1 WHERE pb.node.obj_id = pb.pb1.ref_key_node) AS sub_query;
Ceci implique que ST_Multipoint n'apprécie guère ce que je lui demandais. Le principe c'est que ça marche. Plus qu'à en faire une vue intéressante pour qgis.
Merci
Hors ligne
#11 Tue 11 July 2017 10:15
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1159
Re: [POSTGIS] - ST_MakeLine entre deux couches
Salut,
deux solutions :
Soit une de vos tables contient autre chose que des (multi)points ou lignes,
soit vous avez vraisemblablement trouvé un bug.
Pour vérifier vos géométries :
Code:
SELECT DISTINCT st_geometrytype(geom) FROM pb.node UNION SELECT DISTINCT st_geometrytype(geom) FROM pb.pb1;
Hors ligne
#12 Tue 11 July 2017 10:20
- Zakh
- Participant occasionnel
- Date d'inscription: 23 Jul 2015
- Messages: 38
Re: [POSTGIS] - ST_MakeLine entre deux couches
Hello,
J'ai testé ça, et le résultat est bien :
st_geometrytype
text
-------------
ST_MultiPoint
Ce qui semble normal / bon...
Hors ligne
#13 Tue 11 July 2017 15:49
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1159
Re: [POSTGIS] - ST_MakeLine entre deux couches
Oui c'est bon,
Il s'agit apparemment d'un bug, ou bien une limitation :
https://github.com/postgis/postgis/blob … ic.c#L1503
Par contre, Les versions agrégées ou tableau fonctionnent bien avec les multipoints.
Dernière modification par tumasgiu (Tue 11 July 2017 20:36)
Hors ligne
#14 Thu 03 August 2017 08:56
- Zakh
- Participant occasionnel
- Date d'inscription: 23 Jul 2015
- Messages: 38
Re: [POSTGIS] - ST_MakeLine entre deux couches
Rebonjour à tous
De retour de vacances, j'ai pu poursuivre, et ça marche nickel
A toute fin utile, voici comment je l'ai finalement fait :
Code:
-- View: pb.vw_node_pb -- DROP VIEW pb.vw_node_pb; CREATE OR REPLACE VIEW pb.vw_node_pb AS SELECT row_number() OVER (ORDER BY sub_query.node_id) AS fid, sub_query.node_id, st_makeline(sub_query.geomnode, sub_query.geompb1) AS geom FROM ( SELECT node.obj_id AS node_id, (st_dump(node.geom)).geom AS geomnode, pb1.ref_key_node, (st_dump(pb1.geom)).geom AS geompb1 FROM pb.node, pb.pb1 WHERE node.obj_id = pb1.ref_key_node) sub_query; ALTER TABLE pb.vw_node_pb OWNER TO sitadmin; GRANT ALL ON TABLE pb.vw_node_pb TO sitadmin; COMMENT ON VIEW pb.vw_node_pb IS 'Vues segment reliant les pts poubelles aux noeuds des tournées';
Hors ligne
#15 Thu 03 August 2017 13:05
Re: [POSTGIS] - ST_MakeLine entre deux couches
Salut et merci pour ton retour. Heureux que ça fonctionne !
Freelance traitements ETL FME certifié: www.sitdi-france.fr Twitter : @sitdifrance
Site perso ~ www.partir-en-vtt.com
Hors ligne
#16 Thu 03 August 2017 13:29
- Zakh
- Participant occasionnel
- Date d'inscription: 23 Jul 2015
- Messages: 38
Re: [POSTGIS] - ST_MakeLine entre deux couches
Salut et merci pour ton retour. Heureux que ça fonctionne !
Avec plaisir.
Par contre, QGIS me dit qu'il n'y a pas d'entrée dans la table geometry_column lorsque j'utilise le Gestionnaire BD... Pourtant le couche vue se charge bien. Visiblement ce problème a déjà été rencontré à plusieurs reprises, mais je ne trouve pas de solution qui fonctionne ou qui explique pourquoi ceci se produit.
Hors ligne