爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 37258|回复: 83

处理FY2E圆盘标称投影数据

[复制链接]

新浪微博达人勋

发表于 2014-11-16 18:21:31 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 MeteoInfo 于 2015-5-23 22:29 编辑

圆盘标称投影数据时静止气象卫星常见的数据产品,比如FY2E静止气象卫星就有很多这样的产品(可以从国家卫星气象中心网站上下载)。所谓的圆盘标称投影就是Geostationary投影,主要的投影参数有中央经度和卫星高度。这里给出一个示例脚本程序可以读取FY2E HDF格式数据、将数据投影为等经纬度并生成数据图层。需要最新的MeteoInfo Java版本(MeteoInfo Java 1.1.6R1,http://www.meteothinker.com)。

FY2E的HDF数据自描述得很粗糙,数据的范围(脚本中的xmin等)是自己调试出来的,如果有人知道确切的数据也请指出。

脚本程序:
  1. #-----------------------------------------------------# Author: Yaqiang Wang
  2. # Date: 2014-11-16
  3. # Purpose: Read FY2E hdf5 data
  4. # Note: Sample
  5. #-----------------------------------------------------
  6. from org.meteoinfo.data.meteodata import MeteoDataInfo
  7. from org.meteoinfo.data.meteodata import Dimension
  8. from org.meteoinfo.data.meteodata import DimensionType
  9. from org.meteoinfo.data.meteodata import DrawMeteoData
  10. from org.meteoinfo.projection import ProjectionInfo
  11. from org.meteoinfo.projection import KnownCoordinateSystems
  12. from org.meteoinfo.legend import LegendManage
  13. from org.meteoinfo.legend import LegendType
  14. from org.meteoinfo.shape import ShapeTypes
  15. import os.path
  16. import jarray

  17. #Set data directory
  18. dataDir = 'D:/Temp/hdf/'

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

  21. projInfo = ProjectionInfo("+proj=geos +lon_0=104.5 +h=35785864")

  22. #Read hdf data file
  23. #fn = dataDir + 'FY2E_CTA_MLT_NOM_20141116_0200.hdf'
  24. fn = dataDir + 'FY2E_FDI_ALL_NOM_20110713_0100.hdf'
  25. if os.path.isfile(fn):
  26.         print fn
  27.         mdi.openNetCDFData(fn)
  28.         dataInfo = mdi.getDataInfo()
  29.         print mdi.getInfoText()
  30.         xmin = -5750000.0
  31.         ymin = -5750000.0
  32.         xnum = 2288
  33.         ynum = 2288
  34.         xmax = 5750000.0
  35.         ymax = 5750000.0
  36.         xdelt = (xmax - xmin) / xnum
  37.         ydelt = (ymax - ymin) / ynum
  38.         xlist = []
  39.         ylist = []
  40.         for i in range(0,xnum):
  41.                 xlist.append(xmin + xdelt * i)
  42.         for i in range(0,ynum):
  43.                 ylist.append(ymin + ydelt * i)

  44.         X = jarray.array(xlist, 'd')
  45.         Y = jarray.array(ylist, 'd')
  46.         xDim = Dimension(DimensionType.X)
  47.         xDim.setValues(X)
  48.         dataInfo.setXDimension(xDim)
  49.         yDim = Dimension(DimensionType.Y)
  50.         yDim.setValues(Y)
  51.         dataInfo.setYDimension(yDim)
  52.         #var = dataInfo.getVariable('FY2E_CLM_Hourly_Cloud_Amount')
  53.         var = dataInfo.getVariable('NOMChannelVIS')
  54.         dimList = [yDim, xDim]
  55.         var.setDimensions(dimList)
  56.         print 'Get grid data...'
  57.         gData = mdi.getGridData(var.getName())        
  58.         gData.yReverse()
  59.         gData.projInfo = projInfo
  60.         #gData.missingValue = 0.0
  61.         print 'Reproject grid data to Lon/Lat...'
  62.         toProj = KnownCoordinateSystems.geographic.world.WGS1984
  63.         gData = gData.project(toProj)
  64.         print 'Ouput grid data to Sufer ASCII grid data file...'
  65.         outfn = 'D:/Temp/test/NOMChannelVIS.grd'
  66.         gData.saveAsSurferASCIIFile(outfn)
  67.         print 'Create raster layer from the grid data...'
  68.         aLS = LegendManage.createLegendSchemeFromGridData(gData, LegendType.GraduatedColor, ShapeTypes.Polygon)
  69.         aLayer = DrawMeteoData.createRasterLayer(gData, "Test_FY2E", aLS)
  70.         #aLayer = DrawMeteoData.createShadedLayer(gData, aLS, 'Test_HDF_Shaded', 'AOD', True)
  71.         aLayer.setProjInfo(toProj)
  72.         #aLayer.setProjInfo(projInfo)
  73.         print 'Add the layer...'
  74.         mf = miapp.getMapDocument().getActiveMapFrame()
  75.         mf.addLayer(aLayer)
  76.         mf.moveLayer(aLayer, 0)

  77. print 'Finished!'


数据本身投影的图层:
Image00052 (2).png
Image00051 (2).png


投影为等经纬度数据:
Image00053 (2).png


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

新浪微博达人勋

发表于 2014-11-16 18:57:18 | 显示全部楼层
高端 大气 上档次,好好学习一下
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-11-17 03:52:33 | 显示全部楼层
本帖最后由 沙颖凯 于 2014-11-16 14:40 编辑

脚本的语法看着像Python. 楼主的MeteoInfo有基于Python的部分吗?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-11-17 09:20:10 | 显示全部楼层
沙颖凯 发表于 2014-11-17 03:52
脚本的语法看着像Python. 楼主的MeteoInfo有基于Python的部分吗?

脚本语言是Jython,Python的一个分支,用Java语言开发的,所以能方便的调用各类Java库。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-11-17 14:56:45 | 显示全部楼层
本帖最后由 沙颖凯 于 2014-11-17 00:00 编辑
MeteoInfo 发表于 2014-11-16 18:20
脚本语言是Jython,Python的一个分支,用Java语言开发的,所以能方便的调用各类Java库。

楼主有CPython(我想说的是通常意义上的Python)的MeteoInfo模块吗,或者近期有做这件事的计划吗?我对其中数据I/O和一些数据处理的模块很感兴趣。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-11-17 16:20:12 | 显示全部楼层
Beautiful.希望有朝一日在全世界普及
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-11-17 17:03:57 | 显示全部楼层
沙颖凯 发表于 2014-11-17 14:56
楼主有CPython(我想说的是通常意义上的Python)的MeteoInfo模块吗,或者近期有做这件事的计划吗?我对其 ...

没有,这个不是想有就能有的,工作量巨大。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-11-17 21:32:40 | 显示全部楼层
王老师,这个数据有专门的经纬度文件 ,和数据的的大小长度是一样的,都是2288*2288个经度和纬度数据,这些经纬度数据就是数据集里每个数据在地球上的位置。我用micaps打开同一个卫星数据,发现你画的图和micaps上的是相反的。这个卫星数据是从西往东,从南往北的。也就是说有两个问题,一个就是数据范围的问题,标称投影有专门的经纬度数据;第二个就是数据图层弄反了
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-11-17 22:43:35 | 显示全部楼层
leikunjiang 发表于 2014-11-17 21:32
王老师,这个数据有专门的经纬度文件 ,和数据的的大小长度是一样的,都是2288*2288个经度和纬度数据,这些 ...

数据南北反向的问题已解决(见1楼帖子),在脚本中加一句:
gData.yReverse()

另一个问题“一个就是数据范围的问题,标称投影有专门的经纬度数据”,不知道你想表达什么意思?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-11-18 04:10:52 | 显示全部楼层
MeteoInfo 发表于 2014-11-17 02:03
没有,这个不是想有就能有的,工作量巨大。

我想我可以做一些这方面的事情,比如基于楼主的源代码写Python的模块之类,问下楼主的MeteoInfo是不是开源的,如果代码有托管在三方网站上就更好了。
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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