This is indeed a tough question ...
With a flat/choro map, you could plot your data for each id (small area), and then overlay the borders for the id2 areas (which you determined using gremove) by annotating lines/polygons...
But since you're using a 3d block map, there's not a good way to annotate those borders on top of the map, but 'behind' the bars. And actually, since the 3d block map has a bit of a tilt to it, I don't think annotated lines/polygons will line up correctly with the map anyway.
So, I had to come up with a solution not using annotate...
I used the gremoved id1 map as the visible map, and then also combined that with a map that just consisted of 1 x/y point for each small id area. The data matching the id areas will draw the block/bars, and the background of the map will be drawn by the 'all' option and the cdefault color. There's a lot of "trickery" and "slight of hand" going on in this technique, but it's the only way I can think of to get the map you're wanting...
/* create a map containing 1-point at the center of each id */ /* these will not be visible map areas - you will only see the block bars */ %annomac; %centroid(mapsgfk.south_korea,korea_id,id,segonly=1);
/* create a map of the id1 boundaries */ proc gremove data=mapsgfk.south_korea out=korea_id1; by id1; id id; run;
/* assign a fake id for each id1 area */ data korea_id1; length id $50; set korea_id1; id=trim(left(id1))||'xxx'; run;
/* combine the 2 maps */ data korea; set korea_id korea_id1 ; run;
/* create some fake data, just for the demonstration */ proc sql noprint; create table fakedata as select unique id, ranuni(123)*100 as n_cases from mapsgfk.south_korea group by id; quit; run;
/* plot the combined map, the id1 areas get the cdefault beige, and the id areas get the block bars */ proc gmap data=fakedata map=korea all; id id; block n_cases / cdefault=beige nolegend blocksize=1.0; run;
... View more