Bonjour,
Je cherche à découper une linestring tous les x mètres en PHP avec PostGis. Je crois que je tourne en rond !...
J'arrive à ce stade à trouver un point à 20 % de mon début de linestring avec ST_LineInterpolatePoint, mais pas à 20 m. L'idée est de déterminer l'ensemble des points à 20, 40, 60 mètres (tous les 20 m) et d'utiliser ST_LineSubstring ensuite pour découper des sous-linestring.
Cela vous semble cohérent ? Une idée pour m'aide à avancer ?
Merci d'avance.
Découper une linestring par distance tous les x mètres avec PostGis
Re: Découper une linestring par distance tous les x mètres avec PostGis
Bonsoir,
Tu as pensé à 20m/ST_Length() pour trouver le pourcentage correspondant au premier point ? Ce n'est qu'une réponse partielle.
JB.
Tu as pensé à 20m/ST_Length() pour trouver le pourcentage correspondant au premier point ? Ce n'est qu'une réponse partielle.
JB.
OSM, c'est aussi ça : http://randocarto.fr/demo/Samoens_A1_400dpi.png
- cquest
- Messages : 1999
- Inscription : ven. avr. 16, 2010 12:22 am
- Localisation : Val de Marne
- Contact :
Re: Découper une linestring par distance tous les x mètres avec PostGis
ST_LineInterpolatePoints sert à ça... sauf que pour un découpage métrique propre, il faut se placer dans une projection adaptée car une simple règle de trois basée sur un ST_Length va donner des trucs étranges car les "distances" ne varient pas forcément de la même façon en X et Y (typique en WGS84, mais aussi en mercator où le ratio X/Y varie avec la latitude).
Si ces linestring sont locales (par exemple toutes en france métropolitaine), on peut les passer en Lambert93 (2154) et faire quelque chose comme:
SELECT ST_Transform(st_lineinterpolatepoints(ST_Transform(geom,2154),20/st_length(ST_Transform(geom,2154))),ST_SRID(geom)) ...
Bien sûr si on est déjà en 2154, pas besoin des ST_Transform.
Ceci retournera un MULTIPOINT (dans la projection d'origine) avec les endroits où découper avec un ST_Split
Pour quelque chose de tout terrain, non lié à une projection locale fixe et qui pourra donc fonctionner n'importe où sur la planète, il faut trouver dans quelle projection locale passer notre géométrie... et là, il y a une fonction interne à postgis non documentée qui sert justement à ça, c'est _ST_BestSRID
SELECT ST_Transform(st_lineinterpolatepoints(ST_Transform(geom,_ST_BestSRID(ST_Transform(geom,4326))),20/st_length(ST_Transform(geom,_ST_BestSRID(geom)))),ST_SRID(geom)) ...
Si ces linestring sont locales (par exemple toutes en france métropolitaine), on peut les passer en Lambert93 (2154) et faire quelque chose comme:
SELECT ST_Transform(st_lineinterpolatepoints(ST_Transform(geom,2154),20/st_length(ST_Transform(geom,2154))),ST_SRID(geom)) ...
Bien sûr si on est déjà en 2154, pas besoin des ST_Transform.
Ceci retournera un MULTIPOINT (dans la projection d'origine) avec les endroits où découper avec un ST_Split
Pour quelque chose de tout terrain, non lié à une projection locale fixe et qui pourra donc fonctionner n'importe où sur la planète, il faut trouver dans quelle projection locale passer notre géométrie... et là, il y a une fonction interne à postgis non documentée qui sert justement à ça, c'est _ST_BestSRID

SELECT ST_Transform(st_lineinterpolatepoints(ST_Transform(geom,_ST_BestSRID(ST_Transform(geom,4326))),20/st_length(ST_Transform(geom,_ST_BestSRID(geom)))),ST_SRID(geom)) ...
Re: Découper une linestring par distance tous les x mètres avec PostGis
J'avais effectivement pensé à une solution 20m/ST_Length(), mais je me suis dit que ça allait donner un résultat approximatif !
Je teste la solution avec projection adaptée, mais mon serveur ne connait ni st_lineinterpolatepoints (je suis en 1.5) ni _ST_BestSRID...
EDIT : installation en local de postgresql 12 + postgis 3, je vais pouvoir tester.
Je teste la solution avec projection adaptée, mais mon serveur ne connait ni st_lineinterpolatepoints (je suis en 1.5) ni _ST_BestSRID...
EDIT : installation en local de postgresql 12 + postgis 3, je vais pouvoir tester.
- cquest
- Messages : 1999
- Inscription : ven. avr. 16, 2010 12:22 am
- Localisation : Val de Marne
- Contact :
Re: Découper une linestring par distance tous les x mètres avec PostGis
Postgis 1.5, c'est collector ça maintenant 
Par contre, le calcul des points le long du linestring peut donner de petites erreurs de calcul qui peuvent faire qu'un ST_Split ne coupera pas...
Il serait sûrement préférable de passer par un ST_LineSubstring qui gèrera ça sûrement mieux !
https://postgis.net/docs/ST_LineSubstring.html

Par contre, le calcul des points le long du linestring peut donner de petites erreurs de calcul qui peuvent faire qu'un ST_Split ne coupera pas...
Il serait sûrement préférable de passer par un ST_LineSubstring qui gèrera ça sûrement mieux !
https://postgis.net/docs/ST_LineSubstring.html
Re: Découper une linestring par distance tous les x mètres avec PostGis
Oui je sais que c'est collector !! Hélas on ne choisit pas tout le temps
J'ai réussi à obtenir un résultat satisfaisant, en récupérant dans un premier temps la longueur de la linestring, et dans un deuxième temps, je boucle sur la longueur / distance pour récupérer une sous-linestring contenue entre des proportions distance/longueur...
Merci beaucoup, cette solution fera l'affaire pour le moment !!

J'ai réussi à obtenir un résultat satisfaisant, en récupérant dans un premier temps la longueur de la linestring, et dans un deuxième temps, je boucle sur la longueur / distance pour récupérer une sous-linestring contenue entre des proportions distance/longueur...
Merci beaucoup, cette solution fera l'affaire pour le moment !!
- cquest
- Messages : 1999
- Inscription : ven. avr. 16, 2010 12:22 am
- Localisation : Val de Marne
- Contact :
Re: Découper une linestring par distance tous les x mètres avec PostGis
Qu'est-ce qui t'empêche de passer à une version 2.X (voire 3.0 maintenant) de postgis ?
Pareil pour Postgresql, j'ose pas demande la version
Pareil pour Postgresql, j'ose pas demande la version

Qui est en ligne ?
Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 2 invités