爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 180414|回复: 525

图文详解文本格式站点数据绘制等值线图

  [复制链接]

新浪微博达人勋

发表于 2011-8-9 23:13:05 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 MeteoInfo 于 2012-9-15 10:28 编辑

气象数据最主要可以分为两大类:格点数据和站点数据。或者还可以再加一类:路径数据(台风路径或气团轨迹)。站点数据如果包含足够的信息(如MICAPS第一类数据),可以进行站点填图。这个帖子要讲的是更普遍意义的站点数据,可以包含一个或多个要素。在MeteoInfo里定义了一种数据格式:Lon/Lat Stations,其实就是文本格式的站点数据。文件头只有一行,是每一列的名称。文件的第一列是站点标识(站号或者站名),第二列和第三列是站点的经度和纬度,第四列以后是各个要素。列和列之间要用逗号分隔(不能是中文的逗号)。如果你的站点数据不是这种格式,只需要在Excel里按照上述说明处理一下,另存为CSV文件即可。数据示例如下:

Stid,Longitude,Latitude,Precipitation
57562,111.36,29.58,0
57584,113.08,29.38,0.01
52633,98.41,38.81,0
......


1、打开站点数据文件
如下图所示,在Meteo Data对话框中点击第一个按钮,选择"ASCII Data"->"Lon/Lat Stations",在打开文件对话框中选择上面的示例数据。
Image00511.png

2、绘制点状图
文件打开后可以选择要素(Var)和绘图类型(DrawType)来绘制图形。
Image00513.png

我们先试着绘制点状图,将DrawType选为Station_Point,点击"Draw Data"按钮(工具栏上第三个),绘制出的图形如下:
Image00514.png

可以通过对创建的站点图层进行图例编辑来美化图形,比如将表示站点降水量的圆点符号的外轮廓线去掉。
Image00515.png

评分

参与人数 4威望 +5 金钱 +28 贡献 +7 收起 理由
Nov. + 1 很给力!
shanie + 1 很给力!
言深深 + 16 + 2 鼓掌!
mofangbao + 5 + 10 + 5 很给力!

查看全部评分

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

新浪微博达人勋

 楼主| 发表于 2011-8-10 12:37:33 | 显示全部楼层
上面讲到的在MeteoInfo桌面软件中处理数据的方式虽然简单,只需动动鼠标就可以了,不过对于批量数据处理以及自动运行的需求无能为力。这时候就轮到MeteoInfo脚本程序出场了。对于上述降水站点数据处理的脚本程序如下:

# This Python file uses the following encoding: GB2312
#---- 引入类库
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.Layout import *
from MeteoInfoC.Data import *

#---- 设置路径变量
BaseDir = "C:\\Program Files (x86)\\MeteoInfo\\"
MapDir = BaseDir + "Map\\"
LegendDir = BaseDir + "Legend\\"
DataDir = "E:\\Temp\\"
#---- 创建MIApp类的对象
myApp = MIApp()
#---- 添加图层
myApp.OpenLayer(MapDir + "bou2_4p.shp")
#---- 设置图层渲染
myApp.SetLegendBreak("bou2_4p.shp",0,Color.Yellow,Color.Gray,1,True,False,True)
myApp.OpenLayer(MapDir + "bou1_4l.shp")
myApp.SetLegendBreak("bou1_4l.shp",0,Color.Blue)
myApp.OpenLayer(MapDir + "china.shp")
myApp.SetLayerVisible("china.shp", False)
myApp.OpenLayer(MapDir + "res1_4m.shp")
myApp.SetLegendBreak("res1_4m.shp",0,5,Color.Red,Color.Black,True,True,True)
#---- 获取矢量图层对象,并设置标注
aLayer = myApp.GetVectorLayer("res1_4m.shp")
aLayer.LabelSet.FieldName = "NAME";
aLayer.LabelSet.LabelFont = Font("楷体", 10);
aLayer.LabelSet.Offset = 15;
aLayer.AddLabels();

#---- Lambert投影
myApp.ProjectLayers("+proj=lcc+lat_1=25+lat_2=47+lon_0=105")

#---- 按照经纬度范围缩放地图
myApp.ZoomLonLat(78,130,15,53)

#---- 设置屏蔽图层(只绘制中国境内图形)
myApp.SetMaskout("china.shp")
#---- 设置绘图类型为shaded
myApp.SetDrawType("shaded")
#---- 站点数据插值为格点数据的设置
myApp.SetInterpolation(60,140,-20,60,160,160,"IDW_Radius",1,1)
#---- 设置图例文件
myApp.SetLegendScheme(LegendDir + "rain1.lgs")

#---- 设置DefalutLayoutMap(图层显示)
myApp.MapLayout.DefaultLayoutMap.DrawGridLine = False
myApp.MapLayout.DefaultLayoutMap.DrawGridLabel = False
myApp.MapLayout.DefaultLayoutMap.DrawNeatLine = False
myApp.MapLayout.DefaultLayoutMap.Left = 10
myApp.MapLayout.DefaultLayoutMap.Top = 10
myApp.MapLayout.DefaultLayoutMap.Width = 620
myApp.MapLayout.DefaultLayoutMap.Height = 450

#---- 设置DefaultIllustration(插图,这里是南海脚图)
myApp.MapLayout.DefaultIllustration.Visible = True
myApp.MapLayout.DefaultIllustration.Left = 40
myApp.MapLayout.DefaultIllustration.Top = 350
myApp.MapLayout.DefaultIllustration.Width = 85
myApp.MapLayout.DefaultIllustration.Height = 109

#---- 设置DefaultTitle(图形标题)
myApp.MapLayout.DefaultTitle.SetFont("黑体", 12)
myApp.MapLayout.DefaultTitle.Top = 40
myApp.MapLayout.DefaultTitle.Left = 80

#---- 设置DefaultLegend(图例)
myApp.MapLayout.DefaultLegend.LegendStyle = LegendStyleEnum.Normal               
myApp.MapLayout.DefaultLegend.DrawNeatLine = False
myApp.MapLayout.DefaultLegend.Title = "降水量(毫米)"
myApp.MapLayout.DefaultLegend.BackColor = Color.White
myApp.MapLayout.DefaultLegend.Font = Font("Arial", 8)
myApp.MapLayout.DefaultLegend.Left = 575
myApp.MapLayout.DefaultLegend.Top = 250

#---- 设置时间
sTime = DateTime.Parse("2010-10-14 20:00")
aTime = sTime.AddHours(-6)

#---- 获取站点数据
myApp.RemoveDataLayers()
inFile = "China_Prec_" + sTime.ToString("yyyyMMddHH") + ".csv"
print inFile
#---- 打开文本格式站点数据文件
myApp.OpenLonLatData(DataDir + inFile)  
#---- 获取累计降水站点数据
stData = myApp.GetStationData("Precipitation")   

#---- 绘制累计降水图层
myApp.Display(stData)
#---- 调整图层顺序(以避免压盖)
myApp.MoveLayerToTop("bou2_4p.shp")  
myApp.MoveLayerToTop("bou1_4l.shp")
myApp.MoveLayerToTop("res1_4m.shp")
#---- 设置标题名称
title = "            全国降水量实况图\n" + aTime.ToString("yyyy年MM月dd日HH时") + " - " + sTime.ToString("yyyy年MM月dd日HH时")
myApp.SetTitle(title)     
#---- 设置图例名称
myApp.MapLayout.DefaultLegend.Title = "降水量(毫米)"
#---- 绘制图形
myApp.MapLayout.PaintGraphics()
#---- 输出图形为文件
outFile = "Prec_" + aTime.ToString("yyyyMMddHH") + "-" + sTime.ToString("yyyyMMddHH") + ".png"
print outFile
#myApp.SaveFigure(DataDir + outFile)   
  
#---- 显示程序窗体(只是为了看效果,自动运行时不需要)
Application.Run(myApp)

运行结果:
Image00532.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-5-18 16:49:33 | 显示全部楼层
本帖最后由 sola_nana 于 2015-5-18 16:51 编辑
sola_nana 发表于 2015-5-18 16:27
王老师您好!看了很多关于调整Legend不当导致10mm以下降水画不出的问题。根据您之前写的lgs文件我也做了相 ...

成功画出10mm以下的降水,前提是需要在“Meteo data”中的“Legend setting”设置Legend,而非画图之后更改Legend方案。


在Meteo data中设置Legend

在Meteo data中设置Legend

成功画出10mm以下的降水

成功画出10mm以下的降水
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2011-8-9 23:51:24 | 显示全部楼层
本帖最后由 MeteoInfo 于 2011-8-9 23:53 编辑

3、绘制降水量等值线图
设置DrawType为Shaded,点击"Draw Data"按钮,绘制出降水等值线填色图。
Image00516.png

这个图有点丑,我们可以通过设置图例来美化它。点击"Meteo Data"对话框上的"Legend Setting"按钮,在"Legend Set"对话框中点击"Import Legend"按钮(第一个)来加载图例文件"rain1.lgs"。
Image00517.png

用新图例绘制的等值线填色图:
Image00519.png

4、Maskout图层
上面绘制的等值线图层部分出了国界,需要将国界外的部分屏蔽(Maskout)掉。点击主界面工具栏中第一个按钮(Add Layer),打开"Add Layer"对话框,加载"china.shp"图层。
Image00520.png

点击"Map"->"Maskout"菜单,在弹出的"Map Maskout set"对话框中将"MaskLayer"设置为"china.shp",将"SetMaskLayer"设置为"True"就ok了。
Image00521.png

5、设置插值方法
MeteoInfo中对站点数据绘制等值线是用了插值方法将站点数据插值为格点数据,然后再追踪等值线(GrADS也是这个套路)。软件会自动给出插值方法和参数,不过通常并不符合实际需求,用户要自己来对插值方法和参数进行设置。MeteoInfo目前提供两种插值方法:IDW(反距离权法)和Cressman。IDW方法简单实用,Cressman方法在气象中也应有颇广。不同的气象数据具有不同的空间分布特征,比如温度的空间分布是连续的,而降水的空间分布是不连续的。IDW方法因此也提供两个分枝:IDW_Neighbour和IDW_Radius。前者插值出的格点数据都是有效值,而后者使用了搜索半径,插值出的格点数据可能包含无效数据(在搜索半径内没有站点数据)。Cressman方法在每次迭代中也是有搜索半径,插值出的格点数据也可能有无效数据。如果是温度数据可以用IDW_Neighbour方法来插值,对于本例中的降水数据来说可以采用IDW_Radius或者Cressman方法。

IDW_Radius方法的例子:
Image00522.png
Image00523.png

Cressman方法的例子:
Image00525.png
Image00526.png

6、成图
最后在Layout中对图形进行美化,设置投影、排版、设置南海脚图、设置图名、图例等等。下面几张图就当抛砖了,希望能看到大家做出来的美图。
Image00527.png
Image00528.png
Image00529.png
Image00531.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

0
早起挑战累计收入
发表于 2011-8-9 23:38:19 | 显示全部楼层
刚要睡觉,看到了,这个必须顶!很详细,比grads方便很多
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2011-8-10 00:13:28 | 显示全部楼层
这个必须顶啊,正准备睡觉,过来就看到了{:e313_b:}
密码修改失败请联系微信:mofangbao

新浪微博达人勋

0
早起挑战累计收入
发表于 2011-8-10 07:54:22 | 显示全部楼层
哈哈 看来昨晚楼层被我插入了...
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2011-8-10 09:16:12 | 显示全部楼层
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 0
发表于 2011-8-10 09:17:59 | 显示全部楼层
太好了,下下来就画过几张图,不是很会用,现在好了
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2011-8-10 13:34:58 | 显示全部楼层
看起来方便多了,好强大
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2011-8-10 15:22:45 | 显示全部楼层
mofangbao 发表于 2011-8-10 07:54
哈哈 看来昨晚楼层被我插入了...

你太邪恶了
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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