Annonce
Suite à un problème technique intervenu entre le 22 et le 23 mars, nous avons du procéder dans la soirée du 25 mars, à la restauration de la base de données du 24 mars (matinée).
En clair, nous avons perdu vos contributions et inscriptions du dimanche 24 et du lundi 25 mars.
Nous vous prions de nous excuser.
#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: 3163
- 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: 1129
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: 3163
- 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