你不是在计算质心,而是在计算正方形的左下边界,正如我所理解的。为了计算质心,看起来标准Perl例程Wikipedia引用根据需要附加了“..55LL55LL”(前两个显然必须存在,但之后55或LL将大致是网格平铺的中心点)。我假设55LL是“标准”,因为它存在于那里;通过取左边界和右边界(下一个左边界)的平均值,可以更精确地计算它。
这是上面代码的一个稍微简化的版本。我将其作为数据步骤来编写,以简化测试,但当然,将其作为宏是微不足道的。如果你有FCMP(9.2+,更好的9.4+),你当然可以把它写成一个实际的函数。
data have;
length grid $10;
input grid $;
datalines;
AB12CD34
AB12CD
AB12CD34EF
;;;;
run;
%let grid=grid;
data want;
set have;
*Initialize some variables;
latmult=10; *the amount to multiply latitude values by (starting out);
lonmult=20; *the amount to multiply longitude values by (starting out);
lon=-180; *the zero point for longitude in this system;
lat=-90; *the zero point for latitude in this system;
*append 5's and L's to the string if it is incomplete;
*If you leave this out, this still works, but returns the edge not the center;
initial_String='LL55LL55LL';
substr(initial_String,1,length(&grid.)) = trim(&grid.);
do i = 1 to length(initial_String) by 2;
if mod((i+1)/2,2)=1 then do; *letters;
if I>1 then do; *i=1 it is initialized properly already;
lonmult=lonmult/24;
latmult=latmult/24;
end;
*rank converts "A" to 65 and up through "Z" is 90.;
lon=sum(lon,lonmult*(rank(upcase(char(initial_String,i)))-65));
lat=sum(lat,latmult*(rank(upcase(char(initial_String,i+1)))-65));
end;
else do;
latmult=latmult/10;
lonmult=lonmult/10;
lon=sum(lon,lonmult*input(char(initial_String,i),1.));
lat=sum(lat,latmult*input(char(initial_String,i+1),1.));
end;
end;
run;