SAS:如何将sashelp.zipcode坐标投影到maps.states?

时间:2015-11-17 21:17:16

标签: sas maps

我想在美国地图上绘制数千个邮政编码。 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来修复范围问题,但地图仍然是横向的) 。

我做错了什么?请帮忙!

1 个答案:

答案 0 :(得分:2)

你遇到的问题是你没有告诉注释系统你有什么样的坐标。请记住,注释不一定只在图形本身的坐标系中 - 它们也可以放在图形外的位置(例如自定义轴标签,自定义标题等),它们可以按百分比给出而不是实际坐标(例如,着色右边20%红色和左边20%绿色)。您可以使用xsysysys,如果指定了字符的高度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;