地图上的天气数据

时间:2018-08-31 13:31:11

标签: python dictionary matplotlib-basemap weather contourf

我正在尝试在Python上使用Basemap绘制一些天气数据(我也可以尝试使用Cartopy)。目前,我的天气数据看起来像this。我的数据源基本上是一个数组,每个位置对应于网格的一个正方形,每个值指示该正方形应具有的颜色。用于生成此图像的代码如下所示,其中网格的每个正方形等于1000 m:

grid_0 = np.asarray(dec.split())
grid_1=np.reshape(grid_0,(n_cols,n_rows))
grid_2 = grid_1.astype(float)

# Make plot
plt.figure(figsize=(30,30))
fig, ax = plt.subplots()

plt.axis('off')
cax = ax.imshow(grid_2, interpolation='nearest', cmap=cmap)

我掌握了网格下角的地理位置信息。我相信在地图上绘制此内容的最佳方法是以某种方式使用contourf()函数,但是我对Basemap还是很陌生,无法找到将其转换为contourf()可以理解的方法。为了确定地图,我使用底图,其中lon_air和lat_air是某个机场的坐标:

fig=figure(1, figsize=(19, 15))

m = Basemap(projection='cyl', llcrnrlon=lon_air-25, llcrnrlat=lat_air-15,
            urcrnrlon=lon_air+25, urcrnrlat=lat_air+15, resolution='h', area_thresh=10000)

m.drawstates(linewidth=0.5, color='black', zorder=4)
m.drawcountries(linewidth=2.0, color='white', zorder=3)
m.drawmapboundary(fill_color='#e5f5ff')
m.fillcontinents(color='#DFDFDF', zorder=1)
m.scatter(lon_air, lat_air,marker='o',color='k', zorder=10)

x0, y0 = lon_air-((360*920)/(4*np.pi*6371)),lat_air-((360*920)/(4*np.pi*6371)) 
x1, y1 = lon_air+((360*920)/(4*np.pi*6371)), lat_air+((360*920)/(4*np.pi*6371)) 

im = plt.imshow(plt.imread('./pngs/9905.png'), extent=(x0, x1, y0, y1), zorder=2)
plt.show()

如果有人认为需要更多详细信息,我将编辑该帖子。预先感谢大家!

1 个答案:

答案 0 :(得分:1)

产生Basemap.contourf图是一个非常标准的过程。您的plt.imread命令应返回一个二维numpy数组(假设它是灰度的),因此请执行以下操作以获取实际数据及其尺寸:

data = plt.imread('./pngs/9905.png')
lx, ly = data.shape

接下来,您需要为数据的每个点提供坐标。对于contourf,可通过提供两个附加的2D字段来完成此操作,一个带有x坐标,另一个带有y坐标。您可以使用np.linspacenp.meshgrid获得正确的表单:

lon0, lat0 = lon_air-((360*920)/(4*np.pi*6371)),lat_air-((360*920)/(4*np.pi*6371))
lon1, lat1 = lon_air+((360*920)/(4*np.pi*6371)), lat_air+((360*920)/(4*np.pi*6371))
lons = np.linspace(lon0, lon1, lx)  #1D
lats = np.linspace(lat0, lat1, ly)  #1D
lon, lat = np.meshgrid(lons,lats)   #1D --> 2D

现在,您仍然需要将地图坐标转换为投影坐标,然后绘制整个图形:

x,y = m(lon, lat)
m.contourf(x,y,data)
plt.show()

数据的排列可能仍然存在一些问题(有时会有些混乱),因此您可能必须对它进行转置(data.T)或反转尺寸(通过索引[::-1]) 。如果您遇到此类问题,请询问(或提供示例图片),然后我可以相应地调整答案。哦,记住要添加

import numpy as np

脚本开头的某个地方。