cartopy 旋转风不正确?
cartopy rotate winds incorrectly?
我正在尝试使用 cartopy 在地图上绘制一些风向量。然而,风看起来很奇怪,所以我在 75N 的一圈点上使用风矢量进行了简单测试。风矢量应与两个 lat/lon 网格成 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,lon,lat,uu,vv)
ax.quiver(xx,yy,ux,vx,transform=mapproj)
很明显,风矢量没有指向 lat/lon 网格 45 度。
我检查了投影中心 150W 和 75N 处的 ux
、vx
。这里的风应该与 lat/lon 网格中的相同,但它是 (3.54,13.7) 而不是 (10,10)。
风向量看起来和使用这条线一样
ax.quiver(lon,lat,uu,vv,transform=pcproj)
这可能并不令人惊讶,因为我认为 quiver 在底层使用了 transform_vector
和 transform_points
。
我尝试了沿 lat/lon 网格方向的风,它们被正确地转换了。
这是 transform_vectors
中的错误还是我使用不正确?
更新:
正如@swatchai 所建议的那样,现在,u-wind 应该在输入 transform_vectors
之前除以 cos(lat)
。我怀疑这是预期的行为,但应该使用这种规范化,直到未来的 cartopy 更新改变了行为。他们可能会选择只更新文档字符串。尽管如此,在未来的 cartopy 更新中需要注意一些事情。
当使用以度为单位的 (lat, long) 时,球面上的小 angular 距离 ds
有 2 个分量:
`R*dlat` in NS direction
`R*dlon*cos(lat)` in EW direction
其中R是地球半径,
第二个分量随所考虑位置的 latitude
而变化,
考虑到这一点,ux
、vx
在纬度75度的计算应该是
rho = np.pi/180.
ux,vx = mapproj.transform_vectors(pcproj,lon,lat, uu/np.cos(75*rho), vv)
我正在尝试使用 cartopy 在地图上绘制一些风向量。然而,风看起来很奇怪,所以我在 75N 的一圈点上使用风矢量进行了简单测试。风矢量应与两个 lat/lon 网格成 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,lon,lat,uu,vv)
ax.quiver(xx,yy,ux,vx,transform=mapproj)
很明显,风矢量没有指向 lat/lon 网格 45 度。
我检查了投影中心 150W 和 75N 处的 ux
、vx
。这里的风应该与 lat/lon 网格中的相同,但它是 (3.54,13.7) 而不是 (10,10)。
风向量看起来和使用这条线一样
ax.quiver(lon,lat,uu,vv,transform=pcproj)
这可能并不令人惊讶,因为我认为 quiver 在底层使用了 transform_vector
和 transform_points
。
我尝试了沿 lat/lon 网格方向的风,它们被正确地转换了。
这是 transform_vectors
中的错误还是我使用不正确?
更新:
正如@swatchai 所建议的那样,现在,u-wind 应该在输入 transform_vectors
之前除以 cos(lat)
。我怀疑这是预期的行为,但应该使用这种规范化,直到未来的 cartopy 更新改变了行为。他们可能会选择只更新文档字符串。尽管如此,在未来的 cartopy 更新中需要注意一些事情。
当使用以度为单位的 (lat, long) 时,球面上的小 angular 距离 ds
有 2 个分量:
`R*dlat` in NS direction
`R*dlon*cos(lat)` in EW direction
其中R是地球半径,
第二个分量随所考虑位置的 latitude
而变化,
考虑到这一点,ux
、vx
在纬度75度的计算应该是
rho = np.pi/180.
ux,vx = mapproj.transform_vectors(pcproj,lon,lat, uu/np.cos(75*rho), vv)