%macro surfcer(map,data,surface,id,var,rmin=.,rap=7); /* Macro écrite par Patrick Brossier (GIP RECLUS) map tableau du fond de carte data tableau de données contenant la variable représentée en cercles surface tableau contenant la variable surface correspondant aux polygones id liste de variables identificatrices communes aux 3 tableaux var variable représentée en cercles rmin taille du rayon minimum souhaité (si ., il sera déterminé par les surfaces) rap rapport entre la surface des cercles et la surface des polygones Cette macro détermine la taille minimal et la taille maximale des cercles de telle sorte que la surface des cercles soit dans un rapport déterminé avec la surface des polygones. Version du 17/12/00 */ %forme; data _null_; derv=symget('id'); a:i=index(trim(derv),' '); if i>0 then do;derv=substr(derv,i+1); goto a; end; call symput('vard',derv); proc sort data=&data out=temps3(keep=&id &var);by &id; proc sort data=&surface(keep=&id surface) out=temps2;by &id descending surface; /* choix du plus grand segment du polygone */ data temps2;set temps2;by &id; if first.&vard; data temps4;merge temps2 temps3;by &id;k=1; &var=abs(&var);if &var>0 & &var^=.; proc sort data=temps4;by &var; /* choix des valeurs extremes des cercles avec la surface polygone */ data temps5;set temps4;by k; if first.k | last.k; keep &id &var surface; /* surface de la carte et coordonnees du cadre */ proc means data=temps4 noprint;var surface; output out=temps6 sum=surfa; proc means data=&map noprint;var x y; output out=temps7 min=xmin ymin max=xmax ymax; data temps6;merge temps6 temps7; /* total et extreme des cercles */ proc means data=temps4 noprint;var &var; output out=temps7 sum=total_ min=vmin_ max=vmax_; data _null_;set temps5; retain vmin_ vmax_ smin total_ surfa maprange; if _n_=1 then do; set temps6; set temps7; maprange=(xmax-xmin)/100; smin=surface; end; else do; %if &rmin=. %then rmin=sqrt((surfa/&rap)*vmin_/(arcos(-1)*total_))/maprange; %else %if &rmin<0 %then rmin=-&rmin*sqrt(vmin_/vmax_);; /* rmin < 0 = rmax */ rmax=rmin*sqrt(vmax_/vmin_); rmin=floor(rmin*1000)/1000; rmax=ceil(rmax*1000)/1000; stot=arcos(-1)*total_*rmin*rmin/vmin_; sur1=arcos(-1)*rmin*rmin; sur2=arcos(-1)*&var*rmin*rmin/vmin_; maprange=maprange*maprange; surfa=surfa/maprange; smin=smin/maprange; surface=surface/maprange; put 'surface de la carte=' surfa '; surface des cercles=' stot; put 'rayon minimum=' rmin '% pour valeur minimum=' vmin_; put 'rayon maximum=' rmax '% pour valeur maximun=' vmax_; put 'surface du cercle minimum=' sur1 'pour une surface de ' smin ; put 'surface du cercle maximum=' sur2 'pour une surface de ' surface ; file forme; put 'macro _rmin ' rmin '%'; put 'macro _rmax ' rmax '%'; put 'macro _vmin ' vmin_ '%'; put 'macro _vmax ' vmax_ '%'; end; run; %inc forme; proc datasets dd=work nolist nowarn force nofs; delete temps1 temps2 temps3 temps4 temps5 temps6 temps7; run; quit; %mend;