爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 17632|回复: 41

绘制闪电密度图

[复制链接]

新浪微博达人勋

发表于 2013-5-6 00:02:01 | 显示全部楼层 |阅读模式

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

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

x
已有所有闪电发生的位置来计算和绘制闪电密度图。数据见此贴:http://bbs.06climate.com/forum.php?mod=viewthread&tid=14099&extra=&page=1

用脚本程序来实现,首先定义一个格点数据(GridData),主要参数是格点的X/Y方向的起始位置、格点间距、格点数。然后读取闪电位置数据文件,计算出每个闪电位于X/Y方向上第几个格点,将该格点的值加1,遍历所有闪电后就可以算出每个格点的闪电数目。可以将此格点数据存为一个文本格点数据文件(比如Surfer ASCII 格点数据),格点数据可以依据图例(LegendScheme)设置来生成等值线填充图层(Shaded)。
Image00010.png

可以验证一下上面计算出的闪电密度数据是否正确。先用脚本程序生成一个闪电位置点图层:
Image00009.png

再用上面保存的格点数据文件生成一个Grid_Fill图层:
Image00011.png

将该图层每个图元进行标注(也就是每个格点中闪电发生的次数),图形放大后可以数数一些格点内的闪电个数和标注数字是否相同(相同当然说明计算正确了)
Image00012.png

脚本程序如下:
  1. #--------------------------------------------------------        
  2. # Author: Yaqiang Wang                                          
  3. # Date: 2013-5-5                                                
  4. # Purpose: Read and plot lighting frequency data  
  5. # Note: Sample                                                   
  6. #-----------------------------------------------------------  
  7. #---- Import clr and classes
  8. import clr
  9. clr.AddReferenceByPartialName("System")
  10. clr.AddReferenceByPartialName("System.Drawing")
  11. from System import *
  12. clr.AddReference("MeteoInfoC.dll")
  13. from MeteoInfoC import *
  14. from MeteoInfoC.Data import *
  15. from MeteoInfoC.Data.MeteoData import *
  16. from MeteoInfoC.Legend import *
  17. from MeteoInfoC.Shape import *
  18. import os.path

  19. #---- Set directory
  20. dataDir = "D:\\Temp\\ascii\\"

  21. #---- Define grid data
  22. print 'Define grid data...'
  23. x0 = 105
  24. y0 = 28
  25. xdelt = 0.1
  26. ydelt = 0.1
  27. xnum = 55
  28. ynum = 45
  29. gData = GridData(x0,xdelt,xnum,y0,ydelt,ynum)

  30. #---- Read lighting data file
  31. print 'Read lighting data file...'
  32. fn = dataDir + "cunshuju.txt"
  33. tf = open(fn)
  34. for aline in tf:       
  35.         datalist = aline.split()
  36.         lat = float(datalist[1])
  37.         lon = float(datalist[0])       
  38.         xIdx = int((lon - x0 + xdelt / 2) / xdelt)
  39.         if xIdx < 0 or xIdx > xnum -1:
  40.                 continue
  41.         yIdx = int((lat - y0 + ydelt / 2) / ydelt)
  42.         if yIdx < 0 or yIdx > ynum - 1:
  43.                 continue
  44.        
  45.         gData.Data[yIdx, xIdx] += 1

  46. #---- Ouput grid data as Surfer ASCII data file
  47. outfn = dataDir + "test.grd"
  48. gData.SaveAsSurferASCIIFile(outfn)

  49. #---- Create shaded layer from the grid data
  50. aLS = LegendScheme(ShapeTypes.Polygon)
  51. aLS.ImportFromXMLFile(dataDir + "test.lgs")
  52. aLayer = DrawMeteoData.CreateShadedLayer(gData, aLS, "Lighting_Shaded", "Frequency")
  53. aLayer.IsMaskout = True
  54. mipy.MapDocument.ActiveMapFrame.AddLayer(aLayer)
  55. mipy.MapDocument.ActiveMapFrame.MoveLayer(aLayer, 0)

  56. print 'Finished!'


  1. #--------------------------------------------------------        
  2. # Author: Yaqiang Wang                                          
  3. # Date: 2013-5-5                                                
  4. # Purpose: Read and plot lighting data  
  5. # Note: Sample                                                   
  6. #-----------------------------------------------------------  
  7. #---- Import clr and classes
  8. import clr
  9. clr.AddReferenceByPartialName("System")
  10. clr.AddReferenceByPartialName("System.Drawing")
  11. from System import *
  12. from System.Drawing import *
  13. from System.Collections.Generic import *
  14. clr.AddReference("MeteoInfoC.dll")
  15. from MeteoInfoC import *
  16. from MeteoInfoC.Data.MapData import *
  17. from MeteoInfoC.Geoprocess import *
  18. from MeteoInfoC.Layer import *
  19. from MeteoInfoC.Shape import *
  20. from MeteoInfoC.Legend import *
  21. from MeteoInfoC.Drawing import *
  22. import os.path

  23. #---- Create a point layer to plot lighting data
  24. print 'Create lighting point layer...'
  25. pLayer = VectorLayer(ShapeTypes.Point)
  26. pLayer.LayerName = "Lighting_Point"
  27. pLayer.Visible = True
  28. pLayer.EditAddField("ID", String)

  29. #---- Read lighting data file
  30. print 'Read lighting data file...'
  31. fn = "D:\\Temp\\ascii\\cunshuju.txt"
  32. tf = open(fn)
  33. id = 1
  34. for aline in tf:       
  35.         datalist = aline.split()
  36.         lat = float(datalist[1])
  37.         lon = float(datalist[0])       
  38.         aPS = PointShape()
  39.         aPoint = PointD(lon, lat)
  40.         aPS.Point = aPoint       
  41.         shapeNum = pLayer.ShapeNum
  42.         if pLayer.EditInsertShape(aPS, shapeNum):
  43.                 pLayer.EditCellValue("ID", shapeNum, str(id))
  44.        
  45.         id += 1

  46. pLayer.UpdateLegendScheme(LegendType.SingleSymbol, "ID")
  47. for legend in pLayer.LegendScheme.LegendBreaks:
  48.         legend.Style = PointStyle.Plus
  49.         legend.DrawOutline = False
  50.         legend.Color = Color.LightBlue
  51.         legend.Size = 8

  52. mipy.MapDocument.ActiveMapFrame.AddLayer(pLayer)   
  53. print 'Finished!'

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

新浪微博达人勋

发表于 2013-5-6 08:53:12 | 显示全部楼层
学习了.谢谢版主.
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-5-6 14:58:09 | 显示全部楼层
努力学习,谢谢版主
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-5-6 15:26:59 | 显示全部楼层
版主的程序关键地方可以加上注释吗?想研究一下,如何写脚本划分网格,谢谢。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-5-6 16:10:20 | 显示全部楼层
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-5-7 16:46:34 | 显示全部楼层
本帖最后由 koikaze 于 2013-5-7 16:48 编辑
MeteoInfo 发表于 2013-5-6 16:10
不是已经有注释了吗

请教版主,代码中:cunshuju.txt
是怎样一种格式的?

原帖中的数据已经给lz删除了,想研究一下如何用代码处理网格和数据统计,感激不尽。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-5-7 16:54:36 | 显示全部楼层
koikaze 发表于 2013-5-7 16:46
请教版主,代码中:cunshuju.txt
是怎样一种格式的?

原帖34楼已经讲了格式。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-5-7 17:00:11 | 显示全部楼层
koikaze 发表于 2013-5-7 16:46
请教版主,代码中:cunshuju.txt
是怎样一种格式的?

这个帖子里有类似的数据(求助:有闪电定位资料,如何在grads中绘制闪电的分布情况?
http://bbs.06climate.com/forum.p ... 187&fromuid=106
),不过是纬度在前,经度在后,稍微改改脚本程序就可以了。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-5-7 17:02:33 | 显示全部楼层
本帖最后由 koikaze 于 2013-5-7 17:18 编辑
MeteoInfo 发表于 2013-5-7 16:54
原帖34楼已经讲了格式。

了解,就是经纬度坐标数组。
还有一点疑问需要请教:
代码中:test.grd
是否为经纬度坐标下的地闪次数,数组:经度,纬度,地闪?

如果地闪数据是在某一时刻出现的次数是大于1次(如:113.435837,23.916666,4),如果只根据坐标出现的次数进行统计,会漏项,脚本应该如何修改比较完善呢?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-5-7 20:03:57 | 显示全部楼层
koikaze 发表于 2013-5-7 17:02
了解,就是经纬度坐标数组。
还有一点疑问需要请教:
代码中:test.grd

test.grd是已经计算了闪电次数的格点数据。

把次数也读成一个变量,在给格点数据加闪电次数时用这个变量就可以了。
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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