1

我正在尝试使用 Geoviews 绘制 WRF 输出。WRF 输出文件包含纬度和经度信息,它们都是二维数组。

所以我目前正在尝试的是:

  1. 使用 Cartopy 的投影定义,计算一维 x/y 坐标
  2. 修改 myxr.Dataset使其具有这些 1D x/y 坐标
  3. gv.Dataset从中创建一个xr.Dataset,提供 WRF crs(这是 Lambert Conformal,顺便说一句)
  4. gv.Image从中绘制一个gv.Dataset

xr.Dataset看起来像这样:

<xarray.Dataset>
Dimensions:       (Time: 48, low_mid_high: 3, south_north: 210, west_east: 210)
Coordinates:
  * Time          (Time) datetime64[ns] 2016-08-22 2016-08-22T00:30:00 ...
  * low_mid_high  (low_mid_high) <U4 'low' 'mid' 'high'
  * south_north   (south_north) float64 -3.7e+06 -3.699e+06 -3.698e+06 ...
  * west_east     (west_east) float64 6.629e+06 6.627e+06 6.626e+06 ...
Data variables:
    cloudfrac     (low_mid_high, Time, south_north, west_east) float32 0.533683 ...

我的代码如下所示:

import geoviews as gv
import wrf
import xarray as xr

cldfrac = xr.open_dataset(FILENAME)

# create the ccrs object for the WRF projection
prj = wrf.get_cartopy(cldfrac._file_obj.ds)

# calculate x/y in Lambert Conformal proj,
# drop original XLONG/XLAT
cldfrac = ASSIGN_XY_COORDS(cldfrac)

geo_dims = ['south_north', 'west_east']
kdims = ['low_mid_high', 'south_north', 'west_east', 'Time']
vdims = ['cloudfrac']

dataset = gv.Dataset(cldfrac, kdims=kdims, vdims=vdims, crs=prj)
dataset.to(gv.Image, geo_dims, crs=ccrs.PlateCarree())

确实得到了一个结果,但是它不是在经度/纬度投影中,而是在原始的 Lambert Conformal 中,意思是 ysouth_northwest_eastx 轴。

根据Geoviews 网站

两个后端都可以通过大多数 GeoViews 对象的 crs 参数在任何受支持的投影中使用传入数据。

如何在图像中将经度/纬度作为 x 和 y 轴?

编辑:如果可能的话,我更喜欢使用 Bokeh 后端。实际上,我并不关心刻度标签,但图中的投影是错误的:当 x/y 轴代表 lon/lat 时,如 WebMercator 投影中,并在gv.Image()调用中使用我的 LambertConformal 数据投影,我希望图像的区域为非正方形(在北半球,上边缘的左右距离应大于图像范围的下边缘)。

4

0 回答 0