Python 3.x 使用Cartopy和Pyproj重新投影GOES16卫星数据

Python 3.x 使用Cartopy和Pyproj重新投影GOES16卫星数据,python-3.x,cartopy,satellite-image,pyproj,scitools,Python 3.x,Cartopy,Satellite Image,Pyproj,Scitools,我正在尝试使用cartopy或pyproj重新投影GOES16全磁盘图像。我想把它放到另一个投影中。对于这个例子,我尝试将其重新投影到Mercator。然而,当我运行代码时,我得到了一个完整的数据全局图像,它不是墨卡托投影,也没有任何cartopy特性。我觉得我错过了一个简单的步骤,但却不知道它到底是什么。下面是一个可复制的示例—我正在使用Python 3.5 import matplotlib import matplotlib.pyplot as plt from siphon.catalo

我正在尝试使用cartopy或pyproj重新投影GOES16全磁盘图像。我想把它放到另一个投影中。对于这个例子,我尝试将其重新投影到Mercator。然而,当我运行代码时,我得到了一个完整的数据全局图像,它不是墨卡托投影,也没有任何cartopy特性。我觉得我错过了一个简单的步骤,但却不知道它到底是什么。下面是一个可复制的示例—我正在使用Python 3.5

import matplotlib
import matplotlib.pyplot as plt
from siphon.catalog import TDSCatalog, get_latest_access_url
import numpy as np
from datetime import datetime, timedelta
import cartopy.crs as ccrs
import cartopy.feature as cfeature

# query data
nowdate = datetime.utcnow()
cat = TDSCatalog('http://thredds-jumbo.unidata.ucar.edu/thredds/catalog/satellite/goes16/GOES16/Products/SeaSurfaceTemperature/FullDisk/' + \
                  str(nowdate.year) + str("%02d"%nowdate.month) + str("%02d"%nowdate.day) + '/catalog.xml')
dataset_name = sorted(cat.datasets.keys())[-1]
dataset = cat.datasets[dataset_name]

# load netcdf and read variables
nc = dataset.remote_access()
sst = np.array(nc.variables['SST'][:,:])
sst[np.isnan(sst)] = -1
sst = np.ma.array(sst)
sst[sst < 0] = np.ma.masked

X = nc.variables['x'][:]
Y = nc.variables['y'][:]

# define projections
proj_var = nc.variables['goes_imager_projection']
globe = ccrs.Globe(ellipse='sphere', semimajor_axis=proj_var.semi_major_axis,
                   semiminor_axis=proj_var.semi_minor_axis)

# define reprojection target
proj = ccrs.Mercator(central_longitude=proj_var.longitude_of_projection_origin, 
                     latitude_true_scale=proj_var.latitude_of_projection_origin,
                     globe=globe)

# Plot
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(1, 1, 1, projection=proj)
ax.coastlines(resolution='50m', color='black')
ax.add_feature(cfeature.STATES, linestyle=':', edgecolor='black')
ax.add_feature(cfeature.BORDERS, linewidth=2, edgecolor='black')
im = ax.imshow(sst, extent=(X.min(), X.max(), Y.min(), Y.max()), origin='upper')


# try again, this time with pyproj
from pyproj import Proj     
p = Proj(proj='geos', h=proj_var.perspective_point_height, lon_0=proj_var.longitude_of_projection_origin, sweep=proj_var.sweep_angle_axis)

X = nc.variables['x'][:] * proj_var.perspective_point_height
Y = nc.variables['y'][:] * proj_var.perspective_point_height
XX, YY = np.meshgrid(X,Y)
lons, lats = p(XX, YY, inverse=True)

fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(1, 1, 1, projection=proj)
ax.coastlines(resolution='50m', color='black')
ax.add_feature(cfeature.STATES, linestyle=':', edgecolor='black')
ax.add_feature(cfeature.BORDERS, linewidth=2, edgecolor='black')
im = ax.imshow(sst, extent=(lons.min(), lons.max(), lats.min(), lats.max()), origin='upper')
导入matplotlib
将matplotlib.pyplot作为plt导入
从虹吸.catalog导入TDSCatalog,获取最新的访问地址
将numpy作为np导入
从datetime导入datetime,timedelta
将cartopy.crs作为CCR导入
将cartopy.feature导入为cfeature
#查询数据
nowdate=datetime.utcnow()
cat=TDSCatalog('http://thredds-jumbo.unidata.ucar.edu/thredds/catalog/satellite/goes16/GOES16/Products/SeaSurfaceTemperature/FullDisk/' + \
str(nowdate.year)+str(“%02d”%nowdate.month)+str(“%02d”%nowdate.day)+'/catalog.xml')
dataset_name=sorted(cat.dataset.keys())[-1]
dataset=cat.datasets[数据集名称]
#加载netcdf并读取变量
nc=数据集。远程访问()
sst=np.array(nc.variables['sst'][:,:])
海温[np.isnan(海温)]=-1
sst=np.ma.阵列(sst)
sst[sst<0]=np.ma.屏蔽
X=nc.变量['X'][:]
Y=nc.变量['Y'][:]
#定义投影
项目变量=nc.variables['goes\u imager\u projection']
地球仪=ccrs.地球仪(椭圆=球体),半长轴=项目半长轴,
半短轴=项目变量半短轴)
#定义重投影目标
项目=ccrs.Mercator(中心经度=项目变量经度,投影原点),
纬度?真实?刻度=投影?原点的项目?变量?纬度,
地球仪=地球仪)
#密谋
图=plt.图(图尺寸=(10,10))
ax=图add_子批次(1,1,1,投影=项目)
最大海岸线(分辨率为50m,颜色为黑色)
ax.add_特征(cfeature.STATES,线型=':',边色='black')
ax.add_特征(cfeature.BORDERS,线宽=2,edgecolor='black')
im=ax.imshow(sst,区段=(X.min(),X.max(),Y.min(),Y.max()),原点='upper')
#请再试一次,这次使用pyproj
从pyproj导入项目
p=Proj(Proj='geos',h=Proj_变量透视图_点_高度,lon_0=Proj_变量经度_投影图_原点,sweep=Proj_变量扫描角_轴)
X=nc.变量['X'][:]*项目变量透视图\点高度
Y=nc.变量['Y'][:]*项目变量透视图\点高度
二十、 YY=np.网格(X,Y)
lons,lats=p(XX,YY,逆=True)
图=plt.图(图尺寸=(10,10))
ax=图add_子批次(1,1,1,投影=项目)
最大海岸线(分辨率为50m,颜色为黑色)
ax.add_特征(cfeature.STATES,线型=':',边色='black')
ax.add_特征(cfeature.BORDERS,线宽=2,edgecolor='black')
im=ax.imshow(sst,区段=(lons.min(),lons.max(),lats.min(),lats.max()),原点='upper')

您的方法是正确的,但您必须使用pcolormesh而不是imshow

这应该起作用:

from datetime import datetime
import cartopy.feature as cfeature
from siphon.catalog import TDSCatalog
import matplotlib.pyplot as plt
from matplotlib import patheffects
import metpy
from metpy.plots import colortables
import xarray as xr
from xarray.backends import NetCDF4DataStore

%matplotlib inline

nowdate = datetime.utcnow()
cat = TDSCatalog('http://thredds-jumbo.unidata.ucar.edu/thredds/catalog/satellite/goes16/GOES16/Products/SeaSurfaceTemperature/FullDisk/' + \
                  str(nowdate.year) + str("%02d"%nowdate.month) + str("%02d"%nowdate.day) + '/catalog.xml')
dataset_name = sorted(cat.datasets.keys())[-1]
dataset = cat.datasets[dataset_name]
ds = dataset.remote_access(service='OPENDAP')
ds = NetCDF4DataStore(ds)
ds = xr.open_dataset(ds)


dqf = ds.metpy.parse_cf('DQF')
dat = ds.metpy.parse_cf('SST')
proj = dat.metpy.cartopy_crs

dat = dat.where(dqf == 0)
dat = dat.where(dat.variable > 274)
dat = dat.where(dat.variable < 310)
dat = dat - 273.15
# Plot in Mercator
import cartopy.crs as ccrs
newproj = ccrs.Mercator()


fig = plt.figure(figsize=[12, 12], dpi=100)
ax = fig.add_subplot(1,1,1, projection=newproj)
im = ax.pcolormesh(dat['x'], dat['y'], dat, cmap='jet', transform=proj, vmin=-2, vmax=38)
ax.set_extent((dat['x'].min() + 4000000, dat['x'].max()- 3200000, dat['y'].min()+ 5500000, dat['y'].max()- 650000), crs=proj)
从日期时间导入日期时间
将cartopy.feature导入为cfeature
从虹吸目录导入TDSCatalog
将matplotlib.pyplot作为plt导入
从matplotlib导入patheffects
进口麦蒂
从metpy.plots导入颜色表
将xarray作为xr导入
从xarray.backends导入NetCDF4DataStore
%matplotlib内联
nowdate=datetime.utcnow()
cat=TDSCatalog('http://thredds-jumbo.unidata.ucar.edu/thredds/catalog/satellite/goes16/GOES16/Products/SeaSurfaceTemperature/FullDisk/' + \
str(nowdate.year)+str(“%02d”%nowdate.month)+str(“%02d”%nowdate.day)+'/catalog.xml')
dataset_name=sorted(cat.dataset.keys())[-1]
dataset=cat.datasets[数据集名称]
ds=dataset.remote_访问(service='OPENDAP')
ds=NetCDF4数据存储(ds)
ds=xr.打开数据集(ds)
dqf=ds.metpy.parse\u cf('dqf')
dat=ds.metpy.parse\u cf('SST'))
项目=dat.metpy.cartopy\U crs
dat=dat,其中(dqf==0)
dat=dat.其中(dat.变量>274)
dat=dat.其中(dat.变量<310)
dat=dat-273.15
#墨卡托绘图
将cartopy.crs作为CCR导入
newproj=ccrs.Mercator()
图=plt.图(figsize=[12,12],dpi=100)
ax=图add_子批次(1,1,1,投影=新项目)
im=ax.pcolormesh(dat['x'],dat['y'],dat,cmap='jet',transform=proj,vmin=-2,vmax=38)
最大设置范围((数据['x'].min()+4000000,数据['x'].max()-3200000,数据['y'].min()+5500000,数据['y'].max()-650000),crs=proj)