1

我正在创建 HRRR 模型输出的横截面,我已经使用 xarray 和 pynio 作为引擎读取了 grib 文件,然后将这些文件转换为 netcdf,以便我可以在我的 Windows 机器上使用它们,因此我想知道这是否导致这些问题。

这是使用 xarray 读取 netcdf 后我的数据集的样子:Imgur

读入数据后,我尝试通过解析数据来遵循 Metpy 横截面/ Xarray 教程:

data = ds.metpy.parse_cf()

这产生了这个新数据集:Imgur 它创建了 crs 坐标,所以我认为它工作得有些正确。

在此之后,我创建了一个 700mb RH、风和海拔(不同的数据集)的等高线图,我从数据集中解析了 RH 并提取了 x 和 y

RH = data.metpy.parse_cf('RH_P0_L100_GLC0')
x, y = RH.metpy.coordinates('x', 'y')

这一切都奏效了,我可以制作一个漂亮的情节没问题。所以接下来我想做一个横截面。按照文档中的示例:

start = (40.3847, -120.5676)
end = (39.2692, -122.3784)
cross = cross_section(data, start, end)

这给出了这些错误:Imgur

所以我改为尝试使用上面的 RH 变量,因为

RH.metpy.x 

给出了 x 维度。但是跑步

cross = cross_section(RH, start, end)

而是给出了这个错误:Imgur

所以我只是想知道我是否错过了解析原始数据集的步骤,或者 grib 到 netcdf 的转换是否搞砸了,或者这是否可以使用metpy?

一般来说,我只是在努力创建一个类似于示例中的横截面:https ://unidata.github.io/MetPy/latest/examples/cross_section.html#sphx-glr-examples-cross-section-py

作为一个额外的问题,是否可以在地块下填充地形?

4

2 回答 2

1

目前,MetPy 的横截面插值依赖于 Dataset/DataArray 中存在的 x 和 y 维度作为维度坐标(请参阅此处xarray 文档中的描述)。ygrid_0在您的数据集中, 和 的 x和y 维度xgrid_0被列为没有坐标的维度,因此存在问题。

但是,由于这种情况在气象数据文件中很常见,因此 MetPy 目前的实现可能过于严格。我建议在MetPy 的问题跟踪器上打开一个问题。

关于你的额外问题,只要你的地形水平数据与你的数据在同一垂直坐标下,你可以使用fill_between()matplotlib 中的方法在地块下填充地形。

于 2019-02-06T14:31:04.400 回答
0

我有几乎同样的问题。

ValueError:数据缺少所需的坐标信息。验证您的数据是否已由 MetPy 使用正确的 x 和 y 维度坐标进行解析,并为每个变量添加了正确投影的 crs 坐标。

如果我试试这个:

cross = cross_section(data, start, end)

xarray 看起来像这样:

<xarray.Dataset>
Dimensions:           (bnds: 2, height: 61, height_2: 1, height_3: 60, height_4: 61, height_5: 1, lat: 101, lev: 1, lev_2: 1, lev_3: 1, lon: 121, time: 24)
Coordinates:
  * height            (height) float64 1.0 2.0 3.0 4.0 ... 58.0 59.0 60.0 61.0
  * height_3          (height_3) float64 1.0 2.0 3.0 4.0 ... 57.0 58.0 59.0 60.0
  * lev               (lev) float64 0.0
  * lev_2             (lev_2) float64 400.0
  * lev_3             (lev_3) float64 800.0
  * lon               (lon) float64 -30.0 -29.5 -29.0 -28.5 ... 29.0 29.5 30.0
  * lat               (lat) float64 -10.0 -9.5 -9.0 -8.5 ... 38.5 39.0 39.5 40.0
    crs               object Projection: latitude_longitude
  * height_2          (height_2) float64 10.0
  * time              (time) float64 2.017e+07 2.017e+07 ... 2.017e+07 2.017e+07
  * height_4          (height_4) float64 1.0 2.0 3.0 4.0 ... 58.0 59.0 60.0 61.0
  * height_5          (height_5) float64 2.0
Dimensions without coordinates: bnds
Data variables:
    height_bnds       (height, bnds) float64 ...
    height_3_bnds     (height_3, bnds) float64 ...
    lev_bnds          (lev, bnds) float64 ...
    lev_2_bnds        (lev_2, bnds) float64 ...
    lev_3_bnds        (lev_3, bnds) float64 ...
    z_ifc             (height, lat, lon) float32 ...
    topography_c      (lat, lon) float32 ...
    fis               (lat, lon) float32 ...
    con_gust          (time, height_2, lat, lon) float32 ...
    gust10            (time, height_2, lat, lon) float32 ...
    u                 (time, height_3, lat, lon) float32 ...

我的意思是有一个 lat lon 网格......有没有一种解决方法可以将 cross_section 用于 lat lon 网格?或者我可以将 lat lon 重命名为 x 和 y 吗?

最好的

于 2020-04-21T11:48:03.573 回答