javascript - SAS、PHP 或 JavaScript 中的梅登黑德网格平方函数

标签 javascript php sas latitude-longitude

从概念上讲,我明白我需要做什么。但从数学上来说我很困惑。 我想最好在 SAS 中创建两个函数,但 PHP 或 JavaScript 也可以。第一个将纬度/经度转换为梅登黑德网格广场,第二个根据网格广场名称(即 EM29qe78pq)查找梅登黑德网格广场中心的纬度和经度。我希望两者都能处理所有 10 个 Angular 色,但仍然足够灵活,只需要 6 和 8 个 Angular 色。 我已经阅读并重新阅读了维基百科文章 https://en.wikipedia.org/wiki/Maidenhead_Locator_System但总是得出错误的值(value)观。我已经在 Google 上搜索了 100 多次寻求帮助,但没有找到这样的帮助。我意识到我只是不理解这个问题的数学部分。这是简单的数学……有人告诉我。 这是 SAS 宏,我将网格正方形转换为纬度/经度,但虽然接近,但它不正确。有人愿意帮我调查一下这个问题,也许会给我答案吗?

%宏grid2latlong(网格);

field = 'ABCDEFGHIJKLMNOPQRSTUVWX';

array sparts $ 1 var1-var10;
do i = 1 to length(&grid);
    sparts{i} = substr(&grid,i,1);
    lon1 = (find(field,var1)-1) * 20 - 180;
    lat1 = (find(field,var2)-1) * 10 - 90;

    lon2 = var3 * 2;
    lat2 = var4 * 1;

    lon3 = (find(field,var5)-1) * 5/60;
    lat3 = (find(field,var6)-1) * 2.5/60;

    lon4 = var7 * 0.0083333; 
    lat4 = var8 * 0.0041666; 

    lon5 = var9;
    lat5 = var10;

    lonx = sum(lon1,lon2,lon3,lon4); 
    latx = sum(lat1,lat2,lat3,lat4); 
end;

drop i var1-var8 lon4 lat4 lon1-lon3 lat1-lat3;

%修正;

最佳答案

据我所知,您不是在计算质心,而是在计算正方形的左下边界。为了计算质心,看起来标准 Perl 例程维基百科引用文献根据需要附加了“..55LL55LL”(前两个显然必须存在,但之后 55 或 LL 将大致是网格图 block 的中心点)。鉴于 55LL 的存在,我认为 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;

关于javascript - SAS、PHP 或 JavaScript 中的梅登黑德网格平方函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31991921/

相关文章:

javascript - AWS Cloudsearch Ruby SDK 在提供表达式时出现错误 : Found invalid value where JavaScript Object was expected

php - 尝试从 PHP 中删除 sql 查询时出现白屏

php - 从 php 运行长 SAS 存储过程而无需挂起浏览器

sas infile 数据行截断为 8 个字符

javascript - Jquery 工具提示非常跳跃

javascript - 将serverID添加到用户数据

javascript - 使用 Javascript 隐藏和显示导航栏

php - 在 php 字符串中存储 html 的替代方法

php while 循环与 $i++

r - R中x^2和I(x^2)有什么区别?