Message posté par : Nicolas Ribot
----------------------------------------
Voici un moyen de faire:
• dumper les multilinestrings en LN simples, en gardant l'index de la ligne dans la
collection (st_dump(geom).path[1]): ca servira a reconstruire les multilinestrings plus
tard.
• calculer le nombre de découpage a faire pour chaque ligne:
longueur_ligne/longueur_découpe (ici, 50m, sur mon dataset, 500m ne découpait rien):
numcut; et calculer combien représentent 50m en fraction de la ligne a découper (chiffre
entre 0 et 1, a passer a st_linesubstring
(
https://postgis.net/docs/manual-2.5/ST_LineSubstring.html) )
• générer (avec generate_series) le bon nombre de découpage pour chaque ligne: on doit
découper entre 0 et numcut portions. Le cross join lateral permet d'appeler
generate_series avec une valeur de numcut différente pour chaque ligne.
• calculer les valeurs de startfraction et endfraction pour chaque découpage (chiffre
entre 0 et 1, a passer a st_linesubstring)
• Enfin, découper la ligne avec le startfraction et endfraction calculés. (il reste
éventuellement a regrouper les lignes de meme id, order by idln, pour reconstruire les
multilinestrings initiales, mais avec des segments découpés a 50m)
En sql:
-----------------
Code :
with tmp as (
select id, (st_dump(geom)).path[1] as idln, (st_dump(geom)).geom
from work_nico.roadml
), tmp1 as (
select id, idln, floor(st_length(geom) / 50.0)::int as numcut,
(50/st_length(geom)) as frac_50m,
geom
from tmp
), tmp2 as (
select t.*, g.cutpos, g.cutpos * frac_50m as startfraction,
least((g.cutpos * frac_50m) + frac_50m, 1) as endfraction
from tmp1 t
cross join lateral (
select cutpos
from generate_series(0, t.numcut) as cutpos
) g
) select t.id, idln, numcut, frac_50m, startfraction, endfraction,
st_linesubstring(geom, startfraction, endfraction) as geom
from tmp2 t;
-----------------
Ici, je me suis arrêté au découpage des routes, je n'ai pas regroupé en MLN
(st_collect(geom order by idln))
En image: en vert, les routes initiales avec startpoint/endpoint sous forme de flêches.
En rouge, les startpoint/endpoint des lignes découpées tous les 50m
Nico
----------------------------------------
Ce message est accompagné de fichiers, pour les télécharger, suivre le lien ci-dessous.
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=332175#p332175
Pour y répondre : geobd(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net