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 !.
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Responsables de formations en géomatique,

merci d'actualiser vos données sur GeoFormations

#1 lun. 20 mars 2017 23:10

Ted
Membre
Date d'inscription: 16 janv. 2007
Messages: 139

[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 mar. 21 mars 2017 09:56

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 janv. 2006
Messages: 964
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

Hors ligne

 

#3 mar. 21 mars 2017 21:13

Ted
Membre
Date d'inscription: 16 janv. 2007
Messages: 139

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 (mar. 21 mars 2017 21:24)

Hors ligne

 

#4 mar. 21 mars 2017 22:09

Ted
Membre
Date d'inscription: 16 janv. 2007
Messages: 139

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 mer. 22 mars 2017 09:31

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 janv. 2006
Messages: 964
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

Hors ligne

 

#6 mer. 22 mars 2017 20:40

Ted
Membre
Date d'inscription: 16 janv. 2007
Messages: 139

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 mer. 22 mars 2017 21:41

Ted
Membre
Date d'inscription: 16 janv. 2007
Messages: 139

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 jeu. 23 mars 2017 09:06

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 janv. 2006
Messages: 964
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

Hors ligne

 

#9 jeu. 23 mars 2017 10:43

Ted
Membre
Date d'inscription: 16 janv. 2007
Messages: 139

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 mar. 28 mars 2017 14:13

Ted
Membre
Date d'inscription: 16 janv. 2007
Messages: 139

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 mar. 28 mars 2017 16:03

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 juil. 2010
Messages: 384

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 mar. 28 mars 2017 19:27

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 janv. 2006
Messages: 964
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

Hors ligne

 

#13 mer. 29 mars 2017 08:32

Ted
Membre
Date d'inscription: 16 janv. 2007
Messages: 139

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 mer. 29 mars 2017 09:25

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 janv. 2006
Messages: 964
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

Hors ligne

 

#15 mer. 29 mars 2017 11:25

Nicolas Ribot
Moderateur
Lieu: Toulouse
Date d'inscription: 9 sept. 2005
Messages: 950

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 mer. 29 mars 2017 18:42

Ted
Membre
Date d'inscription: 16 janv. 2007
Messages: 139

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 (mer. 29 mars 2017 18:43)


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

Hors ligne

 

Pied de page des forums

Powered by FluxBB

Partagez  |