爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 12050|回复: 19

MeteoInfo Java版二次开发教程六

[复制链接]

新浪微博达人勋

发表于 2013-10-30 20:57:11 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 ycjtj1dx202ly 于 2013-10-30 20:56 编辑

此次教程实现从格点数据生成各种图层,主要包括Contour(等值线)、Shaded(等值填充)、Grid_Fill(格点填充)、Grid_Point(格点点图层)、Raster(栅格图层)、Vector(风场矢量)、Barb(风向杆)、Streamline(流场)。
首先先来实现只需要一个格点数据(GridData)的Contour、Shaded、Grid_Fill、Grid_Point和Raster图层。获取格点数据后需要生成图例,再用DrawMeteoData类的一些静态方法来从GridData创建各种图层:
Contour:  DrawMeteoData.createContourLayer(GridData gridData, LegendScheme aLS, String layerName, String fieldName, boolean isSmooth)
Shaded:  DrawMeteoData.createShadedLayer(GridData gridData, LegendScheme aLS, String layerName, String fieldName, boolean isSmooth)
Grid_Fill:  DrawMeteoData.createGridFillLayer(GridData gridData, LegendScheme aLS, String LName, String fieldName)
Grid_Point:  DrawMeteoData.createGridPointLayer(GridData gridData, LegendScheme aLS, String LName, String fieldName)
Raster:  DrawMeteoData.createRasterLayer(GridData GridData, String LName, LegendScheme aLS)
首先还是在MeteoData菜单下GrADS Data菜单中加入相应的子菜单,然后在各自的事件中输入相应的代码。
代码如下:
  1.     private void jMenuItem_ShadedActionPerformed(java.awt.event.ActionEvent evt) {                                                
  2.         // TODO add your handling code here:
  3.         //Create a MeteoDataInfo object
  4.         MeteoDataInfo aDataInfo = new MeteoDataInfo();

  5.         //Open GrADS data file
  6.         String dataDir = "E:\\MeteoInfo\\sample\\GrADS\\";
  7.         String fileName = dataDir + "model.ctl";
  8.         aDataInfo.openGrADSData(fileName);

  9.         //Get GridData
  10.         GridData press = aDataInfo.getGridData("PS");

  11.         //Create a legend scheme
  12.         LegendScheme aLS = LegendManage.createLegendSchemeFromGridData(press,LegendType.GraduatedColor, ShapeTypes.Polygon);

  13.         //Create a shaded layer
  14.         VectorLayer aLayer = DrawMeteoData.createShadedLayer(press, aLS, "Shaded_PS", "PS", true);

  15.         //Add layer
  16.         layersLegend1.getActiveMapFrame().addLayer(aLayer);
  17.         layersLegend1.getActiveMapFrame().moveLayer(aLayer.getHandle(), 0);
  18.         layersLegend1.repaint();

  19.         //Change title of the layout
  20.         LayoutGraphic aTitle = mapLayout1.getTexts().get(0);
  21.         aTitle.setLabelText("MeteoInfo Class Library Demo - Shaded Layer");

  22.         //Add or change the legend in layout
  23.         LayoutLegend aLegend;
  24.         if (this.mapLayout1.getLegends().size() > 0) {
  25.             aLegend = mapLayout1.getLegends().get(0);
  26.         } else {
  27.             aLegend = mapLayout1.addLegend(650, 100);
  28.         }
  29.         aLegend.setLegendStyle(LegendStyles.Bar_Vertical);
  30.         aLegend.setLegendLayer(aLayer);
  31.         mapLayout1.paintGraphics();
  32.     }                                                

  33.     private void jMenuItem_GridFillActionPerformed(java.awt.event.ActionEvent evt) {                                                   
  34.         // TODO add your handling code here:
  35.         //Create a MeteoDataInfo object
  36.         MeteoDataInfo aDataInfo = new MeteoDataInfo();

  37.         //Open GrADS data file
  38.         String dataDir = "E:\\MeteoInfo\\sample\\GrADS\\";
  39.         String fileName = dataDir + "model.ctl";
  40.         aDataInfo.openGrADSData(fileName);

  41.         //Get GridData
  42.         GridData press = aDataInfo.getGridData("PS");

  43.         //Create a legend scheme
  44.         LegendScheme aLS = LegendManage.createLegendSchemeFromGridData(press,LegendType.GraduatedColor, ShapeTypes.Polygon);

  45.         //Create a shaded layer
  46.         VectorLayer aLayer = DrawMeteoData.createGridFillLayer(press, aLS, "GridFill_PS", "PS");

  47.         //Add layer
  48.         layersLegend1.getActiveMapFrame().addLayer(aLayer);
  49.         layersLegend1.getActiveMapFrame().moveLayer(aLayer.getHandle(), 0);
  50.         layersLegend1.repaint();

  51.         //Change title of the layout
  52.         LayoutGraphic aTitle = mapLayout1.getTexts().get(0);
  53.         aTitle.setLabelText("MeteoInfo Class Library Demo - Grid Fill Layer");

  54.         //Add or change the legend in layout
  55.         LayoutLegend aLegend;
  56.         if (this.mapLayout1.getLegends().size() > 0) {
  57.             aLegend = mapLayout1.getLegends().get(0);
  58.         } else {
  59.             aLegend = mapLayout1.addLegend(650, 100);
  60.         }
  61.         aLegend.setLegendStyle(LegendStyles.Bar_Vertical);
  62.         aLegend.setLegendLayer(aLayer);
  63.         mapLayout1.paintGraphics();
  64.     }                                                  

  65.     private void jMenuItem_GridPointActionPerformed(java.awt.event.ActionEvent evt) {                                                   
  66.         // TODO add your handling code here:
  67.         //Create a MeteoDataInfo object
  68.         MeteoDataInfo aDataInfo = new MeteoDataInfo();

  69.         //Open GrADS data file
  70.         String dataDir = "E:\\MeteoInfo\\sample\\GrADS\\";
  71.         String fileName = dataDir + "model.ctl";
  72.         aDataInfo.openGrADSData(fileName);

  73.         //Get GridData
  74.         GridData press = aDataInfo.getGridData("PS");

  75.         //Create a legend scheme
  76.         LegendScheme aLS = LegendManage.createLegendSchemeFromGridData(press,LegendType.GraduatedColor, ShapeTypes.Point);

  77.         //Create a shaded layer
  78.         VectorLayer aLayer = DrawMeteoData.createGridPointLayer(press, aLS, "GridPoint_PS", "PS");

  79.         //Add layer
  80.         layersLegend1.getActiveMapFrame().addLayer(aLayer);
  81.         layersLegend1.getActiveMapFrame().moveLayer(aLayer.getHandle(), 2);
  82.         layersLegend1.repaint();

  83.         //Change title of the layout
  84.         LayoutGraphic aTitle = mapLayout1.getTexts().get(0);
  85.         aTitle.setLabelText("MeteoInfo Class Library Demo - Grid Point Layer");

  86.         //Add or change the legend in layout
  87.         LayoutLegend aLegend;
  88.         if (this.mapLayout1.getLegends().size() > 0) {
  89.             aLegend = mapLayout1.getLegends().get(0);
  90.         } else {
  91.             aLegend = mapLayout1.addLegend(650, 100);
  92.         }
  93.         aLegend.setLegendStyle(LegendStyles.Bar_Vertical);
  94.         aLegend.setLegendLayer(aLayer);
  95.         mapLayout1.paintGraphics();
  96.     }                                                   

  97.     private void jMenuItem_RasterActionPerformed(java.awt.event.ActionEvent evt) {                                                
  98.         // TODO add your handling code here:
  99.         //Create a MeteoDataInfo object
  100.         MeteoDataInfo aDataInfo = new MeteoDataInfo();

  101.         //Open GrADS data file
  102.         String dataDir = "E:\\MeteoInfo\\sample\\GrADS\\";
  103.         String fileName = dataDir + "model.ctl";
  104.         aDataInfo.openGrADSData(fileName);

  105.         //Get GridData
  106.         GridData press = aDataInfo.getGridData("PS");

  107.         //Create a legend scheme
  108.         LegendScheme aLS = LegendManage.createLegendSchemeFromGridData(press,LegendType.GraduatedColor, ShapeTypes.Polygon);

  109.         //Create a shaded layer
  110.         RasterLayer aLayer = DrawMeteoData.createRasterLayer(press, "GridFill_PS", aLS);

  111.         //Add layer
  112.         layersLegend1.getActiveMapFrame().addLayer(aLayer);
  113.         layersLegend1.getActiveMapFrame().moveLayer(aLayer.getHandle(), 0);
  114.         layersLegend1.repaint();

  115.         //Change title of the layout
  116.         LayoutGraphic aTitle = mapLayout1.getTexts().get(0);
  117.         aTitle.setLabelText("MeteoInfo Class Library Demo - Raster Layer");

  118.         //Add or change the legend in layout
  119.         LayoutLegend aLegend;
  120.         if (this.mapLayout1.getLegends().size() > 0) {
  121.             aLegend = mapLayout1.getLegends().get(0);
  122.         } else {
  123.             aLegend = mapLayout1.addLegend(650, 100);
  124.         }
  125.         aLegend.setLegendStyle(LegendStyles.Bar_Vertical);
  126.         aLegend.setLegendLayer(aLayer);
  127.         mapLayout1.paintGraphics();
  128.     }

调试结果如下:

1.png

2.png

3.png

4.png

然后是至少需要两个格点数据,风场U、V分量或者风速、风向Vector(风场矢量)、Barb(风向杆)、Streamline(流场)。
model.ctl/model.dat数据里是U、V分量,所以这里只示例了这种情况,风速、风向的情况也很类似。MeteoDataInfo对象里可以设置setTiimeIndex()和setLevelIndex()来获得不同时次是高度的某变量的格点数据,由于地面风场只有海洋区域有,因此可以将setLevelIndex()设的大些。用getGridData方法获取风场U、V分量的GridData,然后就可以用DrawMeteoData类中的相应方法来创建Vector、Barb和Streamline图层了。其中Vector和Barb图层还可以根据第三个变量来设置图元的颜色,以便显示更丰富的信息。
DrawMeteoData类中创建Vector、Barb和Streamline的方法如下:
Vector:  DrawMeteoData.createGridVectorLayer(GridData uData, GridData vData, GridData gridData,
            LegendScheme aLS, boolean ifColor, String lName, boolean isUV)
Barb:  DrawMeteoData.createGridBarbLayer(GridData uData, GridData vData, GridData gridData,
            LegendScheme aLS, boolean ifColor, String lName, boolean isUV)
Streamline:  DrawMeteoData.createStreamlineLayer(GridData uData, GridData vData, int density, LegendScheme aLS,
            String lName, boolean isUV)
同样的方法加入菜单,具体代码如下:

  1.     private void jMenuItem_VectorActionPerformed(java.awt.event.ActionEvent evt) {                                                
  2.         // TODO add your handling code here:
  3.         //Create a MeteoDataInfo object
  4.         MeteoDataInfo aDataInfo = new MeteoDataInfo();

  5.         //Open GrADS data file
  6.         String dataDir = "E:\\MeteoInfo\\sample\\GrADS\\";
  7.         String fileName = dataDir + "model.ctl";
  8.         aDataInfo.openGrADSData(fileName);

  9.         //Get GridData
  10.         aDataInfo.setTimeIndex(2);
  11.         aDataInfo.setLevelIndex(3);
  12.         GridData tData = aDataInfo.getGridData("T");
  13.         GridData uData = aDataInfo.getGridData("U");
  14.         GridData vData = aDataInfo.getGridData("V");

  15.         //Create a legend scheme
  16.         LegendScheme aLS = LegendManage.createLegendSchemeFromGridData(tData, LegendType.GraduatedColor, ShapeTypes.Point);

  17.         //Create a contour layer
  18.         VectorLayer aLayer = DrawMeteoData.createGridVectorLayer(uData, vData, tData, aLS, true, "Vector_UV", true);

  19.         //Add layer
  20.         layersLegend1.getActiveMapFrame().addLayer(aLayer);
  21.         layersLegend1.getActiveMapFrame().moveLayer(aLayer.getHandle(), 2);
  22.         layersLegend1.repaint();

  23.         //Change title of the layout
  24.         LayoutGraphic aTitle = mapLayout1.getTexts().get(0);
  25.         aTitle.setLabelText("MeteoInfo Class Library Demo - Wind Vector Layer");

  26.         //Add or change the legend in layout
  27.         LayoutLegend aLegend;
  28.         if (mapLayout1.getLegends().size() > 0) {
  29.             aLegend = mapLayout1.getLegends().get(0);
  30.         } else {
  31.             aLegend = mapLayout1.addLegend(650, 100);
  32.         }
  33.         aLegend.setLegendStyle(LegendStyles.Bar_Vertical);
  34.         aLegend.setLegendLayer(aLayer);
  35.         mapLayout1.paintGraphics();
  36.     }                                                

  37.     private void jMenuItem_BarbActionPerformed(java.awt.event.ActionEvent evt) {                                               
  38.         // TODO add your handling code here:
  39.         //Create a MeteoDataInfo object
  40.         MeteoDataInfo aDataInfo = new MeteoDataInfo();

  41.         //Open GrADS data file
  42.         String dataDir = "E:\\MeteoInfo\\sample\\GrADS\\";
  43.         String fileName = dataDir + "model.ctl";
  44.         aDataInfo.openGrADSData(fileName);

  45.         //Get GridData
  46.         aDataInfo.setTimeIndex(2);
  47.         aDataInfo.setLevelIndex(3);
  48.         GridData uData = aDataInfo.getGridData("U");
  49.         GridData vData = aDataInfo.getGridData("V");

  50.         //Create a legend scheme
  51.         LegendScheme aLS = LegendManage.createSingleSymbolLegendScheme(ShapeTypes.Point, Color.blue, 10);

  52.         //Create a barb layer
  53.         VectorLayer aLayer = DrawMeteoData.createGridBarbLayer(uData, vData, uData, aLS, false, "Barb_UV", true);

  54.         //Add layer
  55.         layersLegend1.getActiveMapFrame().addLayer(aLayer);
  56.         layersLegend1.getActiveMapFrame().moveLayer(aLayer.getHandle(), 2);
  57.         layersLegend1.repaint();

  58.         //Change title of the layout
  59.         LayoutGraphic aTitle = mapLayout1.getTexts().get(0);
  60.         aTitle.setLabelText("MeteoInfo Class Library Demo - Wind Barb Layer");
  61.     }                                             

  62.     private void jMenuItem_StreamLineActionPerformed(java.awt.event.ActionEvent evt) {                                                     
  63.         // TODO add your handling code here:
  64.         //Create a MeteoDataInfo object
  65.         MeteoDataInfo aDataInfo = new MeteoDataInfo();

  66.         //Open GrADS data file
  67.         String dataDir = "E:\\MeteoInfo\\sample\\GrADS\\";
  68.         String fileName = dataDir + "model.ctl";
  69.         aDataInfo.openGrADSData(fileName);

  70.         //Get GridData
  71.         aDataInfo.setTimeIndex(2);
  72.         aDataInfo.setLevelIndex(3);
  73.         GridData uData = aDataInfo.getGridData("U");
  74.         GridData vData = aDataInfo.getGridData("V");

  75.         //Create a legend scheme
  76.         LegendScheme aLS = LegendManage.createSingleSymbolLegendScheme(ShapeTypes.Polyline, Color.blue, 1);

  77.         //Create a contour layer
  78.         VectorLayer aLayer = DrawMeteoData.createStreamlineLayer(uData, vData, 4, aLS, "Streamline_UV", true);

  79.         //Add layer
  80.         layersLegend1.getActiveMapFrame().addLayer(aLayer);
  81.         layersLegend1.getActiveMapFrame().moveLayer(aLayer.getHandle(), 2);
  82.         layersLegend1.repaint();

  83.         //Change title of the layout
  84.         LayoutGraphic aTitle = mapLayout1.getTexts().get(0);
  85.         aTitle.setLabelText("MeteoInfo Class Library Demo - Wind streamline Layer");
  86.     }

调试结果如下:

5.png

6.png

7.png



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

新浪微博达人勋

发表于 2013-10-30 21:12:11 | 显示全部楼层
完全不懂的飘过。。。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-10-31 12:10:37 | 显示全部楼层
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-6-20 16:49:09 | 显示全部楼层
本科生学习中
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-7-18 22:11:19 | 显示全部楼层
请问,我openmicaps数据后,应该用哪个方法get?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-7-19 12:58:40 | 显示全部楼层
刘小宝 发表于 2014-7-18 22:11
请问,我openmicaps数据后,应该用哪个方法get?

MICAPS数据又分很多类(具体请参考相关资料),如果是格点数据就用这个帖子里讲的方法,如果是站点数据就按照站点数据教程贴去做。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-7-19 15:51:51 | 显示全部楼层
MeteoInfo 发表于 2014-7-19 12:58
MICAPS数据又分很多类(具体请参考相关资料),如果是格点数据就用这个帖子里讲的方法,如果是站点数据就 ...

感谢指导,学习中
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-7-19 16:33:09 | 显示全部楼层
MeteoInfo 发表于 2014-7-19 12:58
MICAPS数据又分很多类(具体请参考相关资料),如果是格点数据就用这个帖子里讲的方法,如果是站点数据就 ...

王老师,还有个小问题,我看您的程序中打开MICAPS站点数据后可以画出等值线,站点数据也可以画等值线吗?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-7-19 17:22:23 | 显示全部楼层
刘小宝 发表于 2014-7-19 16:33
王老师,还有个小问题,我看您的程序中打开MICAPS站点数据后可以画出等值线,站点数据也可以画等值线吗?

站点数据先插值为格点数据就可以做等值线了
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-7-19 17:27:16 | 显示全部楼层
MeteoInfo 发表于 2014-7-19 17:22
站点数据先插值为格点数据就可以做等值线了

恩恩,很强大,不断学习中
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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