Python 将GOES-16地球静止数据投影到平板Carree Cartopy中

Python 将GOES-16地球静止数据投影到平板Carree Cartopy中,python,netcdf,cartopy,Python,Netcdf,Cartopy,我正在拼命地将一些地球静止数据从GOES-16 netCDF文件投影到另一个投影。我可以让背景图重新投影,但似乎无法获得数据 我还不太精通这一点,但到目前为止我已经做到了: 通过NetCDF4读取数据: from netCDF4 import Dataset nc = Dataset('OR_ABI-L1b-RadF- M3C13_G16_s20182831030383_e20182831041161_c20182831041217.nc') data = nc.variables[

我正在拼命地将一些地球静止数据从GOES-16 netCDF文件投影到另一个投影。我可以让背景图重新投影,但似乎无法获得数据

我还不太精通这一点,但到目前为止我已经做到了:

通过NetCDF4读取数据:

from netCDF4 import Dataset
nc = Dataset('OR_ABI-L1b-RadF- 
    M3C13_G16_s20182831030383_e20182831041161_c20182831041217.nc')

data = nc.variables['Rad'][:]
在这里,我试图获得地球静止信息:

sat_h = nc.variables['goes_imager_projection'].perspective_point_height
X = nc.variables['x'][:] * sat_h
Y = nc.variables['y'][:] * sat_h

# Satellite longitude
sat_lon = 
    nc.variables['goes_imager_projection'].longitude_of_projection_origin

# Satellite sweep
sat_sweep = nc.variables['goes_imager_projection'].sweep_angle_axis
这里我从.nc文件中获取投影数据:

proj_var = nc.variables['goes_imager_projection']

sat_height = proj_var.perspective_point_height
central_lon = proj_var.longitude_of_projection_origin
semi_major = proj_var.semi_major_axis
semi_minor = proj_var.semi_minor_axis
print proj_var

<type 'netCDF4._netCDF4.Variable'>
int32 goes_imager_projection()
    long_name: GOES-R ABI fixed grid projection
    grid_mapping_name: geostationary
    perspective_point_height: 35786023.0
    semi_major_axis: 6378137.0
    semi_minor_axis: 6356752.31414
    inverse_flattening: 298.2572221
    latitude_of_projection_origin: 0.0
    longitude_of_projection_origin: -75.0
    sweep_angle_axis: x
unlimited dimensions: 
current shape = ()
filling on, default _FillValue of -2147483647 used
每个人都玩得很好的画面:

当我试着得到一个盘子投影时,我试着:

proj = ccrs.PlateCarree(central_longitude=central_lon,globe=globe)
以及我失败的形象:

我尝试过在imshow方法中处理范围,我尝试过添加一个

transform=proj 
在imshow中,没有运气,它只是挂断了,我必须重新启动内核

很明显,这是我缺乏理解。如果有人能快速、方便地帮助/解释我想改变对地静止轨道的预测方式,我将不胜感激

我在运行古老的蟒蛇2

谢谢你的关注


编辑:多亏了DopplerShift和ajdawson的洞察力,问题似乎得以解决。我想我可能有点不耐烦/不知道完整磁盘转换需要多长时间

看起来您需要为imshow指定transform关键字。这个关键字告诉cartopy数据所在的坐标,在这种情况下,坐标应该是地球静止的

我没有你的数据集,所以我无法测试,但下面的代码片段说明了这个概念。投影和变换是独立的,因此您应该同时定义两者。对于数据集,变换参数(
crs
在下面的示例中)的值是固定的,但投影可以是您喜欢的任何值(包括与
crs
相同的值)

请参见重新投影地球静止图像的示例:。另请参见此处的投影和转换参数指南:


我也试过了,但仍然使内核冻结。它一定与我的python设置有关,因为我已经完全按照您的建议进行了尝试,甚至在这里提出问题之前……您确定在传递transform=proj时它会挂断吗?您使用的完整磁盘映像非常大,Cartopy中的映像扭曲可能需要大量计算。我打赌这个操作很容易需要10分钟到一个小时。我确实考虑过这个问题,但我很确定当我尝试一部分数据时,它会被搁置一段时间,我不能只进行键盘中断,所以我认为它完全挂断了。今天早上,我用一个CONUS lat/lon ax.extent再次尝试了一次,现在它似乎只运行了几秒钟。感谢您一如既往地提供DopplerShift,您在许多场合帮助了我。@MethaneClouds我遇到了同样的问题。你能详细介绍一下在几秒钟内运行的最终解决方案吗?或者你是说,整个磁盘转换只需要永远,你基本上只是切换到康纳斯?
transform=proj 
globe = ccrs.Globe(semimajor_axis=semi_major, semiminor_axis=semi_minor)
crs = ccrs.Geostationary(central_longitude=central_lon, 
                         satellite_height=sat_height, globe=globe)
proj = ccrs.PlateCarree(central_longitude=central_lon, globe=globe)

ax = fig.add_subplot(1, 1, 1, projection=proj)

IR_img = ax.imshow(data[:,:], origin='upper',
                   extent=(X.min(), X.max(), Y.min(), Y.max()),
                   transform=crs,
                   cmap=IR_cmap,
                   interpolation='nearest', vmin=162., vmax=330.)