2012-11-04 82 views
1

签的文件中的数据(3列),如:如何计算位于小网格中的元素的频率?

longitude latitude count 
20.12  50.45  1 
35.78  24.26  1 
20.48  50.16  2 
...   ...  ... 

地图(经度和纬度)拆分许多网格:0.5 * 0.5(大小),例如:

longitude: [0, 0.5), [0.5, 1.0), ... , [179.5, 180.0) 
latitude : [-90, -89.5), [-89.5, -89.0), ... , [89.5, 90.0] 

网格是在地图上格式为0.5 * 0.5。

例如: 上面的第1条和第3条记录位于网格经度[20.0,20.5]和纬度[50.0,50.5],因此计数= 1 + 2 = 3。

那么,如何使用awk或其他脚本编程从数据文件中获取位于每个网格中的计数? 如何绘制结果?

+1

你有什么试过?另外,你是什么意思_“如何绘制结果”_? –

回答

1

我认为这会做你想要什么:

awk 'function floor(x){ 
    y=int(x); return y>x?y-1:y 
}{ 
    ilon=floor($1/0.5) 
    ilat=floor($2/0.5) 
    hist[ilat,ilon]+=$3 
}END{ 
    for(ilat=-180;ilat<=180;ilat++) 
     for(ilon=-360;ilon<=360;ilon++){ 
      printf(" %4d", hist[ilat,ilon]) 
     printf("\n") 
    } 
}' 

注:我硬编码LON [-180:180]的限制和纬度[-90:90](包括步长)。更一般的,你可以根据你当前的步长来计算你的数组的整数限制(我想你可能想要使用不同的步长,而不是所有的时间都是0.5),以及纬度/经度范围。注意2:awk中缺少有用的预定义函数,这里需要我自己定义floor。我想知道为什么选择排除大部分的数学函数。注意3:如果不清楚,这将是每个单元格命中计数的大矩阵,纬度每0.5步一行,每经过一个这样的步长一列。