如何使用python对常规lat-lon数据进行面积加权重新划分

时间:2012-05-17 10:15:57

标签: python interpolation

我希望能够在python中执行规则间隔的2D纬度 - 经度数据的面积加权重新划分,例如,例如,从0.5x0.5网格到2.5x3.75网格。这些数据是以kg /平方公尺/ s为单位的排放,因此我需要保存质量和空间分布。

我知道有许多scipy插值例程,我不确定哪个(如果有的话)在这种情况下最好用。如果可能的话,我宁愿不要安装太多额外的python包,除非绝对需要(即我安装了scipy + numpy,但宁愿不必安装专业的python包,它会做我需要的,也需要我将数据存储在特定的类结构等中。但是,如果需要,我会这样做!)。

这对我来说也是一个学习练习,可以理解如何在python中做这些事情,以及能够做到这一点。

1 个答案:

答案 0 :(得分:3)

这是一个非常复杂的问题,答案相当复杂,并且有很多机会出错。正如你在评论中所说,你有经度,像这样的纬度向量:

'0.5x0.5'
np.arange(-89.75,90.25,0.5)      #[-89.75,-89.25,...,89.25,89.75],  latitudes 
np.arange(0.25,360.25,0.5)       #[0.25,0.75,...,359.25,359.75],    longitudes

或者这个:

'1x1'
np.arange(-90.0,91.0,1.0)         #[-90.0,-89.0,...,89.0,90.0],     latitudes 
np.arange(-180.0,180.0,1.0)       #[-180.0,-179.0,...178.0,179.0],  longitudes

您需要将关联的数据集转换为以下格式:

'73x96 (or N48)'
np.arange(-90.0,92.5,2.5)         #[-90.0,-87.5,...,87.5,90.0]      latitudes 
np.arange(0.0,360.00,3.75)        #[0.0,3.75,...,352.5,356.25]      longitudes

或者这个:

'1.25x1.875 (or N96)'
np.array(-90.0,91.25,1.25)        #[-90.0,-88.75,...,90.00]         latitudes 
np.array(0.0,360.00,1.875)        #[0.0,1.875,...,358.125]          longitudes

所有条目均适用于网格单元中心。

部分好消息是您不需要进行任何插值。我们可以通过重复输入来upsample(纵向和纬度),即如果我们有一个1*1间隔数据集,我们可以通过重复每一列将其更改为0.5*0.5间距数据集和行,即使我们使用球形网格数据,这对您的数据也有效!考虑将您的一个初始细胞分成更小的细胞 - 每个新细胞的密度与原始细胞中的密度相同。我们可以这样做:

data_up = np.repeat(data, 2, axis=0)
data_up = np.repeat(data_up, 2, axis=1)

这是一种很好的方法,因为我们不做任何假设,也不会丢失任何数据。我们稍后会需要这个。

当我们通过将细胞加在一起并平均超过细胞数量时,我们可以downsample纵向增加细胞的宽度。这是由于纵向相邻(水平)单元中的区域相等。如果我们downsampling的网格间距不是原始间距的整数倍,那么首先我们必须upsample,如上所述(这是您的要求......)。

最棘手的事情是在纬度上进行下采样。这是因为这里我们有不同的密度,与这些密度相关的实际面积也不同。解决这个问题的方法是:

  1. 以新的纬度网格间距为例,它是我们的初始纬度网格和我们所需的纬度网格的倍数(如上所述)。
  2. 计算每个单元格(this is the formula we need)的单元格表面积。
  3. 将这两个阵列相乘以获得上采样数据阵列中每个数据单元的总发射量。
  4. 将构成新单元的所有总排放单元(在整个阵列上执行此操作)加在一起
  5. 除以新单元格的总面积(子单元格的所有区域的总和),对所有新单元格执行此操作。
  6. 就是这样。
  7. 要注意的不好的事情:

    1. 您的某些数据集之间存在纵向阶段差异,这可能会非常繁琐,以确保您正确地重新定位数据以实现此目的。

    2. 极细胞,latitude = 90 or -90。这些细胞是有问题的,因为它们具有与所有其他细胞一样的纬度高度的一半。必须谨慎地允许:确保为这些单元格计算的区域是正确的,并且当/如果进行上采样时,pole条目应该只重复一半以反映这一点。