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


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

上文我們說到,將地圖疊加在色斑圖上,但大部分都是衛星繪圖,現在開始講解micaps數據繪圖,同樣也是更多自定義配置

首先我們解析micaps數據,將之前學到的東西拿過來繪圖

MeteoDataInfo meteoDataInfo = new MeteoDataInfo();
meteoDataInfo.openMICAPSData("D:\\解析數據\\cldas\\cldas\\TEM\\20081000.000");
GridData grid = meteoDataInfo.getGridData();
//讀取地圖A
VectorLayer scmap = MapDataManage.readMapFile_ShapeFile("E:\\shp\\四川\\四川省(3)_市界.shp");
//描述地圖邊界線
PolygonBreak pb = (PolygonBreak) scmap.getLegendScheme().getLegendBreak(0);
//是否設置填充
pb.setDrawFill(false);
//設置輪廓大小
pb.setOutlineSize(2f);
//設置輪廓顏色
pb.setOutlineColor(Color.black);
//讀取色階
LegendScheme als = LgsUtil.readFromLgs("D:\\apache-tomcat-8.0.50\\alt色階\\color\\ECMWF_HR\\TMP.lgs");
//繪制圖層
VectorLayer layer = DrawMeteoData.createShadedLayer(grid,als,"","",true);
//創建視圖
MapView view = new MapView();
//疊加圖層
view.addLayer(layer);
view.addLayer(scmap);
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()+"/1.png");

可以看出來,micaps繪圖和衛星繪圖的區別只在解析數據openData的方法上,以及繪制圖層createShadedLayer上,這個方法是繪制色斑圖(等值圖),而createContourLayer是繪制等值線,可以切換試一試

當然實際使用的時候,圖一定是不需要這種的,例如四川的數據就應該只在四川區域呈現,其他區域就為空白,這里就涉及到了地圖切割,可以將圖層按照地圖邊界切割掉

 

        MeteoDataInfo meteoDataInfo = new MeteoDataInfo();
        meteoDataInfo.openMICAPSData("D:\\解析數據\\cldas\\cldas\\TEM\\20081000.000");
        GridData grid = meteoDataInfo.getGridData();
        //讀取地圖A
        VectorLayer scmap = MapDataManage.readMapFile_ShapeFile("C:\\Users\\Administrator\\Downloads\\好例子網_全國省、縣界線shp格式矢量圖(精確到縣區域)\\全國省、縣界線shp格式矢量圖(精確到縣區域)\\sichuan.shp");

        //讀取色階
        LegendScheme als = LgsUtil.readFromLgs("D:\\apache-tomcat-8.0.50\\alt色階\\color\\ECMWF_HR\\TMP.lgs");
        //繪制圖層
        VectorLayer layer = DrawMeteoData.createShadedLayer(grid,als,"","",true);
        //創建視圖
        MapView view = new MapView();
        layer = layer.clip(scmap);
        //疊加圖層
        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);
        //圖片存放地址
        String imagePath = PathUtil.getDeskPath()+"/1.png";
        layout.exportToPicture(imagePath);

        //透明處理
        //讀取圖片
        BufferedImage bi = ImageIO.read(new File(imagePath));
        //類型轉換
        BufferedImage img = new BufferedImage(bi.getWidth(), bi.getHeight(), BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = (Graphics2D) img.getGraphics();
        g.drawImage(bi, null, 0, 0);
        //透明處理
        int alpha = 0;
        for(int i=img.getMinY(); i<img.getHeight(); i++){
            for(int j=img.getMinX(); j<img.getWidth(); j++){
                int rgb = img.getRGB(j, i);
                //透明部分不需要處理
                if(rgb < 0){
                    int R = (rgb & 0xff0000) >> 16;
                    int G = (rgb & 0xff00) >> 8;
                    int B = (rgb & 0xff);
                    //將白色剔除
                    Color color = Color.white;
                    if(color.getRed() == R && color.getGreen() == G && color.getBlue() == B){
                        alpha = 0;
                    }
                    else {
                        alpha = 255;
                    }
                    rgb = (alpha << 24) | (rgb & 0x00ffffff);
                    img.setRGB(j, i, rgb);
                }
            }
        }
        //釋放資源
        g.dispose();
        ImageIO.write(img, "png", new File(imagePath));

首先我們需要注意到的是shp文件,如果不知道如何下載shp,可以直接去好例子網下載shp,現成的,很方便,這個shp文件我們需要的是省界,文件里面不要有市的信息,否則無法截個邊緣

第二點,我們將白色做了透明處理,這樣就成為了氣象行業需要的貼圖了,透明處理可以集成一個方法,我單純是為了方便才這樣寫


有一些時候我們需要在圖上看到城市邊界,此時我們就可以在加一個市界圖層,將圖層疊上去

        MeteoDataInfo meteoDataInfo = new MeteoDataInfo();
        meteoDataInfo.openMICAPSData("D:\\解析數據\\cldas\\cldas\\TEM\\20081000.000");
        GridData grid = meteoDataInfo.getGridData();
        //讀取地圖A
        VectorLayer scmap = MapDataManage.readMapFile_ShapeFile("C:\\Users\\Administrator\\Downloads\\好例子網_全國省、縣界線shp格式矢量圖(精確到縣區域)\\全國省、縣界線shp格式矢量圖(精確到縣區域)\\sichuan.shp");
        //讀取地圖B
        VectorLayer qgmap = MapDataManage.readMapFile_ShapeFile("E:\\shp\\四川\\四川省(3)_市界.shp");

        //描述地圖邊界線
        PolygonBreak pb = (PolygonBreak) qgmap.getLegendScheme().getLegendBreak(0);
        //是否設置填充
        pb.setDrawFill(false);
        //設置輪廓大小
        pb.setOutlineSize(2f);
        //設置輪廓顏色
        pb.setOutlineColor(Color.black);

        //讀取色階
        LegendScheme als = LgsUtil.readFromLgs("D:\\apache-tomcat-8.0.50\\alt色階\\color\\ECMWF_HR\\TMP.lgs");
        //繪制圖層
        VectorLayer layer = DrawMeteoData.createShadedLayer(grid,als,"","",true);
        //創建視圖
        MapView view = new MapView();
        layer = layer.clip(scmap);
        //疊加圖層
        view.addLayer(layer);
        view.addLayer(qgmap);

        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);
        //圖片存放地址
        String imagePath = PathUtil.getDeskPath()+"/1.png";
        layout.exportToPicture(imagePath);

        //透明處理
        //讀取圖片
        BufferedImage bi = ImageIO.read(new File(imagePath));
        //類型轉換
        BufferedImage img = new BufferedImage(bi.getWidth(), bi.getHeight(), BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = (Graphics2D) img.getGraphics();
        g.drawImage(bi, null, 0, 0);
        //透明處理
        int alpha = 0;
        for(int i=img.getMinY(); i<img.getHeight(); i++){
            for(int j=img.getMinX(); j<img.getWidth(); j++){
                int rgb = img.getRGB(j, i);
                //透明部分不需要處理
                if(rgb < 0){
                    int R = (rgb & 0xff0000) >> 16;
                    int G = (rgb & 0xff00) >> 8;
                    int B = (rgb & 0xff);
                    //將白色剔除
                    Color color = Color.white;
                    if(color.getRed() == R && color.getGreen() == G && color.getBlue() == B){
                        alpha = 0;
                    }
                    else {
                        alpha = 255;
                    }
                    rgb = (alpha << 24) | (rgb & 0x00ffffff);
                    img.setRGB(j, i, rgb);
                }
            }
        }
        //釋放資源
        g.dispose();
        ImageIO.write(img, "png", new File(imagePath));

  

 補充工具類說明:

public static LegendScheme readFromLgs(String path) throws Exception {
        LegendScheme scheme = new LegendScheme();
        scheme.importFromXMLFile(path, false);
        return scheme;
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM