Pages: 1
- Sujet précédent - [POSTGIS] Séparer une linestring en plusieurs si dist(sommets) > X - Sujet suivant
#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
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
Pages: 1
- Sujet précédent - [POSTGIS] Séparer une linestring en plusieurs si dist(sommets) > X - Sujet suivant