Pages: 1
- Sujet précédent - [PostgreSQL 9.3 / PostGIS] - découpe de polylignes par proximité - Sujet suivant
#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: 1554
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
En 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
Hors ligne
#4 Wed 11 February 2015 15:57
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
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
En 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: 1554
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
En 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
Pages: 1
- Sujet précédent - [PostgreSQL 9.3 / PostGIS] - découpe de polylignes par proximité - Sujet suivant