看起来这将是一些简单的事情,可以修复我的代码,但我认为我现在只是看了太多代码,需要重新审视它。我只是想引入一个我从 NCEP 下载的用于 HRRR 模型的 Grib2 文件。根据他们的信息,网格类型是 Lambert Conformal,角的纬度范围为 (21.13812, 21.14055, 47.84219, 47.83862),角的经度范围为 (-122.7195, -72.28972, -60.91719, -134.0955)模型域。
在尝试放大我感兴趣的区域之前,我只想简单地在适当的 CRS 中显示图像,但是当我尝试为模型的域执行此操作时,我得到边界和海岸线落在该范围内,但实际图像从 Grib2 文件生成的只是放大了。我尝试使用 extent=[ my domain extent ] 但它似乎总是使我正在测试它的笔记本崩溃。这是我的代码和我从中获得的相关图像。
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy
from mpl_toolkits.basemap import Basemap
from osgeo import gdal
gdal.SetConfigOption('GRIB_NORMALIZE_UNITS', 'NO')
plt.figure()
filename='C:\\Users\\Public\\Documents\\GRIB\\hrrr.t18z.wrfsfcf00.grib2'
grib = gdal.Open(filename, gdal.GA_ReadOnly)
z00 = grib.GetRasterBand(47)
meta00 = z00.GetMetadata()
band_description = z00.GetDescription()
bz00 = z00.ReadAsArray()
latitude_south = 21.13812 #38.5
latitude_north = 47.84219 #50
longitude_west = -134.0955 #-91
longitude_east = -60.91719 #-69
fig = plt.figure(figsize=(20, 20))
title= meta00['GRIB_COMMENT']+' at '+meta00['GRIB_SHORT_NAME']
fig.set_facecolor('white')
ax = plt.axes(projection=ccrs.LambertConformal())
ax.add_feature(cartopy.feature.BORDERS, linestyle=':')
ax.coastlines(resolution='110m')
ax.imshow(bz00,origin='upper',transform=ccrs.LambertConformal())
plt.title(title)
plt.show()
如果我改变:
ax = plt.axes(projection=ccrs.LambertConformal()
至
ax = plt.axes(projection=ccrs.LambertConformal(central_longitude=-95.5,
central_latitude=38.5,cutoff=21.13)
我得到了我的边界,但我的实际数据没有对齐,它创建了我正在配音的蝙蝠侠情节。
即使我放大域并且仍然存在我的边界,也会出现类似的问题。Grib 文件中的基础数据不会更改为与我要获取的内容相对应。
因此,正如我已经说过的那样,这可能是一个简单的解决方法,但我只是错过了,但如果没有,很高兴知道我正在搞砸的哪个步骤或哪个过程,我可以从中学习,以便我以后不要这样做!
更新 1: 我添加并更改了一些代码,现在只显示图像而不显示边界和海岸线。
test_extent = [longitude_west,longitude_east,latitude_south,latitude_north]
ax.imshow(bz00,origin='upper',extent=test_extent)
这给了我下图。 看起来与图 1 完全相同。
我注意到的另一件事可能是所有这一切的根本原因是,当我打印出价值时plt.gca().get_ylim()
,plt.gca().get_xlim()
我会根据所显示的内容获得截然不同的值。