zoukankan      html  css  js  c++  java
  • MeteoInfoJava解析与绘图教程(六)

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

    这一节主要说的是我们取到自动站的数据,如何通过插值,转化成格点数据,并绘制图层

            //从数据库查询cimiss数据
            List<Map<String,Object>> list = DBUtil.getMapList("SELECT * FROM mete_stationpar_data_2021 WHERE DataTime = '2021-01-01 12:00:00' AND TEM IS NOT NULL");
            //创建站点格点
            StationData stationData = new StationData();
            //循环数据将值塞入格点中
            for (Map<String, Object> item : list) {
                System.out.println(item);
                stationData.addData(String.valueOf(item.get("Station_Name")),
                        Double.parseDouble(item.get("Lon").toString()),
                        Double.parseDouble(item.get("Lat").toString()),
                        Double.parseDouble(item.get("TEM").toString()));
            }
            //读取地图图层
            VectorLayer altMap = MapDataManage.readMapFile_ShapeFile("C:\\Users\\Administrator\\Downloads\\阿勒泰地区\\阿勒泰地区.shp");
            //创建网格设置参数
            GridDataSetting gridDataSetting = new GridDataSetting();
            //设定数据区域
            gridDataSetting.dataExtent = altMap.getExtent();
            //设定格点数
            gridDataSetting.xNum = list.size();
            gridDataSetting.yNum = list.size();
            //创建插值设置
            InterpolationSetting interpolationSetting = new InterpolationSetting();
            //设定格点配置
            interpolationSetting.setGridDataSetting(gridDataSetting);
            //设定插值方法
            interpolationSetting.setInterpolationMethod(InterpolationMethods.IDW_Radius);
            //设定搜索半径
            interpolationSetting.setRadius(10);
            //设置最小点数
            interpolationSetting.setMinPointNum(1);
            //插值到格点
            GridData gridData = stationData.interpolateData(interpolationSetting);
            LegendScheme als = LgsUtil.readFromLgs("D:\\apache-tomcat-8.0.50\\alt色阶\\color\\ECMWF_HR\\TMP.lgs");
            //绘制图层
            VectorLayer layer = DrawMeteoData.createShadedLayer(gridData,als,"","",true);
            //创建视图
            MapView view = new MapView();
            PolygonBreak pb = (PolygonBreak) altMap.getLegendScheme().getLegendBreak(0);
            pb.setDrawFill(false);
            pb.setOutlineColor(Color.GRAY);
            layer = layer.clip(altMap);
            //叠加图层
            view.addLayer(layer);
            view.addLayer(altMap);
    
    
            /**
             * 通用方法,可以抽成工具类
             */
            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");
    

    对于该方法主要有几个重点需要关注:

      1.GridDataSetting 它是对矩阵做了布局设置

      2.InterpolationSetting 它是对插值做了设置,InterpolationMethods就包含了几种插值法,但感觉效果最好的是IDW_Radius,而我们绘制的时候最舒服的方法还是克里金插值,如果可以的话,可以根据原理自己封装一个

    图片展示:

     

    简单的绘制基本上都结束了,我也在不停的研究,有新东西我会公布出来,如果大家也有想法可以私聊我来交流一下,让我们对气象开发更加简单舒服 

  • 相关阅读:
    制作Autorun的CD
    Sybase ASE MDA tables 装不上怎么办?
    对于TStringList.Find函数,我有话要说
    HH.exe CHM Operator Command.
    Delphi 7的一些常用的快捷键
    Explain Plan
    在Delphi中的Log
    subst windows下实用的磁盘映射工具
    Excel 2007 如何冻结多行&多列
    LinqToDataTable[转]
  • 原文地址:https://www.cnblogs.com/zdsgjh/p/15571067.html
Copyright © 2011-2022 走看看