Découper une linestring par distance tous les x mètres avec PostGis

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.

Bonsoir,
Tu as pensé à 20m/ST_Length() pour trouver le pourcentage correspondant au premier point ? Ce n’est qu’une réponse partielle.
JB.

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

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)) …

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.

Postgis 1.5, c’est collector ça maintenant :wink:

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

Oui je sais que c’est collector !! Hélas on ne choisit pas tout le temps :wink:

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 !!

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

Salut,

Je ne sais pas si c’est toujours d’actualité mais tu peux récupérer des segments de x mètres issus de tes lignes assez facilement.
J’ai fait un article la dessus car j’ai eu moi même le même besoin : Créer des points ou des segments à distance régulière le long d'une ligne | BazinGa's - Tips & tuto IT

N’hésite pas si tu as des questions.
@+
Arthur