当前位置:   article > 正文

MeteoInfo-Java解析与绘图教程_java使用meteoinfo解析grb2气象文件详细教程

java使用meteoinfo解析grb2气象文件详细教程

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

上文我们说到,将地图叠加在色斑图上,但大部分都是卫星绘图,现在开始讲解micaps数据绘图,同样也是更多自定义
配置
首先我们解析micaps数据,将之前学到的东西拿过来绘图

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/293766
推荐阅读
相关标签
  

闽ICP备14008679号