如何将矢量旋转到底图贴图投影?

时间:2012-01-16 10:17:40

标签: python matplotlib

我正在使用matplotlib倒钩函数和python中的底图制作风矢量倒钩图。 我有一个任意纬度和经度的矢量(风观测)列表,即不在常规网格上。

我需要在绘图之前将矢量旋转到地图投影上,否则倒钩指向错误的方向。这样做的最佳方式是什么?

e.g。

import numpy
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

# Define locations of my vectors
lat = numpy.array([50.1,46.2,51.6,52.2,54.4])
lon = numpy.array([-3.3,-1.0,-5.2,-1.2,0.2])

# Define some east-west vectors to illustrate the problem
u = numpy.array([5,5,5,5,5])
v = numpy.array([0,0,0,0,0])

# Set up map projection
m = Basemap(llcrnrlon=-15.,llcrnrlat=46.,urcrnrlon=15.,urcrnrlat=59.,
            projection='lcc',lat_1=40.,lat_2=50.,lon_0=-50.,
            resolution ='l')

# Calculate positions of vectors on map projection 
x,y = m(lon,lat)

# Draw barbs
m.barbs(x,y,u,v, length=7, color='red')

# Draw some grid lines for reference
parallels = numpy.arange(-80.,90,20.)
meridians = numpy.arange(0.,360.,20.)
m.drawparallels(parallels)
m.drawmeridians(meridians)
m.drawcoastlines(linewidth=0.5)

plt.show()

请注意,在图中,矢量不指向东西方。

我尝试过使用rotate_vector和transform_vector例程,但这些只适用于网格化矢量数据。

是否有例程将矢量旋转到地图投影上以获得lat,lon u,v对的任意列表?

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

您的问题是,您在lat中指定了uv。同时,您在地图坐标中指定了xybarbs似乎期望它们都在地图坐标中,而不是混合。

最简单的方法是计算端点以获取组件。 (我的描述毫无意义,所以这就是我的想法:)。

x, y = m(lon, lat)
x1, y1 = m(lon+u, lat+v)
u_map, v_map = x1-x, y1-y

然后你需要重新调整幅度。作为一个完整的例子:

import numpy
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

# Define locations of my vectors
lat = numpy.array([50.1,46.2,51.6,52.2,54.4])
lon = numpy.array([-3.3,-1.0,-5.2,-1.2,0.2])

# Define some east-west vectors to illustrate the problem
u = numpy.array([5,5,5,5,5])
v = numpy.array([0,0,0,0,0])

# Set up map projection
m = Basemap(llcrnrlon=-15.,llcrnrlat=46.,urcrnrlon=15.,urcrnrlat=59.,
            projection='lcc',lat_1=40.,lat_2=50.,lon_0=-50.,
            resolution ='l')

# Calculate positions of vectors on map projection 
x,y = m(lon,lat)

# Calculate the orientation of the vectors
x1, y1 = m(lon+u, lat+v)
u_map, v_map = x1-x, y1-y

# Rescale the magnitudes of the vectors...
mag_scale = np.hypot(u_map, v_map) / np.hypot(u, v)
u_map /= mag_scale
v_map /= mag_scale

# Draw barbs
m.barbs(x,y,u_map,v_map, length=7, color='red')

# Draw some grid lines for reference
parallels = numpy.arange(-80.,90,20.)
meridians = numpy.arange(0.,360.,20.)
m.drawparallels(parallels)
m.drawmeridians(meridians)
m.drawcoastlines(linewidth=0.5)

plt.show()

enter image description here