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

Printemps des cartes 2024

#1 Wed 11 February 2015 14:26

schummi
Participant actif
Date d'inscription: 12 Mar 2009
Messages: 88

[PostgreSQL 9.3 / PostGIS] - découpe de polylignes par proximité

Bonjour,

Quelle serait la syntaxe la plus propre pour découper des polylignes (A) à partir d'autres polylignes (B), sachant que B sont situées à proximité de A.

Dans la méthode que j'imaginais écrire, je prévoyais de transformer B en point (ST_DumpPoints unifié pour avoir un multipoint par polyligne de découpe), puis de projeter le 1er et dernier point sur A.

Je ne suis absolument pas certain de mon bon raisonnement ... et encore moins de la syntaxe à adopter.

Cordialement

Hors ligne

 

#2 Wed 11 February 2015 15:12

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

Re: [PostgreSQL 9.3 / PostGIS] - découpe de polylignes par proximité

Bonjour,

Hmm ca dépend un peu du cas de figure. Vous auriez un exemple plus précis ? (img par ex)

Nicolas

Hors ligne

 

#3 Wed 11 February 2015 15:43

schummi
Participant actif
Date d'inscription: 12 Mar 2009
Messages: 88

Re: [PostgreSQL 9.3 / PostGIS] - découpe de polylignes par proximité

Le fichier contexte.png montre la situation :
-  il y a 2 polylignes (TRC1 et TRC2)
- il y a une polyligne (1) qui se trouve à proximité de TRC1 et TRC2.

En fait, j'aimerais obtenir le résultat indiqué par result.png à savoir d'obtenir comme résultat le TRC1 et TRC2 découpé (par projection du point début/fin de la polyligne rouge).

Je ne sais pas si c'est très clair. Mais il s'agit de pouvoir mesurer l'impact de la polyligne (1) sur les TRC = la polyligne 1 concerne TRC1 sur x mètres et TRC2 sur y mètres.

Cordialement


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#4 Wed 11 February 2015 15:57

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

Re: [PostgreSQL 9.3 / PostGIS] - découpe de polylignes par proximité

Merci,

Alors c'est assez simple avec les fonctions de référencement linéaire (st_lineInterpolatePoint, st_lineLocatePoint):

• prendre le startPoint et endPoint de l1,
• les projeter sur les lignes TRC1 et TRC2 en fonction de la distance
• Découper les lignes avec les points projetés, ou juste récupérer l'ordonnée du point projeté et calculer les portions de chaque ligne que ca représente

Nico

Hors ligne

 

#5 Wed 11 February 2015 17:10

schummi
Participant actif
Date d'inscription: 12 Mar 2009
Messages: 88

Re: [PostgreSQL 9.3 / PostGIS] - découpe de polylignes par proximité

j'ai projeté les startpoint/endpoint sur les lignes TRC.

Par contre, je me questionne sur la manière de découpe des lignes avec ces points projetés.

Si j'écris cela, j'ai un message d'erreur m'indiquant qu'il est impossible de "spliter" avec du multipoint

with point as (
    SELECT idcrit, ST_Union(geom) as geom FROM test4 GROUP BY idcrit

) SELECT ST_Split(point.geom, fea_troncon.geom) FROM fea_troncon JOIN point ON ST_DWithin(fea_troncon.geom, point.geom,1); 

Faut-il que je découpe point par point mais comment faire alors pour ne conserver que les segments situés entre les points start/end ?

Cordialement

Hors ligne

 

#6 Wed 11 February 2015 17:31

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

Re: [PostgreSQL 9.3 / PostGIS] - découpe de polylignes par proximité

Avec la projection, vous obtenez la position du point projeté sur la ligne (fraction de longueur entre 0 et 1).
Vous pouvez alors découper la ligne TRC en utilisant cette position (http://postgis.net/docs/manual-2.1/ST_L … tring.html):

Code:

select 
  ST_LineSubstring(geom, 0, proj_point) as seg1,
  ST_LineSubstring(geom, proj_point, 1) as seg2
from fea_troncon;

Ou vous ne gardez direct que les segments qui vous interessent.

Nico

Hors ligne

 

#7 Wed 11 February 2015 18:03

schummi
Participant actif
Date d'inscription: 12 Mar 2009
Messages: 88

Re: [PostgreSQL 9.3 / PostGIS] - découpe de polylignes par proximité

Je n'arrive pas à rédiger la bonne syntaxe.

Voici ce que j'ai crée (je passe par plusieurs vues pour bien poser les étapes ... mais je pense que le code peut être largement épuré ....)

# Conversion des polylignes de découpe (fea_crit200) en points

CREATE OR REPLACE VIEW GeneratePoint AS
With tmp as
(
  SELECT idcrit, (ST_DumpPoints(geom)).geom as geom FROM fea_crit200)
SELECT idcrit, geom FROM tmp;

# Projection des points précédemment générés sur fea_troncon (polylignes à découper)

CREATE VIEW ProjectPoint as
with mpoint_by_line as( 
    SELECT idcrit, geom FROM GeneratePoint
) SELECT row_number() over() as num, mpoint_by_line.idcrit, ST_ClosestPoint(fea_troncon.geom, mpoint_by_line.geom) As geom FROM fea_troncon JOIN mpoint_by_line ON ST_DWithin(fea_troncon.geom, mpoint_by_line.geom,100);

# Sélection des segments concernés

CREATE OR REPLACE VIEW SplitFea AS
with point as (
    SELECT idcrit, geom FROM ProjectPoint

) SELECT ST_LineSubstring(fea_troncon.geom, 0, ST_LineLocatePoint(fea_troncon.geom, point.geom)) as geom FROM fea_troncon JOIN point ON ST_DWithin(fea_troncon.geom, point.geom,1);


Je n'y arrive pas dans le sens ou ma dernière vue traite point par point alors qu'il me faudrait le point start et le point end que je passerais en paramètre de ST_LineSubstring

Dernière modification par schummi (Wed 11 February 2015 18:05)

Hors ligne

 

#8 Wed 11 February 2015 19:10

schummi
Participant actif
Date d'inscription: 12 Mar 2009
Messages: 88

Re: [PostgreSQL 9.3 / PostGIS] - découpe de polylignes par proximité

J'ai réussi à contourner mon problème par cette syntaxe alambiquée !

CREATE OR REPLACE VIEW SplitFea AS
with point as (
    SELECT idcrit, array_agg(locate) as tlocate, st_union(geom) as uniongeom FROM ProjectPoint GROUP BY idcrit
) SELECT row_number() over() as num, CASE WHEN (tlocate[1] < tlocate[2]) THEN
    ST_LineSubstring(fea_troncon.geom, tlocate[1], tlocate[2])
    ELSE
    ST_LineSubstring(fea_troncon.geom, tlocate[2], tlocate[1])
    END
    as geom
    FROM fea_troncon JOIN point ON ST_DWithin(fea_troncon.geom, point.uniongeom,1);

Vraiment pas fier de moi sur ce coup car du début à la fin, mon code SQL n'est vraiment pas joli !

Je suis preneur d'un code exemple qui j'en suis convaincu résume mon programme en quelques lignes seulement ...

Dernière modification par schummi (Wed 11 February 2015 19:11)

Hors ligne

 

Pied de page des forums

Powered by FluxBB