我正在使用MODIS主动火灾数据(数据分辨率为1千米)。在从中获得有意义的信息后,我有一个大小为的数组(72 x4797 x4797)[时间x纬度x长度],并啮合了(4797 × 4797)和长(4797 × 4797).纬度网格从40 N减小到0,均匀dy为0.0108,使得网格的值在行中变化,而每列相同.然而,经度网格的值在行和列中变化,我猜这是因为对于每个纬度,经度的值由于卫星条带而不同。
我的目标是在WRF网格(纬度129 x经度109,分辨率为30公里)上获得这些数据。数据中包含所有无火点的NaN值和活跃火点的值。使用griddata的Scipy插值返回所有NaN的数组,由于所有信息都丢失了,因此该数组没有任何用处。
为了在新纬度上获得粗分辨率数据,我尝试使用最近邻法,例如,如果细网格中存在多个活跃火灾,则将该纬度分配给最近的粗网格纬度,同时取粗网格正方形中所有此类点的平均值。
在下面的代码中,
- lon_wrf、lat_wrf是粗略分辨率下感兴趣的新经度和纬度。
- lon_mosaic和lat_mosaic都是高分辨率的经度和纬度的二维数组。
- Block_OC_day是将在较新的粗分辨率上制作的2-D阵列。
我首先找到所有不是NaN的火灾位置,并提取这些位置的lon和lat。接下来,我在目标网格中找到最近的lon和lat。函数给我索引和值。接下来,我想对目标网格中具有相同lat-lon的所有点的Block_OC_day值取平均值。
lat_1d = lat_mosaic[:,0] # making 2-D latitude mesh to 1-D
fire_loc = np.argwhere(~np.isnan(Block_OC_day)) # finding all locations with non-NaN
fire_lat = lat_1d[fire_loc[:,0]] # finding latitude of fine resolution
fire_lon = lon_mosaic[fire_loc[:,0],fire_loc[:,1]] # finding longitue of fine resolution
# Function to find nearest values and index
def nearest(value_to_search,lookup_array):
'''Finds nearest value and index closest to a value in an array'''
idx = np.argmin(np.abs(lookup_array-value_to_search))
closest_value = lookup_array[idx]
return closest_value, idx
# Storing target latitude and index
va_lat = []
li_lat = []
for i in range(0,len(fire_lat)):
a, idx = nearest(fire_lat[i],lat_wrf)
va_lat.append(a)
li_lat.append(idx)
# storing target longitude and index
va_lon = []
li_lon = []
for i in range(0,len(fire_lon)):
a, idx = nearest(fire_lon[i],lon_wrf)
va_lon.append(a)
li_lon.append(idx)
1条答案
按热度按时间eulz3vhy1#
我已经找到了解决这个问题的方法,它包括找出纬度和经度的公共指数,然后用细网格中所有点的平均值来填充它们。
可能有更好的解决方案,但此代码工作正常。