#1 Wed 02 November 2011 10:33
- mario002e
- Participant occasionnel
- Date d'inscription: 7 Jul 2011
- Messages: 11
requête spéciale de mise à jour
Bonjour!
J'ai 2 tables geotarget(idtarget, target_name, target_center, target_bounds) et geoarea(idarea, area_bounds) représentant respectivement une table de lieux et une table de région (Une région contient plusieurs lieux).
J'aimerais lier les 2 tables en mettant l'identifiant de geoarea (idarea) dans geotarget(idtarget).
Je ne sais comment s'y prendre en une seule requête!
Utiliser un autre langage à part SQL me prendra assez de temps!
SVP, aidez moi!
Hors ligne
#2 Wed 02 November 2011 11:09
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: requête spéciale de mise à jour
Bonjour!
J'ai 2 tables geotarget(idtarget, target_name, target_center, target_bounds) et geoarea(idarea, area_bounds) représentant respectivement une table de lieux et une table de région (Une région contient plusieurs lieux).
J'aimerais lier les 2 tables en mettant l'identifiant de geoarea (idarea) dans geotarget(idtarget).
Je ne sais comment s'y prendre en une seule requête!
Utiliser un autre langage à part SQL me prendra assez de temps!
SVP, aidez moi!
Bonjour,
Que non ! SQL est fait pour ca
En revanche, je ne comprends pas bien de quelle facon vous souhaitez mettre geoarea dans geotarget ? par croisement spatial, pour tous les lieux contenus dans une region ?
si c'est par croisement spatial, qqch comme:
Code:
-- ajout de la colonne geoarea Alter table geotarget add column idarea int -- lien spatial: ajout dans geotarget des id des regions contenant chaque lieu update geotarget set idarea = geoarea.idarea from geoarea where st_contains(geoarea.geom, geotarget.geom) -- eventuellement une cle etrangere entre les deux table alter table geotarget add constraint geotarget_id_area_fk references geoarea(idarea)
Nicolas
Hors ligne
#3 Wed 02 November 2011 11:24
- mario002e
- Participant occasionnel
- Date d'inscription: 7 Jul 2011
- Messages: 11
Re: requête spéciale de mise à jour
Merci! ça marche nickel!
Hors ligne
#4 Wed 02 November 2011 11:25
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- Site web
Re: requête spéciale de mise à jour
Bonjour,
eventuellement une cle etrangere entre les deux table
C'est ce que je ferai !
@mario002e : Même si on se doute un peu, il est tout de même bon de préciser le SGBDRS utilisé.
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#5 Wed 02 November 2011 12:16
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: requête spéciale de mise à jour
Merci! ça marche nickel!
Sinon une petite question concernant votre modele:
target_center, target_bounds et area_bounds représentent le centre des points, l'extension spatiale des points et l'extension des area ?
Si c'est le cas, pourquoi les stocker dans des colonnes, sachant que ces informations sont portées par les geometries elles-memes ? pour une question de performance, ou pour un affichage plus facile des données des tables ?
(bouh, je suis curieux... )
Nico
Hors ligne
#6 Wed 02 November 2011 12:31
- mario002e
- Participant occasionnel
- Date d'inscription: 7 Jul 2011
- Messages: 11
Re: requête spéciale de mise à jour
J'utilise le postgresql+postgis.
Je me suis rendu compte que le croisement de la table geotarget avec la table geoarea en passant par la sql n'a pas tout à fait marché car je vois un village de Niger dans le pays TOGO.
Code:
SELECT a.idarea, a.area_country, a.area_name, c.cname_fr, a.area_subname, a.area_type, a.area_entype, t.idcountry, t.target_name FROM geoarea a, geotarget t, ccode c WHERE c.idcountry=t.idcountry AND a.area_ccode='TG' AND st_contains(a.area_bounds, t.target_bounds)
Hors ligne
#7 Wed 02 November 2011 12:38
- mario002e
- Participant occasionnel
- Date d'inscription: 7 Jul 2011
- Messages: 11
Re: requête spéciale de mise à jour
Code:
target_center, target_bounds et area_bounds représentent le centre des points, l'extension spatiale des points et l'extension des area ?
Pour répondre à Monsieur Nico, target_bounds et area_bounds représentent des contours des zones spatiales. target_center était un point de départ à partir duquel j'ai créé un contour concentrique de 25m. target_outline peut être utilisé dans mon cas au lieur de bounds (Ce sont des colonnes qui vont changer de nom une fois les choses faites)
Hors ligne
#8 Wed 02 November 2011 12:48
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: requête spéciale de mise à jour
J'utilise le postgresql+postgis.
Je me suis rendu compte que le croisement de la table geotarget avec la table geoarea en passant par la sql n'a pas tout à fait marché car je vois un village de Niger dans le pays TOGO.Code:
SELECT a.idarea, a.area_country, a.area_name, c.cname_fr, a.area_subname, a.area_type, a.area_entype, t.idcountry, t.target_name FROM geoarea a, geotarget t, ccode c WHERE c.idcountry=t.idcountry AND a.area_ccode='TG' AND st_contains(a.area_bounds, t.target_bounds)
Si les colonnes "bounds" stockent les emprises des zones, comme leur nom le suggere, alors le resultat que vous obtenez est normal: les emprises des pays se recoupent: un lieu peut etre dans plusieurs pays
Si ce n'est pas le cas, ca peut vouloir dire que certaines données sont invalides: st_isValid vous permettra de les trouver.
(En PJ quelques pays d'Afrique représentés par leurs bbox)
Nicolas
Hors ligne
#9 Wed 02 November 2011 13:15
- mario002e
- Participant occasionnel
- Date d'inscription: 7 Jul 2011
- Messages: 11
Re: requête spéciale de mise à jour
Dans mon cas, j'ai supprimé les 2 zones (geometry) invalides avec la fonction st_isvalid.
Un lieux doit être dans une et une seule région. Je pense que le problème vient aileurs (la sql)
Hors ligne