#1 Thu 01 December 2016 17:56
Postigs : Requête spatiale sur 3 couches
Bonjour,
j'ai besoin d'effectuer une requête d'intersection spatial entre 3 tables.
J'ai une table "Commune" (polygones), une table A "produits" (points) et une table B "vente" (points)
J'ai besoin de connaitre les produits et lieux de vente contenus dans la commune qui se nomme "toto".
Pour trouver les valeurs dans la table A je fais :
SELECT *
FROM table Commune, table A
WHERE ST_Intersects (table Commune.geom, table A.geom)
AND table Commune.nom_com = 'toto';
Mais pour trouver les valeurs à la fois dans la table A ET la table B je ne sais pas faire !
Si qq1 peux m'aider svp.
Merci d'avance.
Arnaud Colé - responsable service Géomatique et Opendata (SGéO)
Direction des Systèmes d'Information mutualisés et du Numérique
de Grand Chambéry, ville de Chambéry, ville de La Motte-Servolex, ville de La Ravoire
Hors ligne
#2 Thu 01 December 2016 21:37
- Lsam
- Participant assidu
- Date d'inscription: 27 Nov 2013
- Messages: 157
Re: Postigs : Requête spatiale sur 3 couches
Bonsoir,
Tu peux essayer d'unir tes 2 tables Produits et ventes avant de faire ta jointure spatiale.
Par exemple :
Code:
WITH prod_vent as ( select 'produits' as "produits", "table A".* from "table A" union select 'ventes' as "ventes", "table B".* from "table B") select * FROM "table Commune", prod_vent WHERE ST_Intersects("table Commune".geom, prod_vent.geom) AND "table Commune".nom_com = 'toto'
C'est peut-être pas bien optimisé mais bon. Et il faut que tes tables A et B aient les mêmes champs, ce qui n'est sûrement pas le cas. Donc voir de quels champs tu as besoin.
Dernière modification par Lsam (Thu 01 December 2016 21:42)
Hors ligne
#3 Fri 02 December 2016 10:17
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- Site web
Re: Postigs : Requête spatiale sur 3 couches
Bonjour,
Une variante à ce que propose Lsam, cela devrait aller plus vite.
) créer un index spatial sur les géométries de produit et de vente. Puis:
Code:
With prod AS (SELECT commune.*, produit.* FROM myschema.produit,myschema.commune WHERE st_within(prod.geom,commune.geom) AND nomcommune='toto'), vente AS (SELECT commune.*,vente.* FROM myschema.vente,myschema.commune WHERE st-within(vente.geom,commune.geom) AND nomcommune='toto')
Ensuite si l'on veut
tous les produits : SELECT * FROM prod
toutes les ventes : SELECT * from vente
L'ensemble : SELECT * FROM prod UNION SELECT * FROM vente
Bien entendu il faut pour utiliser la dernière expression que le nombre et le type de champs soient les m^me.
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#4 Fri 02 December 2016 11:59
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: Postigs : Requête spatiale sur 3 couches
Salut,
je met la mienne :
Code:
SELECT nom, produits, ventes FROM (SELECT C.nom, array_agg(DISTINCT A.*) produits FROM Commune C JOIN produit A ON st_intersects(C.geom, A.geom) WHERE C.nom = 'toto' GROUP BY C.nom) A, (SELECT C.nom, array_agg(DISTINCT B.*) ventes FROM Commune C JOIN ventes B ON st_intersects(C.geom, B.geom) WHERE C.nom = 'toto' GROUP BY C.nom) B WHERE A.nom = B.nom
Cela renvoie une seule ligne du genre 'toto', {produitA, produitB,...}, {venteA, venteB} :
le nom de la commune avec un tableau de produit et un tableau de vente.
Dernière modification par tumasgiu (Fri 02 December 2016 19:11)
Hors ligne
#5 Fri 02 December 2016 12:01
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- Site web
Re: Postigs : Requête spatiale sur 3 couches
Oui tu as raison Tumasgiu, c'est Vendredi et tu peux mettre la tienne
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne