Pages: 1
- Sujet précédent - POSTGIS: ST_Difference ? Quelle fonction pour l'inverse d'Intersection - Sujet suivant
#1 Thu 25 September 2014 16:29
- Mathilde G
- Juste Inscrit !
- Date d'inscription: 4 Jun 2009
- Messages: 8
POSTGIS: ST_Difference ? Quelle fonction pour l'inverse d'Intersection
Bonjour,
Ca fait maintenant plusieurs jours que je cherche et je ne trouve pas la bonne formule.
Je cherche à créer une vue résultant de l'intersection d'une table a (table de parcelles cadastrales) et deux tables b et c (zones de PLU, et contraintes de PLU).
J'arrive à faire cette requête, mais j'ai réalisé que la table des contraintes (c) superpose quelque fois la table des zones plu (b), je souhaiterai donc sortir les intersections entre les tables b et c de la table c (dans une vue de préférence, pour garder l'info complète) avant d'effectuer ma requête finale avec la table a.
Je crois que passer par une union ne me convient pas car j'ai besoin de garder les attributs (zones U, AU... des PLU) et lorsque il n'y a pas d'intersection avec la table des PLU je souhaite récupéré les attributs de la table c (contraintes).
D'après ce que j'ai compris un ST_difference ne marche pas car il y toujours des géométries de la table B qui sont disjointes de la table C, la requête me retourne donc un nombre démultiplié d'objets.
Je ne vois donc pas bien par quelle requête il faut passer, je vous remercie de m'éclairer un peu et j'espère avoir été claire.
Mathilde
Hors ligne
#2 Fri 26 September 2014 07:54
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- Site web
Re: POSTGIS: ST_Difference ? Quelle fonction pour l'inverse d'Intersection
Bonjour,
j'espère avoir été claire
Là pas trop
la table des contraintes (c) superpose quelque fois la table des zones plu (b), je souhaiterai donc sortir les intersections entre les tables b et c de la table c
superposition et intersection .... ??
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#3 Fri 26 September 2014 09:39
- Mathilde G
- Juste Inscrit !
- Date d'inscription: 4 Jun 2009
- Messages: 8
Re: POSTGIS: ST_Difference ? Quelle fonction pour l'inverse d'Intersection
Oui exactement
Hors ligne
#4 Fri 26 September 2014 10:16
- Mathilde G
- Juste Inscrit !
- Date d'inscription: 4 Jun 2009
- Messages: 8
Re: POSTGIS: ST_Difference ? Quelle fonction pour l'inverse d'Intersection
Si ça peut aider, j'ai d'abord fait deux vues de mes tables plu et contraintes (prescr) pour sélectionner les attributs qui m'intéressent :
Code:
-- CREATE VIEW selection des zones PLU qui nous intéressent : CREATE VIEW crozes.v_plu AS SELECT * FROM doc_urba WHERE doc_urba.zone_simpl='AU' OR doc_urba.zone_simpl='U' OR doc_urba.zone_simpl='C' OR doc_urba.zone_simpl='constr'; -- CREATE VIEW selection des zones de prescription du PLU qui nous intéressent : CREATE VIEW crozes.v_prescr AS SELECT * FROM prescription_plu WHERE prescription_plu.id_prescription= 1 OR prescription_plu.id_prescription= 2 OR prescription_plu.id_prescription= 6 ;
Ensuite ma dernière requête ressemblerai à quelque chose comme ça :
Code:
-- Intersection des parcelles perdues avec les documents d'urbanismes et les contraintes du PLU : CREATE OR REPLACE VIEW crozes.v_intersect_doc_urba AS (WITH table_temp AS (SELECT clipped.idu, clipped.type_raison, clipped.sum as supf_plantee, ROUND(ST_AREA(clipped_geom)::numeric/10000,4) AS supf_geom, clipped_geom AS geom FROM (SELECT crozes.v_perdu_plante.gid, crozes.v_perdu_plante.idu, crozes.v_perdu_plante.sum, crozes.v_perdu_plante.type_raison, (ST_Dump (ST_Intersection(crozes.v_perdu_plante.geom, v_prescr.geom))).geom AS clipped_geom FROM (SELECT * FROM crozes.v_prescr) AS v_prescr INNER JOIN crozes.v_perdu_plante ON ST_Intersects(crozes.v_perdu_plante.geom, v_prescr.geom)) As clipped UNION SELECT clipped.idu, clipped.type_raison, clipped.sum as supf_plantee, ROUND(ST_AREA(clipped_geom)::numeric/10000,4) AS supf_geom, clipped_geom AS geom FROM (SELECT crozes.v_perdu_plante.gid, crozes.v_perdu_plante.idu, crozes.v_perdu_plante.sum, crozes.v_perdu_plante.type_raison, (ST_Dump(ST_Intersection(crozes.v_perdu_plante.geom, v_plu.geom))).geom AS clipped_geom FROM (SELECT * FROM crozes.v_plu) As v_plu INNER JOIN crozes.v_perdu_plante ON ST_Intersects(crozes.v_perdu_plante.geom, v_plu.geom)) As clipped ) SELECT row_number() OVER () AS gid, * FROM table_temp );
Hors ligne
#5 Mon 29 September 2014 09:58
- Mathilde G
- Juste Inscrit !
- Date d'inscription: 4 Jun 2009
- Messages: 8
Re: POSTGIS: ST_Difference ? Quelle fonction pour l'inverse d'Intersection
Bonjour,
Je vois que ma question ne vous a pas trop inspirée, alors je vais essayer de reformuler :
J'ai deux tables de polygones (multi), je souhaiterai pouvoir effacer d'une des deux tables toutes les intersections avec la deuxième, dans une vue.
(C'est-à-dire effacer toutes les entités de la première table contenues dans un polygone de la deuxième table et découper les polygones de la première qui intersecteraient la deuxième, de manière à ne garder que les parties extérieures).
J'ai lu qq chose sur ST_relate, je ne sais pas si ça pourrait s'appliquer ici, ou peut-être avez-vous d'autres idées, je vais aussi réessayer un ST_union, mais n'hésitez pas à me donner des pistes
merci de votre coup de pouce,
Mathilde
Hors ligne
#6 Mon 29 September 2014 10:37
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: POSTGIS: ST_Difference ? Quelle fonction pour l'inverse d'Intersection
Bonjour,
Tel que je le comprends, vous voulez faire la différence entre deux couches, avec trois conditions sur ces couches:
st_intersects(a, b) and not st_contains(b, a) and not st_contains(a, b):
Code:
with tmp as ( select a.id, b.id as bid, st_difference(a.geom, b.geom) from pg1 a, pg2 b where st_intersects(a.geom, b.geom) and not st_contains(b.geom, a.geom) and not st_contains(a.geom, b.geom) ) select t.* from tmp t;
Image: en rouge: couche 1, en bleu-vert: couche2, en noir, le contour du résultat
Nicolas
Hors ligne
#7 Mon 29 September 2014 12:47
- Mathilde G
- Juste Inscrit !
- Date d'inscription: 4 Jun 2009
- Messages: 8
Re: POSTGIS: ST_Difference ? Quelle fonction pour l'inverse d'Intersection
Bonjour,
et merci pour votre réponse, c'était presque ce que je recherchais ! En tout cas, ça m'a bien aidé. Grâce à votre proposition voici ce que j'ai fait :
J'ai d'abord créé une vue ne contenant un seul polygone car dans ma couche d'intérêt je pouvais avoir un polygone qui intersectait plusieurs polygone de la seconde couche, le ST_difference ne renvoyait donc pas le résultat attendu
Code:
CREATE OR REPLACE VIEW pg2 AS SELECT row_number() OVER (ORDER BY 2::integer) AS gid, st_union (geom) as geom FROM v_plu;
J'ai ensuite fait la requête que vous m'avez proposé en rajoutant une union d'un ST_disjoint qui n'était pas pris en compte, et j'ai ainsi tous les polygones ou parties de polygones en dehors de ceux de la deuxième couche !
Code:
CREATE OR REPLACE VIEW v_diff AS (with tmp as ( select a.id, st_difference(a.geom, b.geom) AS geom from pg1 a INNER JOIN pg2 b ON st_intersects(a.geom, b.geom) and not st_contains(b.geom, a.geom) and not st_contains(a.geom, b.geom) UNION select a.id, a.geom from pg1 a INNER JOIN pg2 b ON st_disjoint(a.geom, b.geom) ) SELECT row_number() OVER () AS gid, * FROM tmp );
Encore merci pour votre aide, bonne continuation,
Mathilde
Hors ligne
#8 Mon 29 September 2014 13:47
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: POSTGIS: ST_Difference ? Quelle fonction pour l'inverse d'Intersection
Ah oui ! J'avais un peu zappé la partie des polygones sans interaction avec l'autre couche...
Hors ligne
Pages: 1
- Sujet précédent - POSTGIS: ST_Difference ? Quelle fonction pour l'inverse d'Intersection - Sujet suivant