爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 26589|回复: 62

绘制MODIS AOD数据

[复制链接]

新浪微博达人勋

发表于 2013-12-6 17:15:47 | 显示全部楼层 |阅读模式

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

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

x
MODIS AOD(气溶胶光学厚度)数据应用比较广泛,下载的数据格式有HDF, NetCDF等,NetCDF格式数据可以直接在MeteoInfo中打开绘制出正确的图形,HDF数据由于没有遵循EOS协议,需要写脚本来确定坐标信息以便正确绘图,这里给出一个例子:
Image00505.png

脚本程序代码:
  1. #-----------------------------------------------------
  2. # Author: Yaqiang Wang
  3. # Date: 2013-12-5
  4. # Purpose: Read MODIS AOD hdf4 data
  5. # Note: Sample
  6. #-----------------------------------------------------
  7. from org.meteoinfo.data.meteodata import MeteoDataInfo
  8. from org.meteoinfo.data.meteodata import Dimension
  9. from org.meteoinfo.data.meteodata import DimensionType
  10. from org.meteoinfo.data.meteodata import DrawMeteoData
  11. from org.meteoinfo.legend import LegendScheme
  12. from org.meteoinfo.shape import ShapeTypes
  13. from ucar.nc2 import NetcdfFile
  14. import os.path
  15. import jarray

  16. #Set data directory
  17. dataDir = 'D:/Temp/toMingJing/AOD/'

  18. #Create MeteoDataInfo object
  19. mdi = MeteoDataInfo()

  20. #Read hdf data file
  21. fn = os.path.join(dataDir, 'MOD08_M3.A2000061.051.2010273213159.pscs_000500501908.Optical_Depth_Land_And_Ocean_Mean_Mean.G3.HDF')
  22. if os.path.isfile(fn):
  23.         print fn
  24.         mdi.openNetCDFData(fn)
  25.         dataInfo = mdi.getDataInfo()
  26.         #print mdi.getInfoText()
  27.         xmin = -180.0
  28.         ymin = -90.0
  29.         xnum = 360
  30.         ynum = 180
  31.         xdelt = 1.0
  32.         ydelt = 1.0
  33.         xlist = []
  34.         ylist = []
  35.         for i in range(0,xnum):
  36.                 xlist.append(xmin + xdelt * i)
  37.         for i in range(0,ynum):
  38.                 ylist.append(ymin + ydelt * i)

  39.         X = jarray.array(xlist, 'd')
  40.         Y = jarray.array(ylist, 'd')
  41.         xDim = Dimension(DimensionType.X)
  42.         xDim.setValues(X)
  43.         dataInfo.setXDimension(xDim)
  44.         yDim = Dimension(DimensionType.Y)
  45.         yDim.setValues(Y)
  46.         dataInfo.setYDimension(yDim)
  47.         var = dataInfo.getVariable('Optical_Depth_Land_And_Ocean_Mean_Mean')
  48.         print var.getName()
  49.         dimList = [yDim, xDim]
  50.         var.setDimensions(dimList)
  51.         gData = mdi.getGridData(var.getName())       
  52.         #aLS = LegendManage.createLegendSchemeFromGridData(gData, LegendType.GraduatedColor, ShapeTypes.Polygon)
  53.         aLS = LegendScheme(ShapeTypes.Polygon)
  54.         aLS.importFromXMLFile(os.path.join(dataDir, 'AOD.lgs'))
  55.         aLayer = DrawMeteoData.createRasterLayer(gData, "Test_HDF", aLS)
  56.         mf = miapp.getMapDocument().getActiveMapFrame()
  57.         mf.addLayer(aLayer)
  58.         mf.moveLayer(aLayer, 0)

  59. print 'Finished!'

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

新浪微博达人勋

发表于 2013-12-6 18:36:24 | 显示全部楼层
王老师的新作,强大啊!持续关注和学习!
周末愉快!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-12-6 21:30:14 | 显示全部楼层
继续支持
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-12-7 10:50:00 | 显示全部楼层
本帖最后由 rceclx 于 2013-12-7 11:03 编辑

王老师,周末好!按照您的方法试了一下,可以读取HDF格式的AOD数据,但也遇到了几个问题:1、java版里的显示-屏蔽外部图形打开后,没有可供选择的shp文件,图层中已经添加了shp;2、java版选中hdf图层后,显示-图层属性数据不能显示,shp图层可以;3、AOD.lgs文件方便能提供一下么?4、C#版能不能读取HDF格式的AOD数据?谢谢您。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-12-7 11:10:40 | 显示全部楼层

1、屏蔽用的图层必须是多边形图层,如果你要屏蔽中国以外的区域可以用china.shp
2、上面的例子生成的是RasterLayer(栅格图层),是没有属性数据表的。
3、 AOD.lgs (1.6 KB, 下载次数: 46)
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-12-7 11:29:33 | 显示全部楼层
MeteoInfo 发表于 2013-12-7 11:10
1、屏蔽用的图层必须是多边形图层,如果你要屏蔽中国以外的区域可以用china.shp
2、上面的例子生成的是R ...

王老师,非常感谢!
我就是准备屏蔽中国以外的区域。还有点问题,1、例子中生成的RasterLayer能输出么,不只是画图显示出来,想按照“也说格点数据插值为站点数据
http://bbs.06climate.com/forum.p ... 91&fromuid=5721”的方法,将格点数据插值为站点数据?2、在添加了图层后,meteo data打开后不能添加数据了,但重新打开java版,没有任何图层的时候,就没问题。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-12-7 12:43:44 | 显示全部楼层
rceclx 发表于 2013-12-7 11:29
王老师,非常感谢!
我就是准备屏蔽中国以外的区域。还有点问题,1、例子中生成的RasterLayer能 ...

1、可以用脚本程序来进行插值
或者在上面的脚本程序里将获取的GridData (gData)存为Surfer ASCII 格点数据,然后在GUI中操作。

2、可能是Java Swing的bug,我也偶尔发现类似的现象,不知道问题在哪里?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-12-7 13:04:27 | 显示全部楼层
MeteoInfo 发表于 2013-12-7 12:43
1、可以用脚本程序来进行插值
或者在上面的脚本程序里将获取的GridData (gData)存为Surfer ASCII 格点数 ...

好的,我按您的提示先试验一下,有问题再请教王老师!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-12-7 16:52:38 | 显示全部楼层
MeteoInfo 发表于 2013-12-7 12:43
1、可以用脚本程序来进行插值
或者在上面的脚本程序里将获取的GridData (gData)存为Surfer ASCII 格点数 ...

王老师,试着修改了一下脚本,将获取的GridData (gData)存为Surfer ASCII 格点数据。
把C#中版中用过的outfn = dataDir + "test.grd"
gData.SaveAsSurferASCIIFile(outfn),放到 java版的脚本里,提示属性错误,不能SaveAsSurferASCIIFile(outfn),请问一下java中这个命令应该怎么写?有没有可供查找此类命令的指南?谢谢。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-12-7 17:47:13 | 显示全部楼层
rceclx 发表于 2013-12-7 16:52
王老师,试着修改了一下脚本,将获取的GridData (gData)存为Surfer ASCII 格点数据。
把C#中版中用过的o ...

SaveAsSurferASCIIFile第一个字母小写saveAsSurferASCIIFile

可以下载一个jd-gui来查看MeteoInfoLib.jar文件中的类和方法等,源代码也可以看到呦。
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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