- 积分
- 31
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2015-2-10
- 最后登录
- 1970-1-1

|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 yangzhe1997 于 2015-3-29 11:19 编辑
转自台风论坛
python初学者,前几日了解到了强大的matplotlib模块以及其旗下的Basemap模块,花三个小时写了制作维基路径图的程序,通过导入B-Deck文件(如JTWC的BST文件)自动导出欢迎交流!效果如下:
代码
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
from os import startfile
#由风速返回SSHS级别
def category(wind):
if wind > 137:
cat = 'CAT5'
elif wind > 114:
cat = 'CAT4'
elif wind > 96:
cat = 'CAT3'
elif wind > 83:
cat = 'CAT2'
elif wind > 64:
cat = 'CAT1'
elif wind > 30:
cat = 'TS'
else:
cat = 'TD'
return cat
#根据路径经纬度范围计算图片经纬度范围,宽长比固定为0.618
def bestscale(latmax,latmin,lonmax,lonmin):
latmid = latmax/2 + latmin/2
lonmid = lonmax/2 + lonmin/2
deltalat = latmax - latmin
deltalon = lonmax - lonmin
if deltalat / deltalon > 0.618:
deltalon = deltalat / 0.618
lonmax = lonmid + deltalon / 2
lonmin = lonmid - deltalon / 2
elif deltalat / deltalon < 0.618:
deltalat = deltalon * 0.618
latmax = latmid + deltalat / 2
latmin = latmid - deltalat / 2
return latmax, latmin, lonmax, lonmin
#由级别返回颜色值,均从维基路径图上取色以保持一致
def fitcolor(cat):
if cat == 'CAT5':
return '#ff5e5e'
elif cat == 'CAT4':
return '#ff8f1d'
elif cat == 'CAT3':
return '#ffbe49'
elif cat == 'CAT2':
return '#ffe473'
elif cat == 'CAT1':
return '#ffffc7'
elif cat == 'TS':
return '#03f8f9'
else:
return '#59bbff'
#由级别返回符号标记,'^'代表三角形,'o'代表圆形
def fitmarker(cat):
if cat == 'EX' or cat == 'DB':
return '^'
else:
return 'o'
#主程序
def plot():
stormnum = input('输入台风六位编号,如201201:')
filepath = 'C:\\Users\\crazyapril\\Desktop\\BST\\%d\\WP%02d.txt' % (stormnum/100,stormnum%100)
#这个路径是楼主电脑里BST存放路径,可按情况更改
filehandle = open(filepath,'r')
bstline = filehandle.readline() #打开BST文件并逐行读取,现读取第一行
latmax, latmin, lonmax, lonmin = 0, 90, 0, 180
latlist, lonlist, catlist = [], [], [] #纬度列表,经度列表和强度级别列表
while bstline: #当此行不为空,执行循环
lat, lon = int(bstline[35:38])/10.0, int(bstline[41:45])/10.0
wind = int(bstline[48:51])
level = bstline[59:61] #按老J BST文件格式读取经纬度、风力和级别
latlist.append(lat)
lonlist.append(lon) #将读取到的经纬度添加到列表中
if wind < 64 and stormnum > 200300:
catlist.append(level) #2003年后的老J BST文件有level信息,包含扰动和温气阶段,将其存入级别列表
else:
catlist.append(category(wind)) #其他均按category函数转换得到级别,存入列表
if lat > latmax:
latmax = lat
if lat < latmin:
latmin = lat
if lon > lonmax:
lonmax = lon
if lon < lonmin:
lonmin = lon #获取路径范围(最大经度、最小经度、最大纬度、最小纬度)
bstline = filehandle.readline() #读取下一行
filehandle.close() #文件读取完毕,关闭文件
latmax, latmin, lonmax, lonmin = bestscale(latmax+5,latmin-5,lonmax+5,lonmin-5)
#获取图片经纬度范围,+5、-5意为在图片中预留5纬度空间
m = Basemap(projection='merc',resolution=None,
llcrnrlat=latmin,urcrnrlat=latmax,
llcrnrlon=lonmin,urcrnrlon=lonmax)
#建立地图,采用墨卡托投影,地图四角经纬度使用上面获得的经纬度
m.warpimage(image='E:\\nasa.jpg',scale=0.6) #调用背景图片,压缩率为0.6
xlist, ylist = m(lonlist,latlist) #将经纬度转换为图片所用坐标
m.plot(xlist,ylist,color='w') #首先画白线
for i in range(len(lonlist)): #再逐个描点
x, y = m(lonlist<i>, latlist<i>)
m.plot(x,y,color=fitcolor(catlist<i>),marker=fitmarker(catlist<i>),markersize=6,markeredgecolor='none')
figpath = 'C:\\Users\\crazyapril\\Desktop\\BST\\%d\\WP%02d.png' % (stormnum/100,stormnum%100) #图片保存地址
plt.savefig(figpath,dpi=200,bbox_inches='tight',edgecolor='none',pad_inches=0) #将图片保存,dpi为200
print '保存成功。保存地址:%s' % (figpath)
startfile(figpath) #调用系统默认程序打开路径图片
plot()</i></i></i></i>
|
评分
-
查看全部评分
|