#1 Thu 04 June 2015 16:50
- Emy.C
- Participant occasionnel
- Date d'inscription: 9 Oct 2014
- Messages: 21
Postgis/postgres - Répartition aléatoire de valeurs
Bonjour,
je bloque complètement sur un problème qui me semble pourtant basique.
J'ai d'un côté une table contenant des bâtiments regroupant :
un identifiant par bâtiment, l'identifiant de la zone dans laquelle il se trouve, l'identifiant de son usage.
De l'autre côté, je dispose d'une table regroupant une triplette zones/usage/bâtiment regroupant :
un identifiant par zone, l'identifiant des usages des bâtiments compris dans la zone, une catégorie attachée à cette usage et la proportion de répartition de cette catégorie. Donc dans cette dernière table, on retrouve pour une zone, plusieurs usages et pour chaque usage plusieurs catégories. Pour chacune de ces catégories on dispose d'un pourcentage de répartition.
Je souhaite ventiler ces catégories parmi les bâtiments de même usage dans une zone donnée aléatoirement en fonction de la valeur répartition.
Je ne suis pas sûre d'être très claire. J'ai besoin de piste en terme de fonctions et/ou de démarche. Je suis complètement à sec.
Quelqu'un aurait-il une idée lumineuse?
Merci d'avance.
Hors ligne
#2 Fri 05 June 2015 10:48
Re: Postgis/postgres - Répartition aléatoire de valeurs
Bonjour Emy,
ce n'est pas très clair pour moi, en effet :-)
pourriez vous poster 1ligne de chacune de vos tables ainsi que leur entêtes ?
Ainsi qu'un exemple de ligne de résultat attendu ?
Dernière modification par MathieuB (Fri 05 June 2015 10:48)
Mathieu BOSSAERT
Association GeoRezo
Hors ligne
#3 Fri 05 June 2015 11:24
- ppluvinet
- Participant assidu
- Lieu: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
Re: Postgis/postgres - Répartition aléatoire de valeurs
Bonjour Emy,
en espérant avoir compris, vous pouvez affecter à chaque batiment respectant la condition d'usage une valeur aléatoire comprise entre 0 et le nombre de batiments dans la zone avec la fonction random :
Code:
CREATE OR REPLACE FUNCTION random(numeric, numeric) RETURNS numeric AS $$ SELECT ($1 + ($2 - $1) * random())::numeric; $$ LANGUAGE 'sql' VOLATILE; alter table BATIMENT add column rand numeric; update BATIMENT set rand = random(0, nbbat) -- avec nbbat = le nombre de batiments dans la zone
Puis si vous savez combien de batiments il vous faut par zone, vous faites un SELECT avec la condition WEHERE rand <= nbbatattenduparzone.
Si ma réponse ne convient pas parfaitement, j'espère qu'elle donne à minima des éléments de réponses !
Bonne journée,
Dernière modification par ppluvinet (Fri 05 June 2015 11:25)
Pascal PLUVINET
Hors ligne
#4 Mon 08 June 2015 08:28
- Emy.C
- Participant occasionnel
- Date d'inscription: 9 Oct 2014
- Messages: 21
Re: Postgis/postgres - Répartition aléatoire de valeurs
Bonjour,
merci pour vos réponses. Je me précise quelque peu mon problème, sur lequel j'ai avancé sans pour autant trouvé de solution satisfaisante.
J'ai donc une table bâtiment et une table zone constituée comme indiqué dans la pièce jointe.
J'ai développé une fonction mais qui ne tourne que sur le premier type de chaque couple zone/usage :
Code:
CREATE OR REPLACE FUNCTION bc_per_building ( ) RETURNS VOID AS $$ DECLARE current_zone_bc record; i integer ; -- nombre de d'itération BEGIN i := 1 ; FOR current_zone in SELECT z.id_zone, z.id_usage, z.id_categorie, z.repart_categorie, count(b.gid) as nbbati_zone, count(b.gid) * z.repart_bc/100 AS nbbati_repart, z.geom FROM monschema.table_zone AS z INNER JOIN monschema.table_bati as b ON st_contains (z.geom, st_centroid(b.geom)) WHERE zgeom.code = b.id_zone AND z.id_usage = b.code_usage GROUP BY z.id_zone, z.id_usage, z.id_categorie, z.repart_categorie, z.geom LOOP WHILE i <= current_zone_bc.nbbati_repart LOOP UPDATE monschema.table_bati bg SET id_categorie = current_zone_bc.id_categorie WHERE bg.id_bc IS NULL AND bg.id_usage = current_zone_bc.id_usage AND bg.id_zone = current_zone_bc.id_zone AND bg.random_num <= current_zone_bc.nbbati_repart; i := i + 1 ; END LOOP ; END LOOP ; END ; $$ language plpgsql volatile; SELECT bc_per_building ( ) ;
Cependant cette fonction ne complète les id_categorie des bâtiment uniquement pour le premier couple usage/zone/id_categorie. Elle prend bien en comte le nombre voulu d'itération mais uniquement sur cette première entité. Auriez vous quelque idée lumineuse sur l'origine du problème?
Merci d'avance.
Dernière modification par Emy.C (Mon 08 June 2015 08:54)
Hors ligne
#5 Mon 08 June 2015 12:44
- ppluvinet
- Participant assidu
- Lieu: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
Re: Postgis/postgres - Répartition aléatoire de valeurs
Bonjour,
Je ne vois pas bien l’intérêt des boucles.
Avez-vous testé la solution que je proposais ?
Bon courage,
Pascal PLUVINET
Hors ligne