爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 16459|回复: 39

MeteoInfo脚本程序自动绘制气团轨迹

[复制链接]

新浪微博达人勋

发表于 2011-10-27 22:50:06 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
日本大地震福岛核电站泄漏事件发生后曾利用MeteoInfo脚本程序自动绘制气团轨迹预报图,脚本程序的内容比较丰富(部分代码被注释掉了,实际应用时根据需要取消注释即可),包括ftp自动下载MM5预报的气象数据,调用HYSPLIT的MM5转ARL模块将MM5输出的气象数据转换为HYSPLIT用的ARL格式,自动生成CONTROL文件(HYSPLIT轨迹计算的控制文件),调用HYSPLIT轨迹计算模块自动计算前向气团轨迹(也就是预报),调用MeteoInfo绘制气团轨迹图形,将图形自动ftp上传至指定服务器。MeteoInfo脚本程序其实在业务自动化中有很好的应用前景,不过估计目前也就我自己用用了。

轨迹预报图形:
Nuclear_Trajectory_March16.png

脚本程序:
# This Python file uses the following encoding: GB2312
import sys
sys.path.append("C:\\Program Files (x86)\\MeteoInfo")
import os
import time
import shutil
import clr
clr.AddReferenceByPartialName("System")
clr.AddReferenceByPartialName("System.Windows.Forms")
clr.AddReferenceByPartialName("System.Drawing")
from System import *
from System.Windows.Forms import *
from System.Drawing import *
clr.AddReference("MeteoInfoC.dll")
from MeteoInfoC import *
from MeteoInfoC.Data import *
from MeteoInfoC.Legend import *
from MeteoInfoC.Layout import *
from MeteoInfoC.Shape import *
from MeteoInfoC.Drawing import *

from ftplib import FTP

# Set variables
Today = DateTime.Now
Today = Today.AddDays(-1)
MetDir = 'E:\\MetData\\'
MetFile = 'MMOUT_DOMAIN1'
MapDir = 'C:\\Program Files (x86)\\MeteoInfo\\Map\\'

## ftp MM5 data
#print 'Login ftp host'
#f = FTP('***.***.***')
#f.login('****', '****')
#f.cwd('****')
#print 'start download MM5 data ...'
#f.retrbinary('RETR %s' % MetFile, open(MetDir + MetFile, 'wb').write)
#print 'MM5 data downloaded!'
#f.quit()
#print 'Quit ftp host'

## Convert MM5 data to ARL data
#print 'Start convert MM5 data to ARL data ...'
#os.system("c:\\hysplit4\\exec\\mm5toarl.exe " + MetDir + MetFile)
#print 'Convert finished'
MetFile = 'DATA1.ARL.' + Today.ToString("yyyyMMdd")
#shutil.copyfile('DATA1.ARL', MetDir + MetFile)
#os.remove('DATA1.ARL')

## Write CONTROL file
#print 'Write CONTROL file ...'
#ctFile = ".\\CONTROL"
#ctf = open(ctFile, 'w')
#ctf.write(Today.ToString("yy MM dd 00") + "\n")
#ctf.write("3\n")
#ctf.write("37.5 141.0    500.0\n")
#ctf.write("37.5 141.0    1500.0\n")
#ctf.write("37.5 141.0    3000.0\n")
#ctf.write("96\n")
#ctf.write("0\n")
#ctf.write("10000.0\n")
#ctf.write("1\n")
#ctf.write(MetDir + "\n")
#ctf.write(MetFile + "\n")
#ctf.write("..\\trajdata\\" + "\n")
trajFile = "Traj_" + Today.ToString("yyyyMMdd")
#ctf.write(trajFile)
#ctf.close()

## Run HYSPLIT trajectory
#print 'Run HYSPLIT trajectory ...'
#os.system("c:\\hysplit4\\exec\\hyts_std.exe ")

# Draw trajectory map
print 'Drawing trajectory map ...'
myApp = MIApp()
myApp.OpenLayer(MapDir + "country1.shp")
myApp.SetLegendBreak("country1.shp",0,Color.LemonChiffon,Color.DarkGray,1,True,True,True)
myApp.OpenLayer(MapDir + "bou2_4p.shp")
myApp.SetLegendBreak("bou2_4p.shp",0,Color.Yellow,Color.Blue,1,True,False,True)
myApp.Zoom(115,210,10,70)
# Open trajectory data
myApp.OpenHYSPLITTraj("..\\trajdata\\" + trajFile)
myApp.SetLegendScheme("..\\trajdata\\traj.lgs")
myApp.SetDrawType("traj_line")
myApp.DisplayTraj()
myApp.MoveLayerToTop("bou2_4p.shp")
myApp.MapLayout.DefaultLayoutMap.Width = 660
title = "福岛第一核电站核泄漏扩散趋势(" + Today.ToString("MM月dd日") + " - " + Today.AddDays(4).ToString("MM月dd日") + ")"
myApp.SetTitle(title)
myApp.MapLayout.DefaultTitle.SetFont("黑体", 13)
myApp.MapLayout.DefaultTitle.Left = 130
myApp.MapLayout.DefaultTitle.Top = 10
myApp.MapLayout.DefaultLegend.LegendStyle = LegendStyleEnum.Normal
myApp.MapLayout.DefaultLegend.Left = 605
myApp.MapLayout.DefaultLegend.Top = 365
myApp.MapLayout.DefaultLegend.DrawNeatLine = True
myApp.MapLayout.DefaultLegend.Title = "气团轨迹"
myApp.MapLayout.DefaultLegend.BackColor = Color.White
myApp.MapLayout.DefaultLegend.Font = Font("Arial", 8)
aPS = PointShape()
aPS.Point = PointD(141.0, 37.5)
aPB = PointBreak()
aPB.Size = 15
aPB.Style = PointStyle.Star
aGraphic = Graphic(aPS, aPB)
myApp.MapLayout.MapView.GraphicCollection.Add(aGraphic)
myApp.MapLayout.MapView.BackColor = Color.LightCyan
myApp.SetAntiAlias(True)
myApp.ReDraw()
outFile = "..\\figure\\Nuclear_Trajectory_" + Today.ToString("yyyyMMdd") + ".png"
myApp.SaveFigure(outFile)
Application.Run(myApp)

# Ftp to NMC
print 'Login NMC ftp host'
ftp = FTP('***.***.***')
ftp.login('****', '****')
ftp.cwd('****')
filelist = []
ftp.retrlines('LIST', filelist.append)
datedir = Today.ToString("yyyyMMdd")
hasdir = False
for f in filelist:
    if datedir in f:
        hasdir = True
        break
if not hasdir:
    ftp.mkd(datedir)
ftp.cwd(datedir)
print 'start upload trajectory figure ...'
ftp.storbinary('STOR %s' % os.path.basename(outFile), open(outFile, 'rb'))
print 'Trajectory figure uploaded!'
ftp.quit()

评分

参与人数 3威望 +2 金钱 +20 贡献 +4 收起 理由
sf2014xiafei + 1 赞一个!
天目神眉 + 10 + 2 很给力!
zsmnantong + 2 + 9 + 2 赞一个!

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2011-10-27 23:11:55 | 显示全部楼层
老师辛苦!这么晚了还给我们发帖!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2011-10-27 23:25:14 | 显示全部楼层
也可以做出扩散趋势图:
Nuclear_Concentration_Animation.gif
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2011-10-28 00:29:19 | 显示全部楼层
老师您辛苦了,向您致敬
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 19710
发表于 2011-10-28 00:57:58 | 显示全部楼层
楼主太给力了,膜拜~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2011-10-28 10:55:44 | 显示全部楼层
大神作品,必属精品
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2011-10-28 17:46:01 | 显示全部楼层
强大!绝对的支持
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2011-10-31 20:58:37 | 显示全部楼层
用的什么数据啊。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2011-11-2 09:41:53 | 显示全部楼层

应该是可以的,具体要结合你们数据的格式进行相应的调整。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2011-11-3 09:50:37 | 显示全部楼层
大神啊~~膜拜~
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表