我正在使用Pygrib,试图使用NBM grib数据(如果有帮助,可以使用here)获得特定经纬度坐标的表面温度。
我一直在尝试获得一个索引值,以用于特定纬度和经度的代表性数据。我能够导出一个索引,但问题是纬度和经度似乎各有2个坐标。我将使用佛罗里达州迈阿密(25.7617° N,80.1918° W)作为示例来说明这一点。如果提供grib文件,则将被视为最小可复制。
def get_grib_data(self, gribfile, shortName):
grbs = pygrib.open(gribfile)
# Temp needs level specified
if shortName == '2t':
grib_param = grbs.select(shortName=shortName, level=2)
# Convention- use short name for less than 5 chars
# Else, use name
elif len(shortName) < 5:
grib_param = grbs.select(shortName=shortName)
else:
grib_param = grbs.select(name=shortName)
data_values = grib_param[0].values
# Need varying returns depending on parameter
grbs.close()
if shortName == '2t':
return data_values, grib_param
else:
return data_values
# This function is used to find the closest lat/lon value to the entered one
def closest(self, coordinate, value):
ab_array = np.abs(coordinate - value)
smallest_difference_index = np.amin(ab_array)
ind = np.unravel_index(np.argmin(ab_array, axis=None), ab_array.shape)
return ind
def get_local_value(data, j, in_lats, in_lons, lats, lons):
lat_ind = closest(lats, in_lats[j])
lon_ind = closest(lons, in_lons[j])
print(lat_ind[0])
print(lat_ind[1])
print(lon_ind[0])
print(lon_ind[1])
if len(lat_ind) > 1 or len(lon_ind) > 1:
lat_ind = lat_ind[0]
lon_ind = lon_ind[0]
dtype = data[lat_ind][lon_ind]
else:
dtype = data[lat_ind][lon_ind]
return dtype
if __name__ == '__main__':
tfile = # Path to grib file
temps, param = grib_data.get_grib_data(tfile, '2t')
lats, lons = param[0].latlons()
j = 0
in_lats = [25.7617, 0 , 0]
in_lons = [-80.198, 0, 0]
temp = grib_data.get_local_value(temps, j, in_lats, in_lons, lats, lons)
字符串
当我打印列表时,我得到以下索引:
lat_ind[0]: 182
lat_ind[1]: 1931
lon_ind[0]: 1226
lon_ind[1]: 1756
型
因此,如果我的lat/lon是一维的,我只需要执行temp = data[lat[0]][lon[0]],但在这种情况下,这将给予非代表性的数据。我如何处理lat/lon是二维坐标的事实?我已经验证了lats[lat_ind[0][lat_ind 1]给出输入纬度,经度也是如此。
2条答案
按热度按时间ar7v8xwq1#
您不能独立于坐标系来评估纬度的“接近程度”-您必须评估坐标对与输入坐标的接近程度。
Lat/Lon实际上只是球坐标。给定两个点(lat 1,lon 1)(lat 2,lon 2),接近度(用大圆表示)由这两个点之间的球向量之间的Angular 给出(近似地球为球体)。
你可以通过构造这两个点的笛卡尔向量,并取点积来计算,也就是a * b * cos(theta),其中theta是你想要的。
字符串
编辑:或者使用插值。
型
虚拟数据插值示例:
型
raogr8fs2#
我知道这是一个老问题,但我想把它作为一个简单得多的答案,通过最小化x和y的距离,给予你所需要的:
字符串
lats和隆恩应该是lats和隆恩的网格,lat_to_find和lon_to_find是要在数组中查找的lat/lon对。然后你有你的索引,你可以快速索引任何你需要的变量。