#1 Tue 14 May 2019 22:20
- Julien Gondellon
- Participant actif
- Date d'inscription: 17 Apr 2014
- Messages: 67
Question sur ST_LineInterpolatePoint
Bonsoir,
Je voudrais savoir si avec cet outil nous pouvons creer des points à une distance donnée depuis l'extrémité d'une polyligne.
Merci
Hors ligne
#2 Wed 15 May 2019 07:29
Re: Question sur ST_LineInterpolatePoint
Bonjour,
Si l'extrémité est le dernier sommet de la polyligne (par opposition au premier, l'origine), et d la distance, la syntaxe serait :
Code:
ST_LineInterpolatePoint(geom, 1 - (d / st_Length(geom))
Plus de détails :
http://postgis.net/docs/ST_LineInterpolatePoint.html
Christophe Damour (SIGéal)
Hors ligne
#3 Fri 17 May 2019 00:03
- Julien Gondellon
- Participant actif
- Date d'inscription: 17 Apr 2014
- Messages: 67
Re: Question sur ST_LineInterpolatePoint
Merci pour le retour.
Je connaissais le lien que tu m'as transmis.
Trois dernières questions :
1. Qu'elle serait la formule si je fais la même chose en partant de l'origine ? Est-ce que c'est ça : T_LineInterpolatePoint(geom, (d / st_Length(geom))
2. Comment faire si je veux créer plusieurs points sur cette même ligne à partir de cette fonction ?
3. Comment faire avec cette fonction, dans le cas où j'ai plusieurs tronçons, et que mes points ne sont associés qu'à certains tronçons. Je présume que ma base de données qui correspondra à mes points doit contenir le numéro du tronçon et la distance. Et comment lui signifier dans la fonction
(Je pense que je ne suis pas du tout clair sur le troisième point.
Merci du retour.
Hors ligne
#4 Fri 17 May 2019 10:07
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1143
Re: Question sur ST_LineInterpolatePoint
1. Qu'elle serait la formule si je fais la même chose en partant de l'origine ? Est-ce que c'est ça : T_LineInterpolatePoint(geom, (d / st_Length(geom))
Oui.
2. Comment faire si je veux créer plusieurs points sur cette même ligne à partir de cette fonction ?
Si vous voulez interpoler plusieurs points avec la même distance entre eux :
https://postgis.net/docs/ST_LineInterpolatePoints.html
Si vous voulez avoir plusieurs champs représentant plusieurs points, vous pouvez juste répéter l'appel à la fonction.
Si vous voulez créer un multipoint, vous utilisez une fonction telle que st_collect ou st_union,
qui possèdent toutes deux une définition ayant comme un argument un tableau de geometries :
Code:
St_Collect(ARRAY[ST_LineInterpolatePoint(geom, 1 - (d / st_Length(geom)), ST_LineInterpolatePoint(geom, 1 - (e / st_Length(geom)), ...])
3. Comment faire avec cette fonction, dans le cas où j'ai plusieurs tronçons, et que mes points ne sont associés qu'à certains tronçons. Je présume que ma base de données qui correspondra à mes points doit contenir le numéro du tronçon et la distance. Et comment lui signifier dans la fonction
Il faut joindre vos deux tables pour créer l'ensemble des points dans une sous requête
puis utiliser la version agrégat de st_collect pour collecter tout les points par tronçon.
Avec un schema comme suit :
Code:
CREATE TABLE tronçon(numero_tronçon int, geom geometry); CREATE TABLE point(distance d double, numero_tronçon int);
La requête
SELECT
numero_tronçon,
st_collect(the_point) AS multi_points
FROM(
SELECT
t.numero_tronçon,
ST_LineInterpolatePoint(geom, 1 - (d / st_Length(geom)) AS the_point
FROM
tronçon AS t
JOIN
point AS p
ON
t.numero_tronçon = p.numero_tronçon
) AS sous_requete
GROUP BY
numero_tronçon
;
Hors ligne
#5 Tue 21 May 2019 12:46
- Julien Gondellon
- Participant actif
- Date d'inscription: 17 Apr 2014
- Messages: 67
Re: Question sur ST_LineInterpolatePoint
Bonjour,
Et merci pour ces récents retour. J'ai un problème avec cette ligne de code. Elle me donne du fil à retordre.
Pour rappel, j'ai :
- un shape de tronçon :
¤ Champ 1 : idtroncon
- et un csv de point :
¤ Champ 1 : IDTroncon (commun avec le shape),
¤ Champ 2 : distance
¤ Champ 2 : du texte.
Et voici notre ligne de code :
Code:
Create table resultat as ( select idtroncon, distance p, st_collect(pointanomalie) AS multi_points FROM( SELECT t.idtroncon ST_LineInterpolatePoint (geom,(p.distance / st_Length(geom))) AS pointanomalie FROM troncon AS t JOIN pointanomalie AS p ON t.idtroncon = p.idtroncon ) AS sous_requete GROUP BY idtroncon) ;
Mais ca ne marche pas.
Quelqu'un à une réponse. Je pense que c'est dans la dénomination des couches ou données.
Merci de votre retour
Hors ligne
#6 Tue 21 May 2019 13:52
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1143
Re: Question sur ST_LineInterpolatePoint
Dans votre requête principale, vous incluez le champ distance
dans votre clause SELECT.
Ca coince pour deux raisons :
1°
distance n'est pas inclus dans la clause SELECT de la sous-requête,
donc la requête principale doit vous indiquez que la colonne distance
n'existe pas dans l'expression sous_requête.
2° Votre requête principale comporte une clause GROUP BY.
Quand celle ci est présente, vous ne pouvez pas utiliser des
colonnes dans la clause SELECT autres que celles spécifiées
dans la clause GROUP BY, exception faite quand celles-ci sont
utilisées dans une fonction d'agrégat (ici la fonction st_collect).
Vous avez aussi une erreur de syntaxe à la ligne 8, il manque une
virgule pour séparer vos deux expressions.
Dernière modification par tumasgiu (Tue 21 May 2019 13:55)
Hors ligne