Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
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 Mon 02 May 2016 23:24

jerome_m
Participant actif
Lieu: Montpellier
Date d'inscription: 28 Nov 2012
Messages: 51

[POSTGIS] Séparer une linestring en plusieurs si dist(sommets) > X

Bonjour à tous,
Je bloque sur une requete SQL : j'ai une couche de points de passages avec des données attributaires. Seul l'id (serial) nous intéresse ici.
Je souhaite créer une ligne passant par ces ces points (dans l'ordre des id). Jusque là, tout va bien !
Je voudrais en plus que cette ligne soit coupée si la distance entre deux points est supérieure à xxx mètres. En gros, je voudrais obtenir un ensemble de linestring (ou une multilinestring, peu importe) reliant les points, seulement si ils sont proches :

Mes points:
A        B    C        D                                                   E     F                                       G    H            I                                     J

Ce que je veux !
A-------B---C-------D                                                  E-----F                                       G----H---------I                                     J


Ma requete pour obtenir une ligne entre tous les points: (obligé d'utiliser une sous requête car sinon j'ai des points non successifs qui se retrouvent reliés...)

WITH track_ordre AS (
    SELECT
        t.id,
        t.the_geom
    FROM
        maTable AS t
    ORDER BY
        t.id
)
SELECT
        t1.id AS id,
        st_makeline(st_force_2d(t1.the_geom))::geometry(LineString,4326) AS the_geom
FROM
        track_ordre AS t1, track_ordre AS t2
WHERE
        t2.id = (t1.id + 1)


Pour gérer les distances trop élevées entre deux points, j'ai essayé en rajoutant dans le WHERE :
AND st_distance(t1.the_geom, t2.the_geom) < XXXXX
Mais cela supprime les points trop éloignés, mais ne  "coupe" pas la ligne...
J'ai regardé dans la documentation Postgis (ST_Line_Substring ou d'autres fonctions) mais je n'arrive pas à trouver la logique à appliquer pour faire cette action...

Quelqu'un a une idée ?

Merci d'avance smile

Hors ligne

 

#2 Wed 04 May 2016 09:03

jerome_m
Participant actif
Lieu: Montpellier
Date d'inscription: 28 Nov 2012
Messages: 51

Re: [POSTGIS] Séparer une linestring en plusieurs si dist(sommets) > X

Personne pour m'aider ? Si les explications ne sont pas claires, n'hésitez pas à le dire, j'essairai de mieux formulé le problème...

Sinon, je me demandais si au lieu de créer une "grande" ligne, puis de la séparer en plusieurs morceaux (si la distance entre 2 sommets est élevée), il ne serait pas mieux de "sélectionner" les points proches, puis de les relier pour créer directement les "petites" lignes.

Des avis ?

Hors ligne

 

#3 Wed 04 May 2016 09:56

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

Re: [POSTGIS] Séparer une linestring en plusieurs si dist(sommets) > X

Bonjour,

Vous pouvez repérer les points "de découpe" (DE, FG...) en se basant sur la distance des points, puis ensuite utiliser les fonctions de référencement linéaires (st_lineSubstring, st_lineLocatePoint) pour découper la ligne complète avec ces points de découpe.

Nicolas

Hors ligne

 

#4 Mon 09 May 2016 23:42

jerome_m
Participant actif
Lieu: Montpellier
Date d'inscription: 28 Nov 2012
Messages: 51

Re: [POSTGIS] Séparer une linestring en plusieurs si dist(sommets) > X

Merci Nicolas pour ces indications.
J'ai réussi à appliquer ta méthode (identification des points de découpes, puis découpage de la ligne principale en plusieurs lignes entre les points de découpe). Mais sur un grand jeu de données (> 20000 points), j'obtiens des erreurs:
Sur la fonction st_lineSubstring, il me dit que mon second argument (1er point de découpe) doit etre inférieur au second, ce qui est logique. Si je prends les gid de mes points sur la ligne, ils sont bien dans le bon ordre. Cependant, je pense que j'ai deux points qui ont EXACTEMENT la même géométrie... et donc mon st_lineLocatePoint ne me détecte pas le bon point de ma ligne ! d'où mon erreur sur les arguements de la fonction st_lineSubstring...

Une idée pour contourner ce problème ?

Hors ligne

 

Pied de page des forums

Powered by FluxBB