- 积分
- 22715
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2011-7-23
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 平流层的萝卜 于 2022-11-16 21:24 编辑
Python白化似乎是一个不那么容易的问题,不过这个问题相信现在已经得到了完美的解决。借助Basemap和pyshp这两个模块,实现对任意shp文件的区域进行白化,拒绝空白锯齿,甩开越界填图,让maskout后的数据完美吻合shp边界。
具体的思路是,读取气象场数据,照常画图,得到matplotlib plot的一个instance,对应未白化的整图。然后进行关键的一步,读取shapefile(shp文件,比如meteoinfo的地图库文件country1.shp,是世界各国地图),提取shapefile里的感兴趣区(比如中国),形成一个clip对象,最后得到剪切图。
效果图如下:一张海平面气压场的图,把中国外的地区maskout了。
放大之后来看,没有锯齿,完美吻合。
当然,也可以把县级地图叠加到上面去,只要保留clip对象不要动,同时叠加更加精细的县级底图就可以了。
第一张图的脚本如下(其他图大同小异):- #coding=utf-8
- import maskout
- from mpl_toolkits.basemap import Basemap
- import matplotlib.pyplot as plt
- from matplotlib.font_manager import FontProperties
- import numpy
- import netCDF4 as nc
- font = FontProperties(fname=r"C:\\Windows\\Fonts\\impact.ttf")
- font1 = FontProperties(fname=u"C:\\Windows\\Fonts\\simkai.ttf")
- fig = plt.figure(figsize=(16,9.6))
- ax = fig.add_subplot(111)
- # ncdata=nc.Dataset(r'2004_500_grtuvw.nc')
- ncdata=nc.Dataset('pres.mon.ltm.nc')
- # data=ncdata.variables['t'][0,:,:]
- data=ncdata.variables['pres'][0,:,:]
- # exit()
- # lat=ncdata.variables['latitude'][:]
- # lon=ncdata.variables['longitude'][:]
- lat=ncdata.variables['lat'][:]
- lon=ncdata.variables['lon'][:]
- lon1,lon2=lon[0],lon[-1]
- lat1,lat2=lat[-1],lat[0]
- nx=data.shape[1];ny=data.shape[0]
- m = Basemap(llcrnrlon=lon1,llcrnrlat=lat1,urcrnrlon=lon2,urcrnrlat=lat2,projection = 'cyl')
- xx,yy=m.makegrid(nx,ny)
- yy=yy[::-1]
- m.readshapefile('country1','whatevername',color='gray')
- minval,maxval=int(numpy.amin(data)),int(numpy.amax(data))+1
- cs = m.contourf(xx,yy,data,range(minval,maxval),cmap= plt.cm.get_cmap('jet') )
- bar=m.colorbar(cs)
- bar.set_ticks(range(minval-1,maxval,40))
- bar.set_ticklabels(range(minval-1,maxval,40))
- clip=maskout.shp2clip(cs,ax,'country1','China')
- plt.title(u'Python Super Mask',fontproperties=font,fontsize=40)
- lon1,lon2=ax.set_xlim(70,140);lat1,lat2=ax.set_ylim(15,55)
- #signature=u"by 平流层的萝卜"
- #plt.text(lon2-(lon2-lon1)*3.0/10,lat2+(lat2-lat1)*0.1/10,signature,fontproperties=font1,fontsize=25)
- # plt.show()
- plt.savefig('111.png')
复制代码 对于上面的clip=maskout.shp2clip(cs,ax,'country1','China') ,其中maskout是自己定义的一个模块,实现的功能就是最关键的对整图进行剪切,因为模块可以移植到其他程序中,方便以后使用。
把第一张图的测试数据、地图和脚本一块打包了,包括自定义maskout模块包,欢迎感兴趣的朋友下载:
Python完美白化_测试数据及脚本.rar
(1.41 MB, 下载次数: 4552)
|
评分
-
查看全部评分
|