Message posté par : Nicolas Ribot
----------------------------------------
Si le repassage est exact sur les linestrings, le nombre de points à garder pour ne pas se
repasser dessus est (n-1)/2 + 1, où n est le nombre de points de la linestring faussement
fermée.
ex: une ligne de 2pts qui se repasse dessus a 3 pts,
une ligne de 3 pts a 5 pts
une ligne de 4 points a 7 pts
On peut dumper les points de chaque ligne et ne garder que les bons points en filtrant
avec la formule ci-dessus.
Puis reconstruire les lignes avec les bons points uniquement:
-----------------
Code :
with tmp as (
select *
from (values (1, 'LINESTRING(0 1, 0 0, 1 0, 1 1, 1 0, 0 0, 0 1)'::geometry),
(2, 'LINESTRING(0 1, 0 0, 0 1)'::geometry),
(3, 'LINESTRING(0 1, 0 0, 1 0, 1 1, 2 1, 1 1, 1 0, 0 0, 0
1)'::geometry)
) as v(id, geom)
), tmp1 as (
select id, st_npoints(geom) as npts, (st_dumppoints(geom)).path[1],
(st_dumppoints(geom)).geom
from tmp
), tmp2 as (
select id, npts, path, geom
from tmp1
where path <= (npts-1)/2 + 1
) select id, st_astext(st_makeLine(geom order by path)) as geom
from tmp2
group by id;
id geom
1 LINESTRING(0 1,0 0,1 0,1 1)
2 LINESTRING(0 1,0 0)
3 LINESTRING(0 1,0 0,1 0,1 1,2 1)
-----------------
Si le repassage sur la ligne n'est pas complet, on peut regarder si chaque point
nouveau point existe dèjà dans la linestring: si oui, on sait qu'on se repasse dessus
et on reconstruit la ligne avec tous les points jusqu'a ce premier point répété
(exclu)
Nicolas
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=334113#p334113
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