MeteoInfo-Java解析與繪圖教程(三)

只待時光靜好 發表於 2021-08-23
Java

MeteoInfo-Java解析與繪圖教程(三)

上文我們說到簡單繪製色斑圖(衛星雲圖),但那種效果可定不符合要求,一般來說,客戶需要的是在地圖上色斑圖的疊加,或者是將圖片匯出分別是這兩種效果

MeteoInfo-Java解析與繪圖教程(三)MeteoInfo-Java解析與繪圖教程(三)

當然還有一種是將邊界上的資料去除掉,例如下圖,這種是資料生成色斑圖,不適用衛星,所以衛星雲圖不會裁剪資料,留到下節說明

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

下節講解第三種圖片生成方式