/* Associate the libref MAPS with your SAS Map */
/* Library. This may already be done at your */
/* site when the SAS System is invoked. */
libname maps 'SAS-maps-library';
/* Create the sales information data set for */
/* selected cities by state. Note: The STATE */
/* and CITYFIPS values in the response data set */
/* must match the FIPS values that appear in */
/* the MAPS.USCITY and MAPS.US map data sets. */
/* In this example the sales data are already */
/* sorted by STATE and CITYFIPS. */
data sales;
input state cityfips sales cityname $13.;
cards;
40 3550 300 Oklahoma City
40 4780 200 Tulsa
48 1730 600 Dallas
48 3280 500 Houston
48 4140 250 Lubbock
48 6090 400 San Antonio
run;
/* Merge the sales information data set (SALES) */
/* with the MAPS.US data set to produce a data */
/* set called SALETERR with coordinates for */
/* only the states that appear in the SALES */
/* data set. */
data saleterr;
merge sales(in=sales) maps.us(in=inus);
by state;
if sales and inus;
/* Sort MAPS.USCITY by STATE and CITYFIPS and */
/* create a data set called UCITY. The data set */
/* must be sorted before it can be merged with */
/* the SALES data set. */
proc sort data=maps.uscity out=ucity;
by state cityfips;
/* Merge the SALES and UCITY data sets to */
/* produce a data set with the coordinates of */
/* only the cities that appear in the sales */
/* information data set. Assign a new STATE */
/* value, unique to each city by adding the */
/* values of STATE and CITYFIPS/100,000. */
/* Dividing CITYFIPS by a large value is */
/* necessary to prevent duplicate values for */
/* STATE. For example, adding the values of */
/* STATE=10 and CITYFIPS=150 would yield the */
/* same result as adding STATE=30 and */
/* CITYFIPS=130. */
data ctycoord;
merge sales(in=insales) ucity(in=incity);
by state cityfips;
if insales and incity;
state=state+(cityfips/100000);
run;
/* Create the map data set MYMAP by combining */
/* the SALETERR and CTYCOORD data sets. */
data mymap;
set saleterr ctycoord;
/* Take the response data set SALES and assign */
/* values to the STATE variable that match the */
/* values in the UCITY data set by adding the */
/* values of STATE and CITYFIPS/100,000. */
data newsales;
set sales;
state=state+(cityfips/100000);
run;
/* Create the map using the new response data */
/* set NEWSALES and the map data set MYMAP. */
/* The ALL option must be included on the PROC */
/* GMAP statement so the Oklahoma and Texas */
/* boundaries are drawn. The DISCRETE option */
/* must be specified on the BLOCK statement so */
/* the procedure will treat each sales value as */
/* a separate category. */
goptions ftext=swiss;
title1 'Sales for Oklahoma and Texas';
proc gmap data=newsales map=mymap all;
id state;
block sales/discrete
blocksize=3
yview=-1;
/* patterns for the blocks */
pattern1 v=solid c=black;
pattern2 v=r1 c=black;
pattern3 v=empty c=black;
pattern4 v=x1 c=black;
pattern5 v=x4 c=black;
pattern6 v=r3 c=black;
run;