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

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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

mario002e a écrit:

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  smile

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

mario002e a écrit:

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

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

mario002e a écrit:

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


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

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

 

Pied de page des forums

Powered by FluxBB