我想在美国地图上绘制数千个邮政编码。 sashelp.zipcode的坐标是以度为单位的纬度/经度,对于maps.states,它们是未经投影的纬度/经度弧度。如果我使用以下方法将邮政编码坐标转换为弧度:
x=atan(1)/45*x;
y=atan(1)/45*y;
我使用
绘制地图data states;
set maps.states;
where state not in (2, 15, 72);
x = -x;
run;
邮政编码准确地绘制,但当然地图(略微)扭曲。我想在你投影maps.states时获得美国地图的丰满弯曲版本。
我承认gproject程序对我来说有点不透明。我试过了:
data zips;
set <dataset with 86,000 zip codes>;
where state not in (2, 15, 72, .);
function='symbol';
size = .02;
text = "dot";
xsys='2';
ysys='2';
hsys='3';
when='a';
color= "%hsv(100,100,100)";
x=atan(1)/45*x;
y=atan(1)/45*y;
x=-x;
run;
data states;
set maps.states;
where state not in (2, 15, 72);
run;
data combo;
set zips states;
run;
proc gproject data=combo
out=comboproj;
id state;
run;
data zipsproj mapproj;
set comboproj;
if when = "a" then output zipsproj;
if when = "" then output mapproj;
run;
proc gmap map=mapproj
data=mapproj
anno = zipsproj all;
id state;
choro state / nolegend levels=1;
run;
quit;
这给了我一张横向美国地图,其中所有的zip坐标都超出范围(编辑我通过将zip坐标乘以-1来修复范围问题,但地图仍然是横向的) 。
我做错了什么?请帮忙!
答案 0 :(得分:2)
你遇到的问题是你没有告诉注释系统你有什么样的坐标。请记住,注释不一定只在图形本身的坐标系中 - 它们也可以放在图形外的位置(例如自定义轴标签,自定义标题等),它们可以按百分比给出而不是实际坐标(例如,着色右边20%红色和左边20%绿色)。您可以使用xsys
,ysys
,如果指定了字符的高度hsys
。 2表示'绝对数据值'; 3表示“绝对值,图形区域百分比”。有关坐标系统的更多信息,请参阅this paper。
你也不应该将状态x乘以-1,至少不是在我的设置中。只有zip坐标x应该乘以-1。但是,如果您的设置需要,当然可以继续这样做。
最后,当GPROJECT在负x方面看到一些值时,它会被GPROJECT转向侧面。这导致它在向PARALLEL1 / 2开始时做出奇怪的选择(你可以在日志中看到这种情况发生)。消除所有非US48州(关岛,密克罗尼西亚等)到达48岁以下。
这是一个适合我的最终代码:
data states;
set maps.states;
where state not in (2, 15, 72);
run;
data zips;
set sashelp.zipcode;
x=-1*x;
x=atan(1)/45*x;
y=atan(1)/45*y;
if state ne 2 and state ne 15 and state lt 60;
when='a';
function='symbol';
text='dot';
xsys='2';
ysys='2';
hsys='3';
run;
data combo;
set zips states;
run;
proc gproject data=combo
out=comboproj;
id state;
run;
data zipsproj mapproj;
set comboproj;
if when = "a" then output zipsproj;
if when = "" then output mapproj;
run;
proc gmap map=mapproj
data=mapproj
anno = zipsproj all density=4 ;
id state;
choro state / nolegend levels=1;
run;
quit;