爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 14907|回复: 27

MeteoInfo脚本示例:站点数据绘制风场

[复制链接]

新浪微博达人勋

发表于 2012-11-17 22:00:03 | 显示全部楼层 |阅读模式

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

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

x
以MICAPS第2类数据为例,该类数据为高空站点全要素填图数据,包含了风向、风速等变量。MeteoInfo读取MICAPS第2类数据时会把风向、风速的变量名自动设为WindDirection和WindSpeed。用GetStationData方法获取风向、风速的站点数据(StationData),然后用mipy.MeteoDataset的Display方法生成风场图层。在读取MICAPS第2类数据时就已经知道风场是用风向、风速表示而不是U/V变量,程序会自动识别并正确绘制风场图形。

Image00940.png

脚本代码如下:
  1. #--------------------------------------------------------        
  2. # Author: Yaqiang Wang                                          
  3. # Date: 2012-11-17                                                
  4. # Purpose: Open MICAPS2 data and plot wind field  
  5. # Note: Sample                                                   
  6. #-----------------------------------------------------------
  7. import clr
  8. from System.Collections.Generic import *
  9. clr.AddReference("MeteoInfoC.dll")
  10. from MeteoInfoC import *
  11. from MeteoInfoC.Data import *
  12. from MeteoInfoC.Data.MeteoData import *

  13. #---- Set directories
  14. dataDir = "E:\\Temp\\micaps\"

  15. #---- Open MICAPS 2 data
  16. mydata = MeteoDataInfo()
  17. mydata.OpenMICAPSData(dataDir + "10120420.000")
  18. mipy.MeteoDataset.AddMeteoData(mydata)
  19. windDir = mydata.GetStationData("WindDirection")
  20. windSpeed = mydata.GetStationData("WindSpeed")       
  21. mipy.MeteoDataset.SetDrawType("barb")
  22. barbLayer = mipy.MeteoDataset.Display(windDir, windSpeed)
  23. barbLayer.LayerName = "Barb_micaps2"
  24. mipy.MeteoDataset.SetDrawType("vector")
  25. vectLayer = mipy.MeteoDataset.Display(windDir, windSpeed)
  26. vectLayer.LayerName = "Vector_micaps2"
  27. mipy.MapDocument.ActiveMapFrame.UpdateLayerNode(barbLayer)
  28. mipy.MapDocument.ActiveMapFrame.UpdateLayerNode(vectLayer)

  29. print 'Finished!'
复制代码



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

新浪微博达人勋

发表于 2012-11-17 22:25:56 | 显示全部楼层
本帖最后由 vortexroc 于 2012-11-17 22:42 编辑

windDir=drawData.GetStationData("WindDirection")
这句变量类型不对,TypeError: expected int, got str,是不是又要更新类库?

对比了一下,老师用的是MeteoDataInfo,我用的是MICAPS2DataInfo,所以可能有上面的问题
不过我通过stationdata的索引来取数据,原理应该是一样的啊,如下:
print drawData.VarList
windDir=drawData.GetStationData(3)
windSpeed=drawData.GetStationData(4)
sample=mDataset.Display(windDir,windSpeed)

输出:
List[str](['Height', 'Temperature', 'DepDewPoint', 'WindDirection', 'WindSpeed']),索引应该没错吧

但是图形是不对的
1974-7-20.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-11-18 09:02:06 | 显示全部楼层
厉害,越来越强大
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-11-18 09:52:43 | 显示全部楼层

你这个画出来怎么像格点数据?为什么不贴出全部代码看看?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-11-18 16:49:37 | 显示全部楼层
本帖最后由 vortexroc 于 2012-11-18 16:51 编辑
MeteoInfo 发表于 2012-11-18 09:52
你这个画出来怎么像格点数据?为什么不贴出全部代码看看?
  1. #get the griddata from ecmwf(ssss)
  2. def gridDatafromSSSS(dataTime,micapsTypes=4,varTypes='surface'):
  3.         ecdata=MICAPS4DataInfo()
  4.         if micapsTypes==2:
  5.                 ecdata=MICAPS2DataInfo()
  6.         strTime=time.strptime(dataTime+'-20','%Y-%m-%d-%H')        
  7.         ecdata.ReadDataInfo(SSSSdataDir+varTypes+'\\'+time.strftime('%y%m%d%H',strTime)+'.000')
  8.         return ecdata
  9.         
  10. #draw and export picture
  11. def drawPic(drawData,title,savePath,fName,picTypes='Contour'):
  12.         mipy.MapDocument.ActiveMapFrame.RemoveMeteoLayers()        
  13.         print drawData.VarList
  14.         if picTypes=='windbar':               
  15.                 windDir=drawData.GetStationData(3)
  16.                 windSpeed=drawData.GetStationData(4)        
  17.                 sample=mDataset.Display(windDir,windSpeed)
  18.                 print type(sample)
  19.         mipy.MapDocument.MapLayout.GetTexts()[0].SetLabelText(title)
  20.         mipy.MapDocument.ActiveMapFrame.UpdateLayerNode(sample)
  21.         if(os.path.exists(savePath)==False):
  22.                 os.makedirs(savePath)        
  23.         mipy.MapDocument.MapLayout.ExportToPicture(savePath+fName+'.png')
复制代码
没错,是格点的风场预报数据,2.5*2.5的,以micaps2类格式保存的,由于提取数据和绘图等用了不同的函数来处理,都贴出来代码就太乱了,所以直接选择了关键的部分贴出,然后调用这两个函数处理,老师看看这样的思路有啥问题?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-11-18 17:18:47 | 显示全部楼层
本帖最后由 vortexroc 于 2012-11-18 17:22 编辑

按照示例程序用MeteoDataInfo读取解决了。。。

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

新浪微博达人勋

 楼主| 发表于 2012-11-18 19:34:49 | 显示全部楼层
vortexroc 发表于 2012-11-18 17:18
按照示例程序用MeteoDataInfo读取解决了。。。

你的Python功底很强呀。

主要是因为MeteoDataInfo在读micaps2数据时标记了风场是风速、风向而不是U/V分量,在Display里要用到,以后会改改,把Display函数的参数都提供出来,以便更灵活使用。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-11-19 11:57:19 | 显示全部楼层
MeteoInfo 发表于 2012-11-18 19:34
你的Python功底很强呀。

主要是因为MeteoDataInfo在读micaps2数据时标记了风场是风速、风向而不是U/V分 ...

奇怪了,今天来运行程序,又变成前天贴出的那张错误图形结果了,我查看了windDir和windSpeed的数据都没有问题,到了sample=mDataset.Display(windDir,windSpeed)这句出来的结果就不对了,软件查看图层属性变成了 error4.png
就是说风速也取到了风向的数字,请老师看看


  1. def drawPic(drawData,title,savePath,fName,picTypes='Contour'):
  2.   mipy.MapDocument.ActiveMapFrame.RemoveMeteoLayers()  
  3.   
  4.   if picTypes=='windbar':  
  5.     print type(drawData)
  6.     windDir=drawData.GetStationData("WindDirection")
  7.     windSpeed=drawData.GetStationData("WindSpeed")   
  8.     mDataset.SetDrawType("barb")
  9.     sample=mDataset.Display(windDir,windSpeed)   
  10.   #else:
  11.     #mDataset.SetDrawType("Contour")
  12.     #sample=mDataset.Display(drawData)
  13.   mipy.MapDocument.MapLayout.GetTexts()[0].SetLabelText(title)
  14.   mipy.MapDocument.ActiveMapFrame.UpdateLayerNode(sample)
  15.   if(os.path.exists(savePath)==False):
  16.     os.makedirs(savePath)  
  17.   mipy.MapDocument.MapLayout.ExportToPicture(savePath+fName+'.png')
复制代码

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

新浪微博达人勋

 楼主| 发表于 2012-11-19 14:35:05 | 显示全部楼层
vortexroc 发表于 2012-11-19 11:57
奇怪了,今天来运行程序,又变成前天贴出的那张错误图形结果了,我查看了windDir和windSpeed的数据都没有 ...

我更新了MeteoInfoC.dll和MeteoInfo.exe文件(见置顶帖子),你可以用Display带三个参数的重载,例如:
barbLayer = mipy.MeteoDataset.Display(windDir, windSpeed, False),第三个参数表示数据是否为U/V分量。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-11-19 16:47:02 | 显示全部楼层
MeteoInfo 发表于 2012-11-19 14:35
我更新了MeteoInfoC.dll和MeteoInfo.exe文件(见置顶帖子),你可以用Display带三个参数的重载,例如:
...

谢老师,很好用,再请问一下,如何将风向杆加粗加大
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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