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

 

#2 Wed 21 March 2012 17:35

MathieuR
Membre
Lieu: aix-en-provence
Date d'inscription: 16 Feb 2009
Messages: 1690
Site web

Re: [Quantum GIS] Relation 1-N de données de shapefiles

pas sous QGIS
Spatialite
Postgre/PostGIS
OK par contre


geodata au cerema et petits billets en géomatique

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

 

#4 Thu 22 March 2012 08:47

MathieuR
Membre
Lieu: aix-en-provence
Date d'inscription: 16 Feb 2009
Messages: 1690
Site web

Re: [Quantum GIS] Relation 1-N de données de shapefiles

Là, c'est une question à poser davantage sur geolibre'BD wink


geodata au cerema et petits billets en géomatique

Hors ligne

 

#5 Thu 22 March 2012 14:17

ChristopheV
Membre
Lieu: Ajaccio
Date d'inscription: 7 Sep 2005
Messages: 3199
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 wink


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 smile

Hors ligne

 

#7 Thu 22 March 2012 16:28

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

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

Re: [Quantum GIS] Relation 1-N de données de shapefiles

sigdu80 a écrit:

...Est-ce que l'exemple vous permet de mieux comprendre ?


Oui je comprends mieux.
Alors postgis est fait pour vous wink (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

smile, 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 ? wink

Hors ligne

 

#11 Fri 23 March 2012 11:47

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

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

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.

smile 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: 1554

Re: [Quantum GIS] Relation 1-N de données de shapefiles

Hors ligne

 

#16 Sat 24 March 2012 22:02

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

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

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 smile

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 smile

Hors ligne

 

Pied de page des forums

Powered by FluxBB