/* Step 1 */


goptions rotate=landscape htext=3 pct ftext=swissb;     
                                                        
   /* Subset states in western region and assign      */
   /* counties to regions.                            */
data swest;                                             
   set maps.county;                                     
   if state in(4,8,35,49);                              
   if state=4 then do;                     /* Arizona */
      if county in(1,5,15,17)                           
      then region='Flagstaff';                          
         else region='Phoenix';                         
      end;                                              
   if state=8 then do;                    /* Colorado */
      if county in(33,67,83,85,91,111,113)              
      then region='Flagstaff';                          
         else region='Denver';                          
      end;                                              
   if state=35 then do;                 /* New Mexico */
      if county in(17,23,29)                            
      then region='Phoenix';                            
         else if county in(31,45)                       
         then region='Flagstaff';                       
            else region='Santa Fe';                     
      end;                                              
   if state=49 then do;                       /* Utah */
      if county in(9,47)            
      then region='Denver';         
         else if county in(25,37,53)
         then region='Flagstaff';   
            else region='Provo';    
      end;                          
run;


/* Step 2 */


   /* Project the map of western states.              */
proc gproject data=swest out=swest;                     
   id state county;                                     
run;


/* Step 3 */


   /* Create a data set with only state borders.      */
proc gremove data=swest out=stborder;
   by state;                         
   id county;                        
run;                                 


/* Step 4 */


   /* Sort by region and create a data set with only  */
   /* region borders.                                 */
proc sort data=swest out=swest2;                        
   by region;                                           
run;                                                    
                                                        
proc gremove data=swest2 out=regbordr;                  
   by region;                                           
   id county;                                           
run;


/* Step 5 */


   /* Create an Annotate data set to draw             */
   /* state borders.                                  */
data annost;                                            
   set stborder;                                        
   by state segment;                                    
   retain                                               
      size 8         /* line thickness                */
      color 'yellow' /* yellow border                 */
      xsys '2'       /* Use the map coordinate system.*/
      ysys '2'                                          
      when 'a' ;   /* Annotate after the map is drawn.*/
                                                        
      /* For the first point in each polygon or the   */
      /* first point of the interior polygon, set     */
      /* FUNCTION to 'POLY'.                          */
   if first.segment or (lag(x)=. and lag(y)=.)          
      then function='POLY    ';                         
      /* For other points, set FUNCTION to 'POLYCONT'.*/
   else function='POLYCONT';                            
                                                        
      /* Don't output points with missing values.     */
   if x and y then output;                              
run;                                                                                                            


/* Step 6 */


data annoreg;                                           
   set regbordr;                                        
   by region segment;                                   
   retain                                               
      size 8         /* line thickness                */
      color 'black'  /* black border                  */
      xsys '2'       /* Use the map coordinate system.*/
      ysys '2'                                          
      when 'a';    /* Annotate after the map is drawn.*/
                                                        
      /* For first point in each polygon or first     */
      /* point of interior polygon, set FUNCTION      */
      /* to 'POLY'.                                   */
   if first.segment or (lag(x)=. and lag(y)=.)          
      then function='POLY    ';                         
                                                        
      /* For other points, set FUNCTION to 'POLYCONT'.*/
   else function='POLYCONT';                            
                                                        
     /* Don't output points with missing values.      */
   if x and y then output;                              
run;                                                    


/* Step 7 */

                                                                                                                                        
   /* Combine the two Annotate data sets.             */
data annoboth;                                          
   set annost annoreg;                                  
run;


/* Step 8 */

         
   /* Create the map, using the Annotate facility to  */
   /* draw state and region outlines.                 */
title h=8 pct 'Western Conservation Regions';           
proc gmap map=swest data=swest anno=annoboth;           
   id state county;                                     
   choro region / coutline=white  legend=legend1;       
   legend1 shape=bar(4,3) pct  across=5 frame           
           cshadow=black label=none;                    
   pattern1 v=s c=green;                                
   pattern2 v=s c=blue;                                 
   pattern3 v=s c=red;                                  
   pattern4 v=s c=magenta;                              
   pattern5 v=s c=cyan;                                 
run;