| 
 
	积分229贡献 精华在线时间 小时注册时间2013-10-17最后登录1970-1-1 
 | 
 
| 
本帖最后由 ycjtj1dx202ly 于 2013-10-30 20:56 编辑
x
登录后查看更多精彩内容~您需要 登录 才可以下载或查看,没有帐号?立即注册 
  
 此次教程实现从格点数据生成各种图层,主要包括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菜单中加入相应的子菜单,然后在各自的事件中输入相应的代码。
 代码如下:
 
      private void jMenuItem_ShadedActionPerformed(java.awt.event.ActionEvent evt) {                                                 
        // TODO add your handling code here:
        //Create a MeteoDataInfo object
        MeteoDataInfo aDataInfo = new MeteoDataInfo();
        //Open GrADS data file
        String dataDir = "E:\\MeteoInfo\\sample\\GrADS\\";
        String fileName = dataDir + "model.ctl";
        aDataInfo.openGrADSData(fileName);
        //Get GridData
        GridData press = aDataInfo.getGridData("PS");
        //Create a legend scheme
        LegendScheme aLS = LegendManage.createLegendSchemeFromGridData(press,LegendType.GraduatedColor, ShapeTypes.Polygon);
        //Create a shaded layer
        VectorLayer aLayer = DrawMeteoData.createShadedLayer(press, aLS, "Shaded_PS", "PS", true);
        //Add layer
        layersLegend1.getActiveMapFrame().addLayer(aLayer);
        layersLegend1.getActiveMapFrame().moveLayer(aLayer.getHandle(), 0);
        layersLegend1.repaint();
        //Change title of the layout
        LayoutGraphic aTitle = mapLayout1.getTexts().get(0);
        aTitle.setLabelText("MeteoInfo Class Library Demo - Shaded Layer");
        //Add or change the legend in layout
        LayoutLegend aLegend;
        if (this.mapLayout1.getLegends().size() > 0) {
            aLegend = mapLayout1.getLegends().get(0);
        } else {
            aLegend = mapLayout1.addLegend(650, 100);
        }
        aLegend.setLegendStyle(LegendStyles.Bar_Vertical);
        aLegend.setLegendLayer(aLayer);
        mapLayout1.paintGraphics();
    }                                                
    private void jMenuItem_GridFillActionPerformed(java.awt.event.ActionEvent evt) {                                                   
        // TODO add your handling code here:
        //Create a MeteoDataInfo object
        MeteoDataInfo aDataInfo = new MeteoDataInfo();
        //Open GrADS data file
        String dataDir = "E:\\MeteoInfo\\sample\\GrADS\\";
        String fileName = dataDir + "model.ctl";
        aDataInfo.openGrADSData(fileName);
        //Get GridData
        GridData press = aDataInfo.getGridData("PS");
        //Create a legend scheme
        LegendScheme aLS = LegendManage.createLegendSchemeFromGridData(press,LegendType.GraduatedColor, ShapeTypes.Polygon);
        //Create a shaded layer
        VectorLayer aLayer = DrawMeteoData.createGridFillLayer(press, aLS, "GridFill_PS", "PS");
        //Add layer
        layersLegend1.getActiveMapFrame().addLayer(aLayer);
        layersLegend1.getActiveMapFrame().moveLayer(aLayer.getHandle(), 0);
        layersLegend1.repaint();
        //Change title of the layout
        LayoutGraphic aTitle = mapLayout1.getTexts().get(0);
        aTitle.setLabelText("MeteoInfo Class Library Demo - Grid Fill Layer");
        //Add or change the legend in layout
        LayoutLegend aLegend;
        if (this.mapLayout1.getLegends().size() > 0) {
            aLegend = mapLayout1.getLegends().get(0);
        } else {
            aLegend = mapLayout1.addLegend(650, 100);
        }
        aLegend.setLegendStyle(LegendStyles.Bar_Vertical);
        aLegend.setLegendLayer(aLayer);
        mapLayout1.paintGraphics();
    }                                                  
    private void jMenuItem_GridPointActionPerformed(java.awt.event.ActionEvent evt) {                                                    
        // TODO add your handling code here:
        //Create a MeteoDataInfo object
        MeteoDataInfo aDataInfo = new MeteoDataInfo();
        //Open GrADS data file
        String dataDir = "E:\\MeteoInfo\\sample\\GrADS\\";
        String fileName = dataDir + "model.ctl";
        aDataInfo.openGrADSData(fileName);
        //Get GridData
        GridData press = aDataInfo.getGridData("PS");
        //Create a legend scheme
        LegendScheme aLS = LegendManage.createLegendSchemeFromGridData(press,LegendType.GraduatedColor, ShapeTypes.Point);
        //Create a shaded layer
        VectorLayer aLayer = DrawMeteoData.createGridPointLayer(press, aLS, "GridPoint_PS", "PS");
        //Add layer
        layersLegend1.getActiveMapFrame().addLayer(aLayer);
        layersLegend1.getActiveMapFrame().moveLayer(aLayer.getHandle(), 2);
        layersLegend1.repaint();
        //Change title of the layout
        LayoutGraphic aTitle = mapLayout1.getTexts().get(0);
        aTitle.setLabelText("MeteoInfo Class Library Demo - Grid Point Layer");
        //Add or change the legend in layout
        LayoutLegend aLegend;
        if (this.mapLayout1.getLegends().size() > 0) {
            aLegend = mapLayout1.getLegends().get(0);
        } else {
            aLegend = mapLayout1.addLegend(650, 100);
        }
        aLegend.setLegendStyle(LegendStyles.Bar_Vertical);
        aLegend.setLegendLayer(aLayer);
        mapLayout1.paintGraphics();
    }                                                   
    private void jMenuItem_RasterActionPerformed(java.awt.event.ActionEvent evt) {                                                 
        // TODO add your handling code here:
        //Create a MeteoDataInfo object
        MeteoDataInfo aDataInfo = new MeteoDataInfo();
        //Open GrADS data file
        String dataDir = "E:\\MeteoInfo\\sample\\GrADS\\";
        String fileName = dataDir + "model.ctl";
        aDataInfo.openGrADSData(fileName);
        //Get GridData
        GridData press = aDataInfo.getGridData("PS");
        //Create a legend scheme
        LegendScheme aLS = LegendManage.createLegendSchemeFromGridData(press,LegendType.GraduatedColor, ShapeTypes.Polygon);
        //Create a shaded layer
        RasterLayer aLayer = DrawMeteoData.createRasterLayer(press, "GridFill_PS", aLS);
        //Add layer
        layersLegend1.getActiveMapFrame().addLayer(aLayer);
        layersLegend1.getActiveMapFrame().moveLayer(aLayer.getHandle(), 0);
        layersLegend1.repaint();
        //Change title of the layout
        LayoutGraphic aTitle = mapLayout1.getTexts().get(0);
        aTitle.setLabelText("MeteoInfo Class Library Demo - Raster Layer");
        //Add or change the legend in layout
        LayoutLegend aLegend;
        if (this.mapLayout1.getLegends().size() > 0) {
            aLegend = mapLayout1.getLegends().get(0);
        } else {
            aLegend = mapLayout1.addLegend(650, 100);
        }
        aLegend.setLegendStyle(LegendStyles.Bar_Vertical);
        aLegend.setLegendLayer(aLayer);
        mapLayout1.paintGraphics();
    }
调试结果如下:
 
 
   
 
   
 
   
 
   
 然后是至少需要两个格点数据,风场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)
 同样的方法加入菜单,具体代码如下:
 
 
      private void jMenuItem_VectorActionPerformed(java.awt.event.ActionEvent evt) {                                                 
        // TODO add your handling code here:
        //Create a MeteoDataInfo object
        MeteoDataInfo aDataInfo = new MeteoDataInfo();
        //Open GrADS data file
        String dataDir = "E:\\MeteoInfo\\sample\\GrADS\\";
        String fileName = dataDir + "model.ctl";
        aDataInfo.openGrADSData(fileName);
        //Get GridData
        aDataInfo.setTimeIndex(2);
        aDataInfo.setLevelIndex(3);
        GridData tData = aDataInfo.getGridData("T");
        GridData uData = aDataInfo.getGridData("U");
        GridData vData = aDataInfo.getGridData("V");
        //Create a legend scheme
        LegendScheme aLS = LegendManage.createLegendSchemeFromGridData(tData, LegendType.GraduatedColor, ShapeTypes.Point);
        //Create a contour layer
        VectorLayer aLayer = DrawMeteoData.createGridVectorLayer(uData, vData, tData, aLS, true, "Vector_UV", true);
        //Add layer
        layersLegend1.getActiveMapFrame().addLayer(aLayer);
        layersLegend1.getActiveMapFrame().moveLayer(aLayer.getHandle(), 2);
        layersLegend1.repaint();
        //Change title of the layout
        LayoutGraphic aTitle = mapLayout1.getTexts().get(0);
        aTitle.setLabelText("MeteoInfo Class Library Demo - Wind Vector Layer");
        //Add or change the legend in layout
        LayoutLegend aLegend;
        if (mapLayout1.getLegends().size() > 0) {
            aLegend = mapLayout1.getLegends().get(0);
        } else {
            aLegend = mapLayout1.addLegend(650, 100);
        }
        aLegend.setLegendStyle(LegendStyles.Bar_Vertical);
        aLegend.setLegendLayer(aLayer);
        mapLayout1.paintGraphics();
    }                                                
    private void jMenuItem_BarbActionPerformed(java.awt.event.ActionEvent evt) {                                               
        // TODO add your handling code here:
        //Create a MeteoDataInfo object
        MeteoDataInfo aDataInfo = new MeteoDataInfo();
        //Open GrADS data file
        String dataDir = "E:\\MeteoInfo\\sample\\GrADS\\";
        String fileName = dataDir + "model.ctl";
        aDataInfo.openGrADSData(fileName);
        //Get GridData
        aDataInfo.setTimeIndex(2);
        aDataInfo.setLevelIndex(3);
        GridData uData = aDataInfo.getGridData("U");
        GridData vData = aDataInfo.getGridData("V");
        //Create a legend scheme
        LegendScheme aLS = LegendManage.createSingleSymbolLegendScheme(ShapeTypes.Point, Color.blue, 10);
        //Create a barb layer
        VectorLayer aLayer = DrawMeteoData.createGridBarbLayer(uData, vData, uData, aLS, false, "Barb_UV", true);
        //Add layer
        layersLegend1.getActiveMapFrame().addLayer(aLayer);
        layersLegend1.getActiveMapFrame().moveLayer(aLayer.getHandle(), 2);
        layersLegend1.repaint();
        //Change title of the layout
        LayoutGraphic aTitle = mapLayout1.getTexts().get(0);
        aTitle.setLabelText("MeteoInfo Class Library Demo - Wind Barb Layer");
    }                                              
    private void jMenuItem_StreamLineActionPerformed(java.awt.event.ActionEvent evt) {                                                     
        // TODO add your handling code here:
        //Create a MeteoDataInfo object
        MeteoDataInfo aDataInfo = new MeteoDataInfo();
        //Open GrADS data file
        String dataDir = "E:\\MeteoInfo\\sample\\GrADS\\";
        String fileName = dataDir + "model.ctl";
        aDataInfo.openGrADSData(fileName);
        //Get GridData
        aDataInfo.setTimeIndex(2);
        aDataInfo.setLevelIndex(3);
        GridData uData = aDataInfo.getGridData("U");
        GridData vData = aDataInfo.getGridData("V");
        //Create a legend scheme
        LegendScheme aLS = LegendManage.createSingleSymbolLegendScheme(ShapeTypes.Polyline, Color.blue, 1);
        //Create a contour layer
        VectorLayer aLayer = DrawMeteoData.createStreamlineLayer(uData, vData, 4, aLS, "Streamline_UV", true);
        //Add layer
        layersLegend1.getActiveMapFrame().addLayer(aLayer);
        layersLegend1.getActiveMapFrame().moveLayer(aLayer.getHandle(), 2);
        layersLegend1.repaint();
        //Change title of the layout
        LayoutGraphic aTitle = mapLayout1.getTexts().get(0);
        aTitle.setLabelText("MeteoInfo Class Library Demo - Wind streamline Layer");
    }
调试结果如下:
 
 
   
 
   
 
   
 
 
 
 | 
 |