簡體   English   中英

如何在Python中從極性立體Grib2文件繪制輪廓

[英]How to plot contours from a polar stereographic grib2 file in Python

我正在嘗試使用matplotlib繪制CMC grib2壓力預測文件以繪制壓力輪廓。 可以在以下位置找到grib2網格的描述: https ://weather.gc.ca/grib/grib2_reg_10km_e.html。 在以下目錄中找到grib2文件: http ://dd.weather.gc.ca/model_gem_regional/10km/grib2/00/000/,並以CMC_reg_PRMSL_MSL_0_ps10km開頭,后跟日期。 這是一個包含平均海平面壓力的文件。

我的問題是我最終得到一些直線輪廓,這些輪廓在實際壓力輪廓的頂部遵循緯度線。 我以為可能是因為我在PlateCarree中繪制而不是Geodetic,但輪廓圖不允許使用Geodetic。 我的情節的結果是: 在此處輸入圖片說明

代碼如下:

import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import datetime as dt
import cartopy
import cartopy.crs as ccrs
import Nio

gr = Nio.open_file('./data/CMC_reg_PRMSL_MSL_0_ps10km_2018111800_P000.grib2', 'r')
print(gr)
names = gr.variables.keys()
print("Variable Names:", names)
dims = gr.dimensions
print("Dimensions: ", dims)
attr = gr.attributes.keys()
print("Attributes: ", attr)

obs = gr.variables['PRMSL_P0_L101_GST0'][:]
lats = gr.variables["gridlat_0"][:]
lons = gr.variables["gridlon_0"][:]

fig = plt.figure(figsize=(15, 2))
intervals = range(95000, 105000, 400)
ax=plt.axes([0.,0.,1.,1.],projection=ccrs.PlateCarree())
obsobj = plt.contour(lons, lats, obs, intervals, cmap='jet',transform=ccrs.PlateCarree())
states_provinces = cartopy.feature.NaturalEarthFeature(
        category='cultural',
        name='admin_1_states_provinces_lines',
        scale='50m',
        facecolor='none')
ax.add_feature(cartopy.feature.BORDERS)
ax.coastlines(resolution='10m')  
ax.add_feature(states_provinces,edgecolor='gray')
obsobj.clabel()
colbar =plt.colorbar(obsobj)

任何建議,將不勝感激。

UPDATE

對於沒有PyNIO的任何人,都可以使用以下注釋部分中的轉儲文件來重現以下內容。

只需刪除所有對NIO的引用,然后將lats,lons,obs分配替換為以下內容即可。

lats = np.load('lats.dump')
lons = np.load('lons.dump')
obs = np.load('obs.dump')

問題

問題在於網格繞着地球纏繞。 因此,網格上將存在-180°的點,其最近的鄰居位於+ 180°,即網格環繞了子午線。 下面沿着兩個方向繪制網格索引。 可以看到第一個網格行(黑色)出現在圖的兩側。

在此處輸入圖片說明

因此,沿着太平洋西行的輪廓線需要直接穿過地塊,然后繼續朝該地另一側的日本前進。 這將導致不必要的行

在此處輸入圖片說明

一個解法

一種解決方案是將PlateCarree的外部點掩蓋掉。 這些發生在網格的中間。 在大於179°或小於-179°的經度坐標處切割網格,並且不讓北極

在此處輸入圖片說明

藍色代表切出點。

將其應用於等高線圖可以得到:

import matplotlib.pyplot as plt
import numpy as np
import cartopy
import cartopy.crs as ccrs

lats = np.load('data/lats.dump')
lons = np.load('data/lons.dump')
obs = np.load('data/obs.dump')

intervals = range(95000, 105000, 400)

fig, ax = plt.subplots(figsize=(15,4), subplot_kw=dict(projection=ccrs.PlateCarree()))
fig.subplots_adjust(left=0.03, right=0.97, top=0.8, bottom=0.2)

mask = (lons > 179) | (lons < -179) | (lats > 89)
maskedobs = np.ma.array(obs, mask=mask)

pc = ax.contour(lons, lats, maskedobs, intervals, cmap='jet', transform=ccrs.PlateCarree())

ax.add_feature(cartopy.feature.BORDERS)
ax.coastlines(resolution='10m')  

colbar =plt.colorbar(pc)

plt.show()

在此處輸入圖片說明

如果您將經度加+180以避免負坐標,則您的代碼應正在運行。 從我的角度來看,坐標轉換應該是合法的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM