Pages: 1
- Sujet précédent - [Postgis2.0] créer une table d'aggrégation + ajout champs modifiables - Sujet suivant
#1 Mon 15 April 2013 20:29
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3945
[Postgis2.0] créer une table d'aggrégation + ajout champs modifiables
Bonjour,
Je suis en train de salement m'empêtrer dans un truc pas cool donc avant qu'il ne soit trop tard, je fais appel à la communauté.
Sous Postgis, j'ai une table sous la forme
Code:
CREATE TABLE foncier.site_identifie ( gid serial NOT NULL, insee character varying(5) not null, numero integer, nom character varying (50) , statut character varying(25) not null, zonage character varying(20), num_parcelle character varying(14), surface integer, geom geometry(MultiPolygon,2154), CONSTRAINT site_pkey PRIMARY KEY (gid) );
Il s'agit d'un recensement fait sur des parcelles. Ainsi à chaque parcelle retenue, on attribue son code insee, un statut et un numero (ou pas). Ainsi plusieurs parcelles peuvent avoir le même (insee, statut, numero). insee et statut sont non null mais pas numero.
Regroupées selon le numéro insee, le statut et le numéro de site, ces parcelles constituent un unique site.
J'ai créé une vue qui me permet d’agréger le contenu de cette table afin d'avoir une ligne unique pour l'ensemble (insee, numero, statut) et d'avoir des statistiques sur toutes les parcelles. Ça donne quelque chose comme
Code:
CREATE OR REPLACE VIEW site_regroupe AS SELECT row_number() OVER ()::integer AS id, insee, nom, numero AS "numéro de site", statut, sum(surface) AS "surface totale", count(paf.num_parcelle) AS "nbre de parcelles", st_multi(st_union(geom)) AS geom FROM foncier.site_identifie GROUP BY insee, nom, numero, statut ORDER BY insee, statut DESC, numero;
Ce que je souhaiterais en fait, c'est de pouvoir qualifier mes "site_regroupe" c'est-à-dire de disposer d'une table qui contiennent les valeurs agrégées de mes sites (comme le fait la vue) et de nouveaux champs que je pourrais renseigner à ma guise. Les champs issus de la table d'origine se mettraient à jour au rythme des modifications (delete, update, insert de parcelles) qui pourraient y avoir.
Quelqu'un a-t-il une piste?
J'ai lu des discussions sur du insert instead of mais vu que mes géométries notamment changent entre les deux tables, je ne sais pas trop si ça le fera.
J'ai pensé créer une fonction avec un trigger after. Mais, si les situations d'insertion et de suppression semblent fonctionner correctement (et relativement simples à concevoir), pour le update, c'est une toute autre histoire. Novice en plpgsql, je me retrouve à devoir imaginer des cas très variés et complexes (des sous-conditions de conditions de conditions...) qui me prennent la tête pour le moment donc si quelqu’un a une piste plus fun ou connaît des fonctions susceptibles de me faire avancer dans la réflexion, ce serait trop cool.
Merci
Dernière modification par SANTANNA (Mon 15 April 2013 20:30)
Hors ligne
#2 Mon 15 April 2013 22:32
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: [Postgis2.0] créer une table d'aggrégation + ajout champs modifiables
Salut,
j'écris en réfléchissant, mais si j'ai bien compris tu veux associer des attributs aux tuples insee, nom,numero,statuts ?
Pourquoi ne pas créer une table avec ces attributs avec ce même tuple comme "clef primaire" ?
Ensuite pour agréger tout çà, tu crées une vue supplémentaire qui s'occupera de joindre ta table d'attribut à ta table site_regroupe ?
Hors ligne
#3 Tue 16 April 2013 14:45
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3945
Re: [Postgis2.0] créer une table d'aggrégation + ajout champs modifiables
Salut et merci de réfléchir avec moi
si j'ai bien compris tu veux associer des attributs aux tuples insee, nom, numero,statuts ?
Oui, c'est bien cela, je veux lui associer de nouveaux attributs qui seront renseignées par différents utilisateurs, surement sous QGIS.
Pourquoi ne pas créer une table avec ces attributs avec ce même tuple comme "clef primaire" ?
Ça peut effectivement être une solution... Resterait alors à créer une fonction qui assure la recopie/suppression des tuples en fonction de la création de nouveau site ou de la suppression définitive d'un autre. Je dois avoir dans ce que j'ai commencé à écrire, un bout de code qui assure cela mais je me demande s'il vaut mieux que cette fonction agisse depuis la table d'origine "site-identifie" ou plutôt depuis la vue d'agrégat "site-regroupe"? Un conseil?
Et, est-ce que ça ne fait pas trop de "tables" (au moins trois) à gérer pour l'utilisateur final (sous QGIS et/ou Excel) qui n'est pas forcément géomaticien?
Dernière modification par SANTANNA (Tue 16 April 2013 14:46)
Hors ligne
#4 Tue 16 April 2013 20:30
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: [Postgis2.0] créer une table d'aggrégation + ajout champs modifiables
Ça peut effectivement être une solution... Resterait alors à créer une fonction qui assure la recopie/suppression des tuples en fonction de la création de nouveau site ou de la suppression définitive d'un autre. Je dois avoir dans ce que j'ai commencé à écrire, un bout de code qui assure cela mais je me demande s'il vaut mieux que cette fonction agisse depuis la table d'origine "site-identifie" ou plutôt depuis la vue d'agrégat "site-regroupe"? Un conseil?
Je verrai plutôt un trigger avant insertion dans la table d'attribut qui contrôlerait si au moins une entrée dans la table site_identifié corresponds au tuple inséré.
Et, est-ce que ça ne fait pas trop de "tables" (au moins trois) à gérer pour l'utilisateur final (sous QGIS et/ou Excel) qui n'est pas forcément géomaticien?
Et bien, je dirai que tout dépend du public auquel s'adresse le système. Et puis, ça ne fait réellement que deux table ou la mise à jour est possible + une vue de consultation. Je ne pense pas qu'il soit nécessaire d'être géomaticien pour créer une nouvelle ligne dans une table attributaire sous qgis.
Hors ligne
#5 Wed 17 April 2013 09:34
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3945
Re: [Postgis2.0] créer une table d'aggrégation + ajout champs modifiables
Salut
Je ne pense pas qu'il soit nécessaire d'être géomaticien pour créer une nouvelle ligne dans une table attributaire sous qgis.
Là, tu as parfaitement raison et en y réfléchissant, ça fait pas tellement de tables à gérer non plus, du moment que l'utilité de chacune est clairement avérée.
Je verrai plutôt un trigger avant insertion dans la table d'attribut qui contrôlerait si au moins une entrée dans la table site_identifié corresponds au tuple inséré
Le schéma que tu proposes suppose que dans la "table d'attributs", les nouveaux tuples "clef" soient insérés "à la main" (avec risque des messages d'erreur parce qu'on aurait mal saisi un champ, un numéro..., même si le trigger nous assure qu'à la fin, on aura que des valeurs existantes).
Pour épargner ces différents désagréments et parce qu'en une session de travail, on peut avoir à créer plusieurs sites nouveaux, je pense que je vais plutôt opter pour un trigger (after sur site_identifie) qui injecterait dans la "table d'attributs" tout nouveau tuple créé dans la table "site_identifie". Comme cela, on est sûr de la cohérence (pas de message d'erreur à craindre, tous les nouveaux sites sont pris en compte), c'est automatique et rapide (la personne n'a pas à saisir le même site plusieurs fois).
A moins que je n'aie pas totalement compris ta proposition....
Hors ligne
#6 Wed 17 April 2013 10:16
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: [Postgis2.0] créer une table d'aggrégation + ajout champs modifiables
Les deux sont valides, je pense. Le trigger sur site_identifie s'exécutera néanmoins beaucoup plus souvent que celui sur la table d'attributs. Si tu envisage des ajouts massifs de données dans site_identifie, çà doit être quelque chose a prendre en compte également.
Mais je suis d'accord que l'expérience utilisateur serait sans doute meilleure avec ta méthode.
Le mieux c'est de tester les deux.
Hors ligne
Pages: 1
- Sujet précédent - [Postgis2.0] créer une table d'aggrégation + ajout champs modifiables - Sujet suivant