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

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 Jan 2006
Messages: 1233
Site web

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)


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

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

 

Pied de page des forums

Powered by FluxBB