问题描述
我正在尝试使用cartopy在地图上绘制一些风向图。但是,风看起来很奇怪,所以我在75N的点环上使用风矢量进行了简单测试。风矢量应指向两个纬度/经度网格成45度角,因为在立体投影下u风和v风的大小相同,应保持该角度。
from matplotlib import pyplot as plt
import numpy as np
import cartopy.crs as ccrs
pcproj = ccrs.PlateCarree()
lon0 = -150
mapproj = ccrs.Stereographic(
central_longitude=lon0,central_latitude=75,true_scale_latitude=75,)
XLIM = 300e3; YLIM=300e3
dm =5; dp=1
fig = plt.figure(0,(7,7))
ax = fig.add_axes([0.1,0.1,0.85,0.9],projection=mapproj)
ax.set_extent([-XLIM,XLIM,-YLIM,YLIM],crs=mapproj)
ax.coastlines(resolution='50m',color='.5',linewidth=1.5)
lon_grid = np.arange(-180,181,dm)
lat_grid = np.arange(-80,86,dp)
gl = ax.gridlines(draw_labels=True,xlocs=lon_grid,ylocs=lat_grid,x_inline=False,y_inline=False,color='k',linestyle='dotted')
# --- draw 45 degree winds at 75N
lon = np.linspace(0,360,73)
lat = np.ones(len(lon))*75
uu = np.ones(len(lon))*10
vv = uu*1.
pts = mapproj.transform_points(pcproj,lon,lat)
xx = pts[...,0]; yy = pts[...,1]
ux,vx = mapproj.transform_vectors(pcproj,lat,uu,vv)
ax.quiver(xx,yy,ux,vx,transform=mapproj)
很明显,风向并非与纬度/经度网格成45度角。
我在投影中心150W和75N下检查ux
,vx
。这里的风应该与经/纬网格中的风相同,但应为(3.54,13.7)而不是(10,10)。
风向看起来与使用这条线相同
ax.quiver(lon,vv,transform=pcproj)
这可能不足为奇,因为我认为箭袋在引擎盖下使用transform_vector
和transform_points
。
我尝试沿纬度/经度网格方向风,它们正确地转换了。
这是transform_vectors
中的错误还是我使用不正确?
更新:
正如@swatchai所建议的那样,现在,在将u-wind馈入cos(lat)
之前,应将其除以transform_vectors
。我怀疑这是预期的行为,但是应该使用此归一化方法,直到以后的cartopy更新更改行为为止。他们可以选择仅更新文档字符串。不过,在未来的cartopy更新中要注意一些事情。
解决方法
使用(纬度,长度)度数时,球面上的小角距{{1}}有两个分量:
ds
其中R是地球半径,
第二部分随所考虑位置`R*dlat` in NS direction
`R*dlon*cos(lat)` in EW direction
的不同而变化
请牢记,latitude
,ux
在纬度75度的计算应为
vx