banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Thu 02 July 2020 17:52

1pichet
Juste Inscrit !
Date d'inscription: 2 Jul 2020
Messages: 6

modification de lignestring

Bonjour tout le monde.

Je dois construire une couche vectorielle sur mon département des pentes inférieures ou égales à 5 pourcents. J'ai pas mal cherché entre Qgis, GRASS et Postgis. J'ai utilisé Qgis pour me faire un raster de valeur 0 ou 1 en fonction de la pente (1 si la pente est inférieure ou égale à 5%). Pour "polygoniser" ce raster, impossible d'utiliser directement Postgis car plante lors que l'on utilise la fonction st_polygonize. Vraisemblablement un problème de mémoire. Je suis passé sous GRASS pour en sortir les contours du raster. Ça me donne une couche vectorielle composée de lignes.

Je peux traiter cette couche avec Postgis en utilisant la fonction St_Polygon. L'ennui c'est que dans la couche des contours, il y a des lignes non fermées en bordure de département. je pensais les fermer aisément sous Postgis mais c'est impossible car les points de départ et d'arrivé sont identiques. En fait, il s'agit bien de lignes fermées mais qui partent d'un point, font un chemin puis reviennent sur ce point en repassant sur le même chemin.

Par exemple LINESTRING(0 1, 0 0, 1 0, 1 1, 1 0, 0 0, 0 1) ressemblera à un "u" mais sera bien une ligne fermée au sens St_IsClosed de Postgis.

Ma question est donc la suivant : Y aurait-il un moyen de modifier ce genre de ligne pour en faire une ligne ouverte ?
En complément, j'ai tenté d'utiliser ST_RemoveRepeatedPoints pour supprimer les points dupliqués, mais ça ne m'a rien donné.

Merci d'avance pour vos réponses.

Hors ligne

 

#2 Fri 03 July 2020 10:52

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: modification de lignestring

Bonjour,

Un thread postgis qui peut aider sur le traitement de courbes de niveau (le cas etait ici de les fermer, notamment sur le "cadre" des données, mais il doit y avoir des infos pour faire l'opération inverse): http://postgis.17.x6.nabble.com/Closing … 71098.html

Vous auriez un exemple des données ?

Nicolas

Hors ligne

 

#3 Fri 03 July 2020 11:28

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: modification de lignestring

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

Hors ligne

 

#4 Mon 06 July 2020 10:50

1pichet
Juste Inscrit !
Date d'inscription: 2 Jul 2020
Messages: 6

Re: modification de lignestring

Merci pour ces réponses,
Je testerai dès le retour de vacance et ne manquerai pas de vous tenir au courant.

Hors ligne

 

Pied de page des forums

Powered by FluxBB