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 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: 3169
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: 1536

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


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

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: 1536

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... wink

Hors ligne

 

Pied de page des forums

Powered by FluxBB