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

上文我们说到,将地图叠加在色斑图上,但大部分都是卫星绘图,现在开始讲解micaps数据绘图,同样也是更多自定义配置

首先我们解析micaps数据,将之前学到的东西拿过来绘图

  1. 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是绘制等值线,可以切换试一试

当然实际使用的时候,图一定是不需要这种的,例如四川的数据就应该只在四川区域呈现,其他区域就为空白,这里就涉及到了地图切割,可以将图层按照地图边界切割掉

  1. MeteoDataInfo meteoDataInfo = new MeteoDataInfo();
  2. meteoDataInfo.openMICAPSData("D:\\解析数据\\cldas\\cldas\\TEM\\20081000.000");
  3. GridData grid = meteoDataInfo.getGridData();
  4. //读取地图A
  5. VectorLayer scmap = MapDataManage.readMapFile_ShapeFile("C:\\Users\\Administrator\\Downloads\\好例子网_全国省、县界线shp格式矢量图(精确到县区域)\\全国省、县界线shp格式矢量图(精确到县区域)\\sichuan.shp");
  6.  
  7. //读取色阶
  8. LegendScheme als = LgsUtil.readFromLgs("D:\\apache-tomcat-8.0.50\\alt色阶\\color\\ECMWF_HR\\TMP.lgs");
  9. //绘制图层
  10. VectorLayer layer = DrawMeteoData.createShadedLayer(grid,als,"","",true);
  11. //创建视图
  12. MapView view = new MapView();
  13. layer = layer.clip(scmap);
  14. //叠加图层
  15. view.addLayer(layer);
  16.  
  17. MapLayout layout = new MapLayout();
  18. //去除图形边框
  19. layout.getActiveMapFrame().setDrawNeatLine(false);
  20. //区域边界
  21. Extent extent = view.getExtent();
  22. //设置矩形的宽和高
  23. Rectangle bounds = new Rectangle(800, (int) (800 * 1D / extent.getWidth() * extent.getHeight()));
  24. //设置地图边框
  25. layout.setPageBounds(new Rectangle(0, 0, bounds.width, bounds.height));
  26. //设置页面边框
  27. layout.getActiveMapFrame().setLayoutBounds(new Rectangle(0, 0, bounds.width, bounds.height));
  28. layout.getActiveMapFrame().setMapView(view);
  29. //图片存放地址
  30. String imagePath = PathUtil.getDeskPath()+"/1.png";
  31. layout.exportToPicture(imagePath);
  32.  
  33. //透明处理
  34. //读取图片
  35. BufferedImage bi = ImageIO.read(new File(imagePath));
  36. //类型转换
  37. BufferedImage img = new BufferedImage(bi.getWidth(), bi.getHeight(), BufferedImage.TYPE_INT_ARGB);
  38. Graphics2D g = (Graphics2D) img.getGraphics();
  39. g.drawImage(bi, null, 0, 0);
  40. //透明处理
  41. int alpha = 0;
  42. for(int i=img.getMinY(); i<img.getHeight(); i++){
  43. for(int j=img.getMinX(); j<img.getWidth(); j++){
  44. int rgb = img.getRGB(j, i);
  45. //透明部分不需要处理
  46. if(rgb < 0){
  47. int R = (rgb & 0xff0000) >> 16;
  48. int G = (rgb & 0xff00) >> 8;
  49. int B = (rgb & 0xff);
  50. //将白色剔除
  51. Color color = Color.white;
  52. if(color.getRed() == R && color.getGreen() == G && color.getBlue() == B){
  53. alpha = 0;
  54. }
  55. else {
  56. alpha = 255;
  57. }
  58. rgb = (alpha << 24) | (rgb & 0x00ffffff);
  59. img.setRGB(j, i, rgb);
  60. }
  61. }
  62. }
  63. //释放资源
  64. g.dispose();
  65. ImageIO.write(img, "png", new File(imagePath));

首先我们需要注意到的是shp文件,如果不知道如何下载shp,可以直接去好例子网下载shp,现成的,很方便,这个shp文件我们需要的是省界,文件里面不要有市的信息,否则无法截个边缘

第二点,我们将白色做了透明处理,这样就成为了气象行业需要的贴图了,透明处理可以集成一个方法,我单纯是为了方便才这样写

有一些时候我们需要在图上看到城市边界,此时我们就可以在加一个市界图层,将图层叠上去

  1. MeteoDataInfo meteoDataInfo = new MeteoDataInfo();
  2. meteoDataInfo.openMICAPSData("D:\\解析数据\\cldas\\cldas\\TEM\\20081000.000");
  3. GridData grid = meteoDataInfo.getGridData();
  4. //读取地图A
  5. VectorLayer scmap = MapDataManage.readMapFile_ShapeFile("C:\\Users\\Administrator\\Downloads\\好例子网_全国省、县界线shp格式矢量图(精确到县区域)\\全国省、县界线shp格式矢量图(精确到县区域)\\sichuan.shp");
  6. //读取地图B
  7. VectorLayer qgmap = MapDataManage.readMapFile_ShapeFile("E:\\shp\\四川\\四川省(3)_市界.shp");
  8.  
  9. //描述地图边界线
  10. PolygonBreak pb = (PolygonBreak) qgmap.getLegendScheme().getLegendBreak(0);
  11. //是否设置填充
  12. pb.setDrawFill(false);
  13. //设置轮廓大小
  14. pb.setOutlineSize(2f);
  15. //设置轮廓颜色
  16. pb.setOutlineColor(Color.black);
  17.  
  18. //读取色阶
  19. LegendScheme als = LgsUtil.readFromLgs("D:\\apache-tomcat-8.0.50\\alt色阶\\color\\ECMWF_HR\\TMP.lgs");
  20. //绘制图层
  21. VectorLayer layer = DrawMeteoData.createShadedLayer(grid,als,"","",true);
  22. //创建视图
  23. MapView view = new MapView();
  24. layer = layer.clip(scmap);
  25. //叠加图层
  26. view.addLayer(layer);
  27. view.addLayer(qgmap);
  28.  
  29. MapLayout layout = new MapLayout();
  30. //去除图形边框
  31. layout.getActiveMapFrame().setDrawNeatLine(false);
  32. //区域边界
  33. Extent extent = view.getExtent();
  34. //设置矩形的宽和高
  35. Rectangle bounds = new Rectangle(800, (int) (800 * 1D / extent.getWidth() * extent.getHeight()));
  36. //设置地图边框
  37. layout.setPageBounds(new Rectangle(0, 0, bounds.width, bounds.height));
  38. //设置页面边框
  39. layout.getActiveMapFrame().setLayoutBounds(new Rectangle(0, 0, bounds.width, bounds.height));
  40. layout.getActiveMapFrame().setMapView(view);
  41. //图片存放地址
  42. String imagePath = PathUtil.getDeskPath()+"/1.png";
  43. layout.exportToPicture(imagePath);
  44.  
  45. //透明处理
  46. //读取图片
  47. BufferedImage bi = ImageIO.read(new File(imagePath));
  48. //类型转换
  49. BufferedImage img = new BufferedImage(bi.getWidth(), bi.getHeight(), BufferedImage.TYPE_INT_ARGB);
  50. Graphics2D g = (Graphics2D) img.getGraphics();
  51. g.drawImage(bi, null, 0, 0);
  52. //透明处理
  53. int alpha = 0;
  54. for(int i=img.getMinY(); i<img.getHeight(); i++){
  55. for(int j=img.getMinX(); j<img.getWidth(); j++){
  56. int rgb = img.getRGB(j, i);
  57. //透明部分不需要处理
  58. if(rgb < 0){
  59. int R = (rgb & 0xff0000) >> 16;
  60. int G = (rgb & 0xff00) >> 8;
  61. int B = (rgb & 0xff);
  62. //将白色剔除
  63. Color color = Color.white;
  64. if(color.getRed() == R && color.getGreen() == G && color.getBlue() == B){
  65. alpha = 0;
  66. }
  67. else {
  68. alpha = 255;
  69. }
  70. rgb = (alpha << 24) | (rgb & 0x00ffffff);
  71. img.setRGB(j, i, rgb);
  72. }
  73. }
  74. }
  75. //释放资源
  76. g.dispose();
  77. ImageIO.write(img, "png", new File(imagePath));

  

MeteoInfo-Java解析与绘图教程(四)的更多相关文章

  1. MeteoInfo-Java解析与绘图教程(一)

    MeteoInfo-Java解析与绘图教程(一) 已经进入开发行业很多年了,这两年一直从事气象开发行业,为此对气象绘图有了新的见解 像色斑图与卫星图一直都有python去绘制,在偶然的情况下,我接触到 ...

  2. MeteoInfo-Java解析与绘图教程(八)_java解析卫星FY-4A一级产品文件(HDF举例)

    MeteoInfo-Java解析与绘图教程(八)_java解析卫星一级产品文件(HDF举例) 最近解析卫星数据遇到了一级产品,它的解析方式与之前文章说的有些不同,特此补充一下 卫星的一级产品,里面是没 ...

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

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

  4. MeteoInfo-Java解析与绘图教程(五)

    MeteoInfo-Java解析与绘图教程(五) 最近太忙了,终于有时间继续写了,上文说到了基本上的绘图方法,但缺少色阶呈现,一般图叠加着地图上,后端不需要管色阶,但也要注意web页面色阶和我们的生成 ...

  5. MeteoInfo-Java解析与绘图教程(七)_图层添加站点名称或区域名称

    MeteoInfo-Java解析与绘图教程(七)_图层添加站点名称或区域名称 在上文说了用自动站的数据经过插值绘制色斑图,这种一般是在geoserver上叠加图片呈现,但遇到后端导出图片,我们又想添加 ...

  6. JAVA解析XML的四种方式

    java解析xml文件四种方式 1.介绍 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这 ...

  7. 【Java】详解Java解析XML的四种方法

    XML现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML.本文将详细介绍用Java解析XML的四种方法. AD: XML现在已经成为一种通用的数据交换格式,它的平台无关性,语 ...

  8. Java解析XML的四种方法详解 - 转载

    XML现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML.本文将详细介绍用Java解析XML的四种方法 在做一般的XML数据交换过程中,我更乐意传递XML字符串,而不是格式化 ...

  9. CPF 入门教程 - 绘图(四)

    CPF NetCore跨平台UI框架,增加了Vlc支持跨平台播放视频. 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - 样式和动画(三) CPF ...

随机推荐

  1. PDMan使用

    场景: 这几天项目要完结交付,需要补很多文档.此时发现甲方要求提供数据库设计文档,尽管我觉得他们不会看,但是人家要求,还是补一下吧!时间紧迫,要赶出整个项目的数据库设计文档比较麻烦,每个两三天不行.于 ...

  2. 论文笔记:(2019CVPR)PointConv: Deep Convolutional Networks on 3D Point Clouds

    目录 摘要 一.前言 1.1直接获取3D数据的传感器 1.2为什么用3D数据 1.3目前遇到的困难 1.4现有的解决方法及存在的问题 二.本文idea 2.1 idea来源 2.2 初始思路 2.3 ...

  3. 我所学的c语言

    c语言结构 #include <stdio.h> int main(){    /* 我的第一个 C 程序 */    printf("Hello, World! \n" ...

  4. [SQL]数据更新

    插入数据 插入单个元组 一般格式: insert into <表名> [<列名1>, <列明2>, --] -- 指出在表中新插入的值的列, values(< ...

  5. Spring Security项目的搭建以及Spring Security的BCrypt加密

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  6. RocketMQ原理分析&场景问题

    硬核干货分享,欢迎关注[Java补习课]成长的路上,我们一起前行 ! <高可用系列文章> 已收录在专栏,欢迎关注! 一.RocketMQ的基本原理 RocketMQ基本架构图如下 从这个架 ...

  7. golang web框架 kratos中的日志框架

    kratos是bilibili开源的一个web框架. 日志用法: logger.go package kratoslog import ( "flag" "github. ...

  8. 【Java笔记】以并发修改异常为例总结的出错解决办法

    先来看出错代码: /*需求: 遍历已有集合 如果在集合中发现存在字符串元素"world" 则在"world"后添加元素"javaee" */ ...

  9. 并发编程 Process 互斥锁

    进程理论 程序与进程的区别 ''' 程序不是存在硬盘上的代码,相对来说是静态的 进程表示程序在执行的过程,是动态的 ''' 进程的调度 先来先服务调度算法 '''对长作业有利,对短作业无益''' 短作 ...

  10. noip模拟6(T2更新

    由于蒟弱目前还没调出T1和T2,所以先写T3和T4.(T1T2更完辣! update in 6.12 07:19 T3 大佬 题目描述: 他发现katarina大佬真是太强了,于是就学习了一下kata ...