2012-01-16 92 views
2

我正在使用matplotlib barb函數和python中的底圖製作風矢量倒鉤圖。 我有任意緯度和經度向量列表(風觀測值),即不在常規網格上。如何將矢量旋轉到底圖貼圖投影上?

我需要在繪圖之前將矢量旋轉到地圖投影上,或者倒鉤指向錯誤的方向。做這個的最好方式是什麼?

例如

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對列表?

任何幫助將不勝感激!

回答

2

你的問題是你正在指定你的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

+0

太好了 - 我認爲這樣做很好。謝謝! – 2012-01-16 14:16:05