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

SAS:如何将sashelp.zipcode坐标投影到maps.states上?,sas,maps,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; 邮政编码标得很准确,但地图当然(稍微)失真了。我想

我想在美国地图上标出数千个邮政编码。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;
数据拉链;
设置
(2,15,72,)中没有的状态;
函数='symbol';
大小=.02;
text=“点”;
xsys='2';
ysys='2';
hsys='3';
当class='a';
color=“%hsv(100100)”;
x=atan(1)/45*x;
y=atan(1)/45*y;
x=-x;
跑
数据状态;
设置地图、状态;
(2、15、72)中没有的状态;
跑
数据组合;
设置拉链状态;
跑
proc gproject data=combo
out=comboproj;
身份证状态;
跑
数据zipsproj mapproj;
设置项目;
如果when=“a”,则输出zipsproj;
如果when=“”,则输出mapproj;
跑
proc gmap map=mapproj
数据=mapproj
anno=zipsproj all;
身份证状态;
choro状态/nolegend级别=1;
跑
退出
这给了我一个所有zip坐标都超出范围的侧向美国地图(Edit我通过将zip坐标乘以-1修复了范围问题,但地图仍然是侧向的)


我做错了什么?请帮忙

你的问题是你没有告诉注释系统你有什么样的坐标。请记住,注释不必仅位于图形本身的坐标系中-它们也可以放置在图形外的位置(如自定义轴标签、自定义标题等),并且可以以百分比而不是实际坐标给出(例如,将右侧20%涂成红色,左侧20%涂成绿色)。使用
xsys
ysys
,如果指定字符高度,
hsys
。2表示“绝对数据值”;3表示“绝对,图形面积百分比”。有关坐标系的详细信息,请参见

您也不应该将状态x乘以-1,至少在我的设置中是这样。只有zip坐标x应该乘以-1。但是,如果您的设置需要这样做,当然可以这样做

最后,当GPROJECT在事物的负x端看到一些值时,它会将地图转向一边。这导致它在COE为PARALLEL1/2时做出了一个奇怪的选择(您可以在日志中看到这种情况)。消除所有非美国48个州(关岛、密克罗尼西亚等)以获得较低的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;

这里有很多地图示例:。也许这会帮助你找到你想要的答案。谢谢你的帮助和彻底的回答!这让我意识到我遗漏了我正在使用的注释变量。我把它们添加到我的原始答案中。我看到的一个不同点是,你指定了x1=x和y1=y,因此我必须更多地考虑这是做什么的。这没有做任何事情,我只是确保变量是正确的(因为SGPLOT ANNOTENT是我更了解的,我忘记了其中一个与另一个)。在我修改后的答案中,你可以看到我包括了xsys='2',ysys='2'和hsys='3'。在研究过程中,我遇到了其他人,他们在有大量数据点的情况下也遇到了类似的问题,但没有人找到解决方案。如果你把所有的zipcode都画成点,你会得到一个侧边图吗?如果我在转换成弧度之前不把zipcode X坐标乘以-1,我会得到一个侧边图(你必须转换一个或另一个,不管是哪一个-但是如果你转换状态而不是Zips,那么标签在GPROJECT之后会倒过来).如果状态ne 2和状态ne 15以及状态lt 60,则添加
到zips数据集,我认为您将得到正确的结果。