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 20 March 2017 23:10

Ted
Participant assidu
Date d'inscription: 16 Jan 2007
Messages: 181

[POSTGIS] fonction decoupage polygone par ligne (st_split)

Bonjour à tous,

Je souhaite découper des polygones par des lignes (chaque polygone sera découpé en plusieurs polygone via des lignes, voir pièce jointe).
Ne pouvant utiliser la fonction st_split à mon travail (à la différence de chez moi), j'ai trouvé une fonction sur le net (fonctionnant comme st_split).
Donc mon problème est que le découpage ne se passe comme je veux (pourquoi?).
Voici la requête :

Code:

CREATE OR REPLACE FUNCTION split_polygon(polygon geometry,split_line geometry) RETURNS SETOF geometry AS
$$
DECLARE

    v_geometry geometry;

BEGIN

    FOR v_geometry IN SELECT (ST_Dump((
        ST_Polygonize(ST_Union(ST_Boundary(polygon),split_line))
        ))).geom LOOP
        
        return next v_geometry;
        
    END LOOP;
END;

$$ LANGUAGE plpgsql;
create table test_interpo.tmppolyg as 
select distinct tl.id_triangle,tl.z1,tl.z2,
split_polygon(T.geometryexplose,Tl.geom)as geometry
From test_interpo.line_intertrianglestep2 Tl inner join test_interpo."7123_TRIANGLE_DISTINCT_test_interpo" T
        on Tl.id_triangle = T.id_triangle order by tl.id_triangle, tl.z1;

Que fais-je de mal?

D'avance merci pour votre aide.

Ted

Hors ligne

 

#2 Tue 21 March 2017 09:56

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 Jan 2006
Messages: 1233
Site web

Re: [POSTGIS] fonction decoupage polygone par ligne (st_split)

Bonjour Ted,

je ne réponds pas à la question "Que fais-je de mal" mais une piste de solution ici (st_node  + st_polygonize) :

https://georezo.net/forum/viewtopic.php … 78#p250778

Mathieu


Mathieu BOSSAERT
Association GeoRezo

Hors ligne

 

#3 Tue 21 March 2017 21:13

Ted
Participant assidu
Date d'inscription: 16 Jan 2007
Messages: 181

Re: [POSTGIS] fonction decoupage polygone par ligne (st_split)

Bonsoir,

Merci du lien Mathieu.
J'ai regardé et adapté à mon cas. Malheureusement, le résultat est imparfait, il ne me crée pas tous les polygones. Je ne comprends pas pourquoi.
Voici ma requête :

Code:

create table test_interpo.Polygoniz as 
with bnd as (
    select  id_triangle, geom from test_interpo."7123_test_intervalle_Tr_segmt" union all
    select id_triangle,geom from test_interpo.line_intertrianglestep2
), col as (
    select st_collect(geom) as geom from bnd
) select  (st_dump(st_polygonize(st_node(geom)))).geom as geom 
    from col;

Je devrais avoir 72 polygones et je me retrouve seulement avec 52!

Une idée de l'oubli de ma part?

Up de ma part, je m'étais trompé de table d'entrée. Le résultat ne pouvait être bon. Avec la bonne table tout semble OK.

Un grand merci

Ted

Dernière modification par Ted (Tue 21 March 2017 21:24)

Hors ligne

 

#4 Tue 21 March 2017 22:09

Ted
Participant assidu
Date d'inscription: 16 Jan 2007
Messages: 181

Re: [POSTGIS] fonction decoupage polygone par ligne (st_split)

Par contre si je veux récupérer mon id_triangle, je fais comment.
J'ai beau ajouter l'entrée, il me dit qu'il faut l'ajouter dans la clause group by??

Ted

Hors ligne

 

#5 Wed 22 March 2017 09:31

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 Jan 2006
Messages: 1233
Site web

Re: [POSTGIS] fonction decoupage polygone par ligne (st_split)

Bonjour Ted,

Avec un update de la couche créée avec la table initial ? De ce genre là :

Code:

UPDATE test_interpo.Polygoniz 
SET id_triangle = bnd.id_triangle 
FROM bnd WHERE st_within(bnd.geom, Polygoniz.geom)

Mathieu BOSSAERT
Association GeoRezo

Hors ligne

 

#6 Wed 22 March 2017 20:40

Ted
Participant assidu
Date d'inscription: 16 Jan 2007
Messages: 181

Re: [POSTGIS] fonction decoupage polygone par ligne (st_split)

Merci Mathieu pour ta réponse, mais le résultat n'est pas positif à 100%. De nombreux polygones ne récupèrent pas l'id du bon triangle ;-(.

C'est quand même étrange, qu'avec la requête avec le With, on ne puisse pas introduire cette information.

Je vais poursuivre mes recherches.

a+

Hors ligne

 

#7 Wed 22 March 2017 21:41

Ted
Participant assidu
Date d'inscription: 16 Jan 2007
Messages: 181

Re: [POSTGIS] fonction decoupage polygone par ligne (st_split)

Bonsoir,

Si je fais la même requête que pour la géométrie et que j'exclue la-dite géométrie je peux récupérer les id_triangle
comme ceci

Code:

with bds as (
 select  id_triangle, geom from test_interpo."7123_ligne_segmentize_Tr2" union all
    select id_triangle,geom from test_interpo.line_intertrianglestep2 )
    , col as ( 
    select id_triangle from bds group by id_triangle) select id_triangle from col

Mais je ne peux pas faire de jointure entre les deux tables, car pas de point "commun".

??

Hors ligne

 

#8 Thu 23 March 2017 09:06

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 Jan 2006
Messages: 1233
Site web

Re: [POSTGIS] fonction decoupage polygone par ligne (st_split)

Ted a écrit:

Merci Mathieu pour ta réponse, mais le résultat n'est pas positif à 100%. De nombreux polygones ne récupèrent pas l'id du bon triangle ;-(.
a+


ST_WITHIN n'est peut-être pas l’opérateur spatial adéquat ?


Mathieu BOSSAERT
Association GeoRezo

Hors ligne

 

#9 Thu 23 March 2017 10:43

Ted
Participant assidu
Date d'inscription: 16 Jan 2007
Messages: 181

Re: [POSTGIS] fonction decoupage polygone par ligne (st_split)

J'en ai essayé plusieurs st_intersects, st_contains... et à chaque fois il y a des résultats "impropres".

Ted

Hors ligne

 

#10 Tue 28 March 2017 14:13

Ted
Participant assidu
Date d'inscription: 16 Jan 2007
Messages: 181

Re: [POSTGIS] fonction decoupage polygone par ligne (st_split)

Bonjour,

J'ai réussi en "trichant" un peu. J'ai utilisé des buffers négatifs (vers l'intérieur) des objets et ça fonctionne. Peut-être pas propre, mais ça me convient.
Voici la requête :

Code:

create table test_interpo."Trpolygo_Update" as
select distinct a.id_polygone,b.id_triangle,round(st_zmin(a.geom)::decimal, 1) as Zmin_Polygone, round(st_zmin(b.geometryexplose)::decimal, 1) as Zmin_triangle, a.geom
from test_interpo.Trpolygo a, test_interpo."7123_TRIANGLE_DISTINCT_test_interpo" b where st_intersects(st_buffer(b.geometryexplose,-0.0000001),a.geom)

Merci pour votre aide

Hors ligne

 

#11 Tue 28 March 2017 16:03

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1160

Re: [POSTGIS] fonction decoupage polygone par ligne (st_split)

Salut,

Merci Mathieu pour ta réponse, mais le résultat n'est pas positif à 100%. De nombreux polygones ne récupèrent pas l'id du bon triangle ;-(.


Probablement que ces polygones doivent contenir plusieurs triangles, et comme la requête utilise une clause FROM, PostgreSQL décide d'utiliser arbitrairement un des résultats de la jointure pour mettre à jour les lignes , alors qu'en utilisant une sous-requête, l'UPDATE aurait planté.

Hors ligne

 

#12 Tue 28 March 2017 19:27

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 Jan 2006
Messages: 1233
Site web

Re: [POSTGIS] fonction decoupage polygone par ligne (st_split)

Ça manque de schéma :-) mais je me suis loupé dans ma réponse : la table bnd est une table de lignes, pas de polygones... il faudrait faire l'update des triangles avec la table de polygones initiale.

je serai preneur d'un jeu de données test pour mieux comprendre le truc.


Mathieu BOSSAERT
Association GeoRezo

Hors ligne

 

#13 Wed 29 March 2017 08:32

Ted
Participant assidu
Date d'inscription: 16 Jan 2007
Messages: 181

Re: [POSTGIS] fonction decoupage polygone par ligne (st_split)

Mathieu, j'avais compris, j'ai fait ma requête avec des surfaces.

Je peux t'envoyer un jeu test ce soir (remarque, quand j'ai fait mes premiers tests je n'avais peut-être pas les yeux en face des trous ;-)).

Ted

Hors ligne

 

#14 Wed 29 March 2017 09:25

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 Jan 2006
Messages: 1233
Site web

Re: [POSTGIS] fonction decoupage polygone par ligne (st_split)

Merci je veux bien tester moi aussi. Ça me remettra le fonctionnement de st_node() et st_polygonize() en tête.


Mathieu BOSSAERT
Association GeoRezo

Hors ligne

 

#15 Wed 29 March 2017 11:25

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

Re: [POSTGIS] fonction decoupage polygone par ligne (st_split)

Bonjour,

Essayez en rajoutant un st_union sur les linestrings venant des triangles et des lignes:
st_union sur les lignes va les découper si elles se superposent, ce qui peut etre nécessaire:

Code:

with tmp as (
  SELECT st_exteriorRing(geom) AS geom
  FROM triangle
  UNION ALL
  SELECT geom
  FROM line
), tmp1 as (
  select st_collect(geom) as geom
  from tmp
), tmp2 as (
  select st_node(st_union(geom)) as geom
  from tmp1
) select (st_dump(st_polygonize(geom))).geom as geom
from tmp2;

Pour réassocier les polygones aux triangles, st_pointOnSurface peut etre utile, ou une comparaison de surfaces d'intersections entre nouveaux polygones et triangles, dans les cas tordus:

Code:

with tmp as (
  SELECT st_exteriorRing(geom) AS geom
  FROM triangle
  UNION ALL
  SELECT geom
  FROM line
), tmp1 as (
  select st_collect(geom) as geom
  from tmp
), tmp2 as (
  select st_node(st_union(geom)) as geom
  from tmp1
), tmp3 as (
    SELECT st_dump(st_polygonize(geom)) AS d
    FROM tmp2
), tmp4 as (
  select (d).path[1] as id, (d).geom
  from tmp3
), tmp5 as (
  select t.id, t.geom, tr.id as id_triangle
  from tmp4 t join triangle tr on st_contains(tr.geom, st_pointOnSurface(t.geom))
) SELECT *
  FROM tmp5;

Nicolas


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

Hors ligne

 

#16 Wed 29 March 2017 18:42

Ted
Participant assidu
Date d'inscription: 16 Jan 2007
Messages: 181

Re: [POSTGIS] fonction decoupage polygone par ligne (st_split)

Bonsoir,

En pièce jointe, des shp pour tester (linéaire et surfacique).

Avant la requête de Nicolas, voici la requête pour construire mes polygones:

Code:

create table test_interpo.Trpolygo as 
with bnd as (
    select  id_triangle, geom from test_interpo."7123_ligne_segmentize_Tr2" union all
    select id_triangle,geom from test_interpo.line_intertrianglestep2
), col as (
    select st_collect(geom) as geom from bnd
) select (st_dump(st_polygonize(st_node(geom)))).geom as geom
    from col;

Puis la requête pour récupérer les id_triangle :

Code:

alter table  test_interpo.Trpolygo add column id_polygone bigserial;

--Récupération de l'id du triangle DELAUNAY dans chaque polygone et du minZ du Triangle et MinZ du Polygone
create table test_interpo."Trpolygo_Update" as
select distinct a.id_polygone,b.id_triangle,round(st_zmin(a.geom)::decimal, 1) as Zmin_Polygone,
 round(st_zmin(b.geometryexplose)::decimal, 1) as Zmin_triangle, a.geom
from test_interpo.Trpolygo a, test_interpo."7123_TRIANGLE_DISTINCT_test_interpo" b
 where st_intersects(st_buffer(b.geometryexplose,-0.0000001),a.geom);

J'obtiens 77 polygones.
@ Nicolas, j'ai executé ça requête en la mettant à jour, mais le résultat n'est pas bon pour les polygones (seulement 52, il est peut-être nécessaire de faire un st_snaptogrid?), par contre on récupère bien pour chaque polygone, l'id_triangle:

Code:

create table test_interpo.tmp_Ribot as
with tmp as (
  SELECT st_exteriorRing(geometryexplose) AS geom
  FROM test_interpo."7123_TRIANGLE_DISTINCT_test_interpo"
  UNION ALL
  SELECT geom
  FROM test_interpo.line_intertrianglestep2
), tmp1 as (
  select st_collect(geom) as geom
  from tmp
), tmp2 as (
  select st_node(st_union(geom)) as geom
  from tmp1
), tmp3 as (
    SELECT st_dump(st_polygonize(geom)) AS d
    FROM tmp2
), tmp4 as (
  select (d).path[1] as id, (d).geom
  from tmp3
), tmp5 as (
  select t.id, t.geom, tr.id_triangle
  from tmp4 t join test_interpo."7123_TRIANGLE_DISTINCT_test_interpo" tr on st_contains(tr.geometryexplose, st_pointOnSurface(t.geom))
) SELECT *
  FROM tmp5;

les noms de mes fichiers sont des noms temporaires, car je teste sur une petite portion de mon jeu de données.

Merci

Dernière modification par Ted (Wed 29 March 2017 18:43)


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

Hors ligne

 

#17 Thu 04 May 2017 14:05

Ted
Participant assidu
Date d'inscription: 16 Jan 2007
Messages: 181

Re: [POSTGIS] fonction decoupage polygone par ligne (st_split)

Re,

Je me permets de reposter, car lors de mes tests j'arrivais à construire mes objets dans des temps "corrects" et surtout sans "Postgis (Ne répond pas).
Là, pour mon premier lot, j'ai 197094 polygones à construire et j'ai PostGis (Ne répond pas) via cette requête :

Code:

create table test_interpo.Trpolygo as 
with bnd as (
    select  id_triangle, geom from test_interpo."7123_ligne_segmentize_Tr2" union all
    select id_triangle,geom from test_interpo.line_intertrianglestep2
), col as (
    select st_collect(geom) as geom from bnd
) select (st_dump(st_polygonize(st_node(geom)))).geom as geom
    from col;

Y-aurait-il un problème?

D'avance merci

Hors ligne

 

#18 Thu 11 May 2017 18:55

Ted
Participant assidu
Date d'inscription: 16 Jan 2007
Messages: 181

Re: [POSTGIS] fonction decoupage polygone par ligne (st_split)

Re Bonjour,

J'ai refait toute une batterie de tests et je ne comprends pas le problème.
J'ai fait des tests en limitant le nombre d'objets :
Avec 10 polygones  tout fonctionne
Avec 20 polygones, certains nouveaux polygones sont bien construits d'autres ne le sont pas.
Sur la totalité, j'ai des objets construits, mais qui ne ressemblent à rien (polygones "aléatoires").
J'ajoute des shape de mes données (échantillon) avec les problèmes.
J'utilise cette requête (fourni par Nicolas Ribot) pour créer mes polygones.

Code:

 create table "CTRL_SONDE_7123"."7123_Trg_polygo_non_int_Delau_sel" as 
with bnd as (
    select  id_triangle, geom from "CTRL_SONDE_7123"."7123_ligne_segmentize_Delau_Tr_sel" union all
    select id_triangle,geom from "CTRL_SONDE_7123"."7123_line_intertriangle_Delau_step1_sel"
), col as (
    select st_collect(geom) as geom from bnd
) select (st_dump(st_polygonize(st_node(geom)))).geom as geom
    from col;

Si quelqu'un pouvait m'aider ça serait cool ;-)

Je n'ai pas pu insérer mes copies d'écran.

D'avance merci

Dernière modification par Ted (Thu 11 May 2017 18:56)


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

Hors ligne

 

#19 Thu 11 May 2017 23:32

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1160

Re: [POSTGIS] fonction decoupage polygone par ligne (st_split)

Salut
pour limiter la casse niveau perf, je pense qu'il faudrait restreindre
les géométries à noder.
Ensuite pour votre problème de polygones mal formés, peut être un ORDER BY
sur la colonne path du dump pourrait résoudre une partie du problème

Une idée de la requête (non testée).

Code:

WITH t AS (
SELECT p.id, array_agg(l.the_geom) || st_exteriorring(p.the_geom) AS t
FROM polygon p, line l
WHERE st_intersects(p.the_geom, l.the_geom)),
u AS (SELECT id, st_dump(st_node(st_collect(t))) d FROM t)

SELECT st_polygonize((d).geom ORDER BY (d).path) FROM u
GROUP BY id;

Dernière modification par tumasgiu (Thu 11 May 2017 23:37)

Hors ligne

 

#20 Fri 12 May 2017 13:33

Ted
Participant assidu
Date d'inscription: 16 Jan 2007
Messages: 181

Re: [POSTGIS] fonction decoupage polygone par ligne (st_split)

Bonjour et merci de ton aide tumasgiu,

J'ai testé ta commande en l'aménageant comme ceci :

Code:

WITH t AS (
select p.id_triangle, array_agg(l.geom)||st_exteriorring(p.geom) as t
from "CTRL_SONDE_7123"."7123_TRIANGLE_non_intersect_Delau" p, "CTRL_SONDE_7123"."7123_line_intertriangle_Delau_step1_sel" l
WHERE st_intersects(p.geom, l.geom) group by  p.id_triangle,p.geom),
u AS (SELECT id_triangle, st_dump(st_node(st_collect(t))) d FROM t)

SELECT (st_dump(st_polygonize((d).geom ORDER BY (d).path))).geom FROM u
GROUP BY id_triangle;

Point positif, le calcul est beaucoup plus rapide qu'avec la précédente.
Point négatif, il me manque des résultats (voir zip avec captures d'écran).

D'où cela vient-il? Pourquoi certains polygones sont construits et pas d'autres?
Ne faudrait-il pas utiliser un st_snaptogrid pour une tolérance?

Merci de votre aide

Dernière modification par Ted (Fri 12 May 2017 13:35)


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

Hors ligne

 

#21 Fri 12 May 2017 15:08

Ted
Participant assidu
Date d'inscription: 16 Jan 2007
Messages: 181

Re: [POSTGIS] fonction decoupage polygone par ligne (st_split)

up,

J'ai testé avec un st_snaptogrid à l'intérieur de mon st_intersect.
J'augmente mes résultats (sur un lot test, je passe de 845 polygones à 891 polygones).

Mais ce n'est pas encore ça :'-(

J'ai posté en parallèle sur la liste postgis, sait-on jamais!

Bonne soirée et bon week end

Dernière modification par Ted (Fri 12 May 2017 20:43)

Hors ligne

 

#22 Sun 14 May 2017 10:17

Ted
Participant assidu
Date d'inscription: 16 Jan 2007
Messages: 181

Re: [POSTGIS] fonction decoupage polygone par ligne (st_split)

Bon je sais je suis un peu obnubilé par la "chose", même un dimanche matin ;-).

Je viens de réaliser un test en isolant les segments interieurs d'un polygone (ceux qui servent à découper).

J'ai relancé la requête fourni par tumasgiu avec mes aménagements (voir post plus haut) et je n'obtiens pas le même résultat que sur la globalité des données. Il doit y avoir un problème d'intersection, mais le st_snaptogrid ne le résout pas!

Des pistes? pour m'aider!

Bonne fin de week end

Ted

Hors ligne

 

#23 Sat 20 May 2017 13:59

Ted
Participant assidu
Date d'inscription: 16 Jan 2007
Messages: 181

Re: [POSTGIS] fonction decoupage polygone par ligne (st_split)

Bonjour,

J'ai supprimé le snapotogrid et ai allongé mes lignes (pour être sur qu'elles dépassent 😊).
J'ai relancé la requête et c'est beaucoup mieux, mais j'ai toujours des cas où il n'y a aucuns polygones (tests avec intersect et crosses).
Avez vous pistes? Je me sens perdu!
Est-ce que la projection ne serait pas en cause? Je suis en epsg 4326 ! Tenter le 3395?

Bon week-end

Hors ligne

 

Pied de page des forums

Powered by FluxBB