如何在LambertConformal投影中绘制数据

时间:2017-03-21 15:30:39

标签: python projection holoviews geoviews

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

所以我现在正在尝试的是:

  1. 使用Cartopy中的投影定义,计算1D x / y坐标
  2. 修改我的xr.Dataset,使其具有这些1D x / y坐标
  3. 从此gv.Dataset创建xr.Dataset,提供WRF crs(这是Lambert Conformal,btw)
  4. 从此gv.Image
  5. 中绘制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中,意味着south_northwest_east是y和x轴。

    根据the Geoviews website

      

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

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

    编辑:如果可能的话,我更愿意使用Bokeh后端。实际上,我并不关心刻度标签,但绘图中的投影是错误的:当x / y轴表示lon / lat时,如在WebMercator投影中,并使用我的LambertConformal数据在gv.Image()调用中投影,我预计图像的区域是非正方形的(在北半球的上边缘处与左边缘相比,图像范围的下边缘应该更大)。

0 个答案:

没有答案