#1 Wed 21 March 2012 16:25
- sigdu80
- Participant actif
- Date d'inscription: 2 Sep 2010
- Messages: 112
[Quantum GIS] Relation 1-N de données de shapefiles
Bonjour à tous,
je souhaite lier 2 shapefiles.
Dans le 1er, j'ai X lignes de données, X correspondant aux nombres d'objets.
Dans le 2nd, j'ai Y lignes de données, Y correspondants aux nombres d'éléments liés aux objets du 1er shapefile.
Je me retrouve avec une jointure attributaire 1-N, que j'aurai fait avec un champ id.
Je vois qu'une jointure attributaire 1-1 existe (Vecteurs -> Outils de gestion de données -> Joindre les attributs), mais je cherche la 1-N.
Du coup, je me demandais s'il fallait passer par cette fonctionnalité en faisant une jointure par un dbf, lequel serait issu du 2nd shapefile.
Sur ce dbf, on ferait un traitement excel (je ne sais pas encore comment faire) pour mettre chaque donnée d'une ligne ayant le même id, dans des colonnes à la suite les uns des autres.
Le fichier dbf retravaillé serait joint au shapefile contenant les objets.
Est-ce que la jointure 1-n existerait ?
Sinon, est-ce que mon idée serait la plus efficace pour réussir la jointure 1-N ?
Merci d'avance pour vos aides/suggestions.
Hors ligne
#3 Wed 21 March 2012 17:53
- sigdu80
- Participant actif
- Date d'inscription: 2 Sep 2010
- Messages: 112
Re: [Quantum GIS] Relation 1-N de données de shapefiles
Bonjour Baobazz,
c'est à dire ?
Tu fais des n LEFT JOIN ?
C'est un peu long et compliqué à faire, mais tu voyais une autre solution en SQL ?
si un logiciel SIG le fait et si possible gratuit, pourquoi pas également.
Hors ligne
#5 Thu 22 March 2012 14:17
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3178
- Site web
Re: [Quantum GIS] Relation 1-N de données de shapefiles
Bonjour,
J'accède à votre demande de déplacement mais sur GeoBD car GeoLibreBD n'existe pas
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#6 Thu 22 March 2012 15:46
- sigdu80
- Participant actif
- Date d'inscription: 2 Sep 2010
- Messages: 112
Re: [Quantum GIS] Relation 1-N de données de shapefiles
Bonjour et merci,
ah oui, GeoBD c'est çà le nom ! désolé !
en espérant avoir des réponses
Hors ligne
#7 Thu 22 March 2012 16:28
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1538
Re: [Quantum GIS] Relation 1-N de données de shapefiles
Bonjour,
Je ne suis pas sur de bien avoir compris ce vous souhaitez faire, notamment avec la partie geo des deux fichiers ?
Nicolas
Hors ligne
#8 Thu 22 March 2012 17:21
- sigdu80
- Participant actif
- Date d'inscription: 2 Sep 2010
- Messages: 112
Re: [Quantum GIS] Relation 1-N de données de shapefiles
Bonjour,
le but est d'avoir à la fin, toutes les infos liées à un objet, dans les colonnes de cet objet, afin de pouvoir lorsque je clique sur cet objet, avoir toutes les infos regroupées (la finalité ultime, je ne la sais pas, c'est ce qu'on me demande de faire en tous cas).
Je vais faire un exemple bidon mais qui correspond exactement à ce que je veux.
J'ai une table des immeubles et une table des locataires de ces immeubles (évidemment chaque immeuble n'a pas forcément le même nombre de locataires).
Je veux dans le dbf du shapefile généré, autant de lignes qu'il y a d'immeubles.
Je veux aussi les infos sur les locataires sur ces mêmes lignes, mais en colonne dans la ligne de l'immeuble auquel ils sont rattachés.
Je veux aussi un ordonnancement des locataires de chaque immeuble selon des critères (par type de logement DECROISSANT (F5,F4,F3,F2), puis par par prix de loyer).
Est-ce que l'exemple vous permet de mieux comprendre ?
Hors ligne
#9 Thu 22 March 2012 19:22
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1538
Re: [Quantum GIS] Relation 1-N de données de shapefiles
...Est-ce que l'exemple vous permet de mieux comprendre ?
Oui je comprends mieux.
Alors postgis est fait pour vous (les autres SGBD spatiaux aussi !)
Il faut charger les deux shapefiles dans postgis avec shp2pgsql.
Puis executer une requete faisant la jointure entre les tables, histoire de rattacher chaque locataire a son immeuble.
La clause "order by" dans la requete permettra de classer les resultats selon le critere de votre choix.
Par contre, concernant le fait de mettre les infos des locataires en colonnes, je ne vois pas trop comment faire:
si la table doit avoir une ligne par immeuble, ca va etre difficile de mettre les infos des locataires (dont le nombre est variable par immeuble) en colonne. En effet, un immeuble devrait avoir 6 colonnes s'il y a 6 locataires, et seulement 3 colonnes s'il y a 3 locataires.
Il faudrait:
• Soit sortir une table ou il y a autant de lignes que de locataires, les immeubles etant repetes,
• soit grouper les information sur les locataires dans une seule ligne d'un immeuble: liste des loyers, liste des type de logement, etc. Ceci peut se faire en mettant les données dans des tableaux, ou en creant une liste de valeurs.
Nicolas
Dernière modification par Nicolas Ribot (Thu 22 March 2012 19:23)
Hors ligne
#10 Thu 22 March 2012 23:00
- sigdu80
- Participant actif
- Date d'inscription: 2 Sep 2010
- Messages: 112
Re: [Quantum GIS] Relation 1-N de données de shapefiles
, oui faire la jointure que tu évoques est assez facile pour moi, je fais du SQL depuis longtemps.
Donc avec pgsql2sql, je sais le faire sans problème. Mais cela ne fait pas ce que je veux.
Le nombre de lignes de résultats correspond au nombre de locataires.
La ligne comportant les infos suivantes :
INFOS de l'immeuble du locataire + les infos du locataire
grouper les infos, je vois mais cela risque de ne pas convenir.
Les infos du locataire seraient multiple, du genre : nom prénom age sexe ...
et mettre des liste de chaque type de donnée concernant un locataire va être pas très lisible.
liste des noms de locataires : durant, dupont, dugenou
liste des prénoms de locataires : jean, léon, rené
je sais, c'est assez compliqué.
La solution de dernier recours pour moi, mais elle demande du temps de développement + elle fait tourner un petit moment postgresql :
générer la requête :
- avec une partie déjà écrite propre aux immeubles
- avec une partie sur les locataires déterminé dans le code
ce serait de déterminer le nombre max d'appartements de chaque type de logement.
ensuite, généré les jointures suivant le nombre max de type de logement (LEFT JOIN).
du genre :
LEFT JOIN locataires locataires_numero1_appartF1 ...
LEFT JOIN locataires locataires_numero2_appartF1 ...
...
LEFT JOIN locataires locataires_numero1_appartF2 ...
LEFT JOIN locataires locataires_numero2_appartF2 ...
LEFT JOIN locataires locataires_numero3_appartF2 ...
...
C'est extrême et un peu long à mettre en place non ?
Hors ligne
#11 Fri 23 March 2012 11:47
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1538
Re: [Quantum GIS] Relation 1-N de données de shapefiles
Vous auriez un exemple de ce que vous voulez obtenir au final ?
Je ne vois pas avec les left join. sur quoi vous joignez ?
nicolas
Hors ligne
#12 Fri 23 March 2012 14:15
- sigdu80
- Participant actif
- Date d'inscription: 2 Sep 2010
- Messages: 112
Re: [Quantum GIS] Relation 1-N de données de shapefiles
Pas de souci. Le voici :
Code:
SELECT immeubles.*,locataires_numero1_appartF1.*,locataires_numero2_appartF1.*,locataires locataires_numero1_appartF2.*,locataires locataires_numero1_appartF2.*,locataires locataires_numero3_appartF2.* FROM immeubles LEFT JOIN (SELECT * FROM locataires WHERE type_appart = 'F1' LIMIT 1 OFFSET 0) locataires_numero1_appartF1 ON immeubles.idimmeuble = locataires_numero1_appartF1.idimmeuble LEFT JOIN (SELECT * FROM locataires WHERE type_appart = 'F1' LIMIT 1 OFFSET 1) locataires_numero2_appartF1 ON immeubles.idimmeuble = locataires_numero2_appartF1.idimmeuble LEFT JOIN (SELECT * FROM locataires WHERE type_appart = 'F2' LIMIT 1 OFFSET 0) locataires_numero1_appartF2 ON immeubles.idimmeuble = locataires_numero1_appartF2.idimmeuble LEFT JOIN (SELECT * FROM locataires WHERE type_appart = 'F2' LIMIT 1 OFFSET 1) locataires_numero2_appartF2 ON immeubles.idimmeuble = locataires_numero2_appartF2.idimmeuble LEFT JOIN (SELECT * FROM locataires WHERE type_appart = 'F2' LIMIT 1 OFFSET 2) locataires_numero3_appartF2 ON immeubles.idimmeuble = locataires_numero3_appartF2.idimmeuble
Dernière modification par sigdu80 (Fri 23 March 2012 14:16)
Hors ligne
#13 Fri 23 March 2012 14:56
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1538
Re: [Quantum GIS] Relation 1-N de données de shapefiles
D'accord, ca ressemble a une transposition de table: les lignes de locataire deviennent des colonnes de la table immeuble.
Vous souhaitez avoir des valeurs nulles lorsqu'un immeuble x a moins de locataires qu'un immeuble y ?
S'il y a beaucoup de locataires, ca va creer des tonnes de colonnes dans la table.
Vous ne preferez pas garder le lien entre les deux tables ?
Nicolas
EDIT modération : merci de ne pas citer tout le message précédent, ça alourdit votre message. Il suffit de cliquer sur "Poster une réponse". J'ai édité vos messages pour rendre le fil plus lisible.
Hors ligne
#14 Fri 23 March 2012 16:17
- sigdu80
- Participant actif
- Date d'inscription: 2 Sep 2010
- Messages: 112
Re: [Quantum GIS] Relation 1-N de données de shapefiles
Oui, ce serait des valeurs nulles dans ce cas.
Effectivement, çà crée des tonnes de colonnes, il faut prévoir avant de générer les left join, le nombre max de locataires par type d'appartement. ce n'est pas que je préfère, c'est juste que cela répond à ce que je souhaite.
Si je voulais garder le lien, je l'aurais réalisé sans problème depuis le départ a priori.
Hors ligne
#15 Fri 23 March 2012 16:45
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1538
Re: [Quantum GIS] Relation 1-N de données de shapefiles
Je vois ce module Postgresql:
http://www.postgresql.org/docs/9.1/stat … efunc.html
Nico
Hors ligne
#16 Sat 24 March 2012 22:02
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1538
Re: [Quantum GIS] Relation 1-N de données de shapefiles
En utilisant les modules tablefunc et hstore, un truc comme ca ?
(je triche un peu: le nombre de locataires est prédéterminé dans la requete de pivot )
On peut imaginer une fonction plpgsql qui determine le nombre max de locataires par type d'appart puis qui construit la requete de façon dynamique.
Code:
create table immeubles( id serial primary key, nom text, geom geometry ); create table locataires ( id serial primary key, id_imm int, nom text, typ_log text, loyer int ); insert into immeubles(nom) values ('immeuble 1'), ('immeuble 2'), ('immeuble 3'); insert into locataires (id_imm, nom, typ_log, loyer) values (1, 'toto', 'F3', 500), (1, 'titi', 'F1', 350), (2, 'tutu', 'F2', 300), (2, 'tata', 'F1', 200), (2, 'tyty', 'F4', 750), (2, 'tete', 'F4', 800), (2, 'John', 'F5', 900), (3, 'bill', 'F3', 400), (3, 'sam', 'F2', 300), (3, 'luc', 'F5', 1300), (3, 'eve', 'F5', 1100); -- pivot sur la table des locataires par immeubles. -- Les infos d'un locataire sont stockées dans un hstore, puis -- exprimées en colonnes dans la requete finale with cross_ as ( select * from crosstab( 'select i.id, l.typ_log, hstore(l)::text as loc_info from immeubles i, locataires l where i.id = l.id_imm order by 1,2') as ct(id_imm int, loc1 text, loc2 text, loc3 text, loc4 text, loc5 text) ) select id_imm, -- locataire 1 (loc1::hstore)->'id' as loc1_id, (loc1::hstore)->'nom' as loc1_nom, (loc1::hstore)->'typ_log' as loc1_typ_log, (loc1::hstore)->'loyer' as loc1_loyer, -- locataire 2 (loc2::hstore)->'id' as loc2_id, (loc2::hstore)->'nom' as loc2_nom, (loc2::hstore)->'typ_log' as loc2_typ_log, (loc2::hstore)->'loyer' as loc2_loyer, -- locataire 3 (loc3::hstore)->'id' as loc3_id, (loc3::hstore)->'nom' as loc3_nom, (loc3::hstore)->'typ_log' as loc3_typ_log, (loc3::hstore)->'loyer' as loc3_loyer, -- locataire 5 (loc4::hstore)->'id' as loc4_id, (loc4::hstore)->'nom' as loc4_nom, (loc4::hstore)->'typ_log' as loc4_typ_log, (loc4::hstore)->'loyer' as loc4_loyer, -- locataire 5 (loc5::hstore)->'id' as loc5_id, (loc5::hstore)->'nom' as loc5_nom, (loc5::hstore)->'typ_log' as loc5_typ_log, (loc5::hstore)->'loyer' as loc5_loyer from cross_; id_imm | loc1_id | loc1_nom | loc1_typ_log | loc1_loyer | loc2_id | loc2_nom | loc2_typ_log | loc2_loyer | loc3_id | loc3_nom | loc3_typ_log | loc3_loyer | loc4_id | loc4_nom | loc4_typ_log | loc4_loyer | loc5_id | loc5_nom | loc5_typ_log | loc5_loyer --------+---------+----------+--------------+------------+---------+----------+--------------+------------+---------+----------+--------------+------------+---------+----------+--------------+------------+---------+----------+--------------+------------ 1 | 2 | titi | F1 | 350 | 1 | toto | F3 | 500 | | | | | | | | | | | | 2 | 4 | tata | F1 | 200 | 3 | tutu | F2 | 300 | 6 | tete | F4 | 800 | 5 | tyty | F4 | 750 | 7 | John | F5 | 900 3 | 9 | sam | F2 | 300 | 8 | bill | F3 | 400 | 10 | luc | F5 | 1300 | 11 | eve | F5 | 1100 | | | | (3 rows)
Nico
Hors ligne
#17 Mon 26 March 2012 19:31
- sigdu80
- Participant actif
- Date d'inscription: 2 Sep 2010
- Messages: 112
Re: [Quantum GIS] Relation 1-N de données de shapefiles
Bonjour Nicolas,
tu ne fais pas de trêve le week-end apparemment
merci pour les solutions.
Il faudrait que je vois si mon admin veut bien l'installer selon les divers contraintes.
Je n'ai pas encore regardé cette extension et sa façon de fonctionner.
Bonne fin de journée
Hors ligne