MeteoInfo-Java解析与绘图教程(三)
阅读原文时间:2021年08月25日阅读:1

MeteoInfo-Java解析与绘图教程(三)

上文我们说到简单绘制色斑图(卫星云图),但那种效果可定不符合要求,一般来说,客户需要的是在地图上色斑图的叠加,或者是将图片导出分别是这两种效果

当然还有一种是将边界上的数据去除掉,例如下图,这种是数据生成色斑图,不适用卫星,所以卫星云图不会裁剪数据,留到下节说明

首先说第一种,在前端geoserver上叠加图层的实现方式

    MeteoDataInfo meteo = new MeteoDataInfo();  
    meteo.openAWXData("D:\\\\Download\\\\ANI\_VIS\_R04\_20210812\_0800\_FY2G.AWX");  
    GridData grid = meteo.getGridData();  
    //色阶文件  
    String colorPath = "D:\\\\apache-tomcat-8.0.50\\\\alt色阶\\\\AWX.pal";  
    //绘制图层  
    RasterLayer layer = DrawMeteoData.createRasterLayer(grid, "",colorPath);  
    //创建视图  
    MapView view = new MapView();  
    //叠加图层  
    view.addLayer(layer);  
    MapLayout layout  = new MapLayout();  
    //去除图形边框  
    layout.getActiveMapFrame().setDrawNeatLine(false);  
    //区域边界  
    Extent extent = view.getExtent();  
    //设置矩形的宽和高  
    Rectangle bounds = new Rectangle(800, (int) (800 \* 1D / extent.getWidth() \* extent.getHeight()));  
    //设置地图边框  
    layout.setPageBounds(new Rectangle(0, 0, bounds.width, bounds.height));  
    //设置页面边框  
    layout.getActiveMapFrame().setLayoutBounds(new Rectangle(0, 0, bounds.width, bounds.height));  
    layout.getActiveMapFrame().setMapView(view);  
    layout.exportToPicture(PathUtil.getDeskPath()+"/2.png");

这里我们需要注意的是区域边界是如何得出的,区域边界就是最大最小经纬度,而控制最大最小经纬度的度数就是数据,数据的本质就是二维数组,x与y就是经纬度,x和y对应的就是当前点的数值

下面就是第二种图片生成方式

    MeteoDataInfo meteo = new MeteoDataInfo();  
    meteo.openAWXData("D:\\\\Download\\\\ANI\_VIS\_R04\_20210812\_0800\_FY2G.AWX");  
    GridData grid = meteo.getGridData();  
    //色阶文件  
    String colorPath = "D:\\\\apache-tomcat-8.0.50\\\\alt色阶\\\\AWX.pal";  
    //绘制图层  
    RasterLayer layer = DrawMeteoData.createRasterLayer(grid, "",colorPath);

    //读取地图  
    VectorLayer xzmap = MapDataManage.readMapFile\_ShapeFile("C:\\\\Users\\\\Administrator\\\\Documents\\\\WXWork\\\\1688854031041609\\\\Cache\\\\File\\\\2021-08\\\\中国\_省界.shp");

    //描述地图边界线  
    PolygonBreak pb = (PolygonBreak) xzmap.getLegendScheme().getLegendBreak(0);  
    //是否设置填充  
    pb.setDrawFill(false);  
    //设置轮廓大小  

// pb.setOutlineSize(2f);
//设置轮廓颜色
pb.setOutlineColor(Color.white);
//创建视图
MapView view = new MapView();
//叠加图层
view.addLayer(layer);
view.addLayer(xzmap);
//创建地图页面设置类
MapLayout layout = new MapLayout();
//去除图形边框
layout.getActiveMapFrame().setDrawNeatLine(false);
//区域边界
Extent extent = xzmap.getExtent();
//设置矩形的宽和高
Rectangle bounds = new Rectangle(800, (int) (800 * 1D / extent.getWidth() * extent.getHeight()));
//设置地图边框
layout.setPageBounds(new Rectangle(0, 0, bounds.width+100, bounds.height+100));
//设置页面边框
layout.getActiveMapFrame().setLayoutBounds(new Rectangle(50, 50, bounds.width, bounds.height));
//设置缩放程度
view.zoomToExtent(extent);
//设置所有图层范围
view.setExtent(extent);
layout.getActiveMapFrame().setMapView(view);
layout.getActiveMapFrame().setDrawGridLine(true);

    layout.exportToPicture(PathUtil.getDeskPath()+"/2.png");

请注意,我将轮廓大小去除了,因为这个设置本质上是加粗样式,用了有些粗,所以一般都是使用默认配置

layout.getActiveMapFrame()这个方法就是获取活动布局图,是控制大部分样式的api,如果修改样式就是可以调用其中的api

下节讲解第三种图片生成方式