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

Extraire des données OSM, créer sa carte, uMap, utiliser sur un GPS ou un smartphone...
nico2603
Messages : 4
Inscription : lun. déc. 30, 2019 2:30 pm

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

Message par nico2603 » lun. déc. 30, 2019 4:05 pm

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.

JBosm
Messages : 80
Inscription : lun. avr. 22, 2013 12:43 pm

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

Message par JBosm » lun. déc. 30, 2019 9:36 pm

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

Avatar de l’utilisateur
cquest
Messages : 1969
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

Message par cquest » mar. déc. 31, 2019 9:32 am

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

nico2603
Messages : 4
Inscription : lun. déc. 30, 2019 2:30 pm

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

Message par nico2603 » mar. déc. 31, 2019 2:38 pm

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.

Avatar de l’utilisateur
cquest
Messages : 1969
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

Message par cquest » jeu. janv. 02, 2020 12:49 pm

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

nico2603
Messages : 4
Inscription : lun. déc. 30, 2019 2:30 pm

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

Message par nico2603 » ven. janv. 03, 2020 2:17 pm

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

Avatar de l’utilisateur
cquest
Messages : 1969
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

Message par cquest » sam. janv. 04, 2020 8:47 am

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

Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 7 invités