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\\好例子網_全
//讀取色階
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();i<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("C:\\test\\2_1.png"));

首先我們需要注意到的是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格式矢量圖(精確到縣區域)\\Csichuan.shp");
//讀取地圖B
VectorLayer qgmap = MapDataManage.readMapFile_ShapeFile("E\\shp\\四川\\四川省(3)_市界.shp");
//描述地圖邊界線
PolygonBreak pb = (PolygonBreak) qgmapgetLegendScheme()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
//繪制圖層
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.getHeig
//設置地圖邊框
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_IN
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));

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/208306.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208306.shtml
英文地址,請注明出處:http://en.pswp.cn/news/208306.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用Binding的RelativeSource

一個Binding有明確的數據來源 可以通過Source或ElementName賦值的方法讓Binding與之關聯 但是有的時候我們不能確定作為Source的對象叫什么名字&#xff0c;但知道它與作為Binding目標的對象在UI上有相對關系&#xff0c;比如&#xff1a;空間自己關聯自己的某個數據、關聯自己…

Flutter代碼補全

有的時候屬性不經常使用&#xff0c;就想不起來該用啥&#xff0c;只有點點印象&#xff1b;只能用代碼補全功能&#xff0c;但我用了AS的默認操作發下并不好使&#xff0c;估計是快捷鍵沖突了。剛開始是不是下面的效果&#xff1a;這肯定不是我們想要的。 不怕&#xff0c;接下…

【S32DS報錯】-2-提示Error while launching command:arm-none-eabi-gdb –version錯誤

目錄 1 Error錯誤提示 2 Error錯誤原因 3 如何消除Error錯誤 結尾 【S32K3_MCAL從入門到精通】合集&#xff1a; S32K3_MCAL從入門到精通https://blog.csdn.net/qfmzhu/category_12519033.html 1 Error錯誤提示 使用S32DSJ-LinK下載程序&#xff0c;在Dedug Configurati…

計算機基礎知識67--BBS

遷移表格 # 以后你寫的每個python項目&#xff0c;都必須有一個txt文件叫 requirements.txt,里面放了當前項目所有的依賴&#xff0c;別人拿到項目---》需要執行 pip install -r requirements.txt # 裝好該項目所有依賴 django3.2.20 # 模塊 pillow mysqlclient # 主體項目功…

中東電商指南分享!盤點中東四大跨境電商平臺

提到跨境電商新藍海&#xff0c;就不得不想起土豪聚集地 ——中東&#xff0c;中東地區擁有龐大的人口、高人均GDP、強大的消費能力以及廣泛普及的互聯網&#xff0c;但外出購物卻相對不便&#xff0c;正是這一特點為中東跨境電商市場創造了巨大的優勢。隨著中東地區電商的崛起…

mycat實現分表操作、isinstance的使用、sqlalchemy的使用、mysql數據庫連接池

1 mycat實現分表操作 2 isinstance的使用 3 sqlalchemy的使用 4 mysql數據庫連接池 1 mycat實現分表操作 在 MySQL 數據庫中&#xff0c;Mycat 通常用于實現分片&#xff08;Sharding&#xff09;操作。分片是一種將大型數據庫水平拆分成多個較小數據庫的策略&#xff0c;以提…

Gan論文閱讀筆記

GAN論文閱讀筆記 2014年老論文了&#xff0c;主要記錄一些重要的東西。論文鏈接如下&#xff1a; Generative Adversarial Nets (neurips.cc) 文章目錄 GAN論文閱讀筆記出發點創新點設計訓練代碼網絡結構代碼測試代碼 出發點 Deep generative models have had less of an impac…

軟件壓力測試的重要性與用途

在當今數字化的時代&#xff0c;軟件已經成為幾乎所有行業不可或缺的一部分。隨著軟件應用規模的增加和用戶數量的上升&#xff0c;軟件的性能變得尤為關鍵。為了確保軟件在面對高并發和大負載時仍然能夠保持穩定性和可靠性&#xff0c;軟件壓力測試變得至關重要。下面是軟件壓…

提醒事項日歷同步怎么設置?可實時同步日歷的提醒事項工具

隨著生活節奏的加快&#xff0c;我們每天都需要處理許多瑣碎的事務。為了不忘記重要的事情&#xff0c;很多人選擇使用提醒事項工具來幫助自己。然而&#xff0c;市場上的提醒事項工具五花八門&#xff0c;有些并不具備日歷月視圖功能&#xff0c;也無法與手機日歷同步&#xf…

JavaScript 復雜的<三元運算符和比較操作>的組合--案例(一)

在逆向的時候,碰上有些復雜的js代碼,邏輯弄得人有點混; 因此本帖用來記錄一些棘手的代碼,方便自己記憶,也讓大家拓展認識~ ----前言 內容: function(e, t, n) {try {1 (e "{" e[0] ? JSON.parse(e) : JSON.parse(webInstace.shell(e))).Status || 200 e.Code…

Linux學習筆記7-IIC的應用和AP3216C

接下來進入其他兩種串行通信方式&#xff1a;SPI和I2C的學習&#xff0c;因為以后的項目中會用到這些通信方式&#xff0c;而且正點原子的開發板里面也有用I2C和SPI通信的傳感器來做實例&#xff0c;分別是一個距離傳感器和六軸陀螺儀&#xff0c;這樣就可以很好的通過實例來學…

GRE與順豐圓通快遞盒子

1. DNS污染 隨想&#xff1a; 在輸入一串網址后&#xff0c;會發生如下變化如果你在系統中配置了 Hosts 文件&#xff0c;那么電腦會先查詢 Hosts 文件如果 Hosts 里面沒有這個別名&#xff0c;就通過域名服務器查詢域名服務器回應了&#xff0c;那么你的電腦就可以根據域名服…

第六屆“強網”擬態防御國際精英挑戰賽——入圍戰隊篇

第六屆“強網”擬態防御國際精英挑戰賽即將于2023年12月6日在南京盛大開賽&#xff01;本屆挑戰賽再次為全球頂尖戰隊提供實戰機會&#xff0c;向多類擬態防御設備系統發起挑戰&#xff0c;在眾測實戰中持續檢驗中國制造內生安全數字產品所具有的中國力量。 本屆挑戰賽參賽戰隊…

【LeetCode:1466. 重新規劃路線 | DFS + 圖 + 樹】

&#x1f680; 算法題 &#x1f680; &#x1f332; 算法刷題專欄 | 面試必備算法 | 面試高頻算法 &#x1f340; &#x1f332; 越難的東西,越要努力堅持&#xff0c;因為它具有很高的價值&#xff0c;算法就是這樣? &#x1f332; 作者簡介&#xff1a;碩風和煒&#xff0c;…

Vue 子路由頁面發消息給主路由頁面 ,實現主頁面顯示子頁面的信息

需求 子頁面進入后&#xff0c;能在主頁面顯示子頁的相關信息&#xff0c;比如說主頁面的菜單激活的是哪個子頁面的菜單項 如上圖&#xff0c;當刷新瀏覽器頁面時&#xff0c;讓菜單的激活項仍保持在【最近瀏覽】。 實現方式&#xff1a; 在子頁面的create事件中增加&#xff…

Java File類詳解(下)練習一

練習 第一題 需求&#xff1a;在當前模塊下的aaa文件夾中創建一個a.txt文件 import java.io.File; import java.io.IOException;public class FileExer01 {public static void main(String[] args) throws IOException {File f1 new File("AllInOne\\aaa");f1.mk…

docker-compose腳本編寫關鍵詞詳解

docker-compose腳本編寫高頻關鍵詞&#xff08;一&#xff09; 此處關鍵詞應該必須能靈活運用 關鍵詞 解釋 例子 version 定義使用的docker-compose文件版本。較新的版本支持更豐富的功能和選項。 version: 3.8 services 定義應用程序的各個服務及其配置。每個服務通常…

Vue:繪制圖例

本文記錄使用Vue框架繪制圖例的代碼片段。 可以嵌入到cesium視圖中,也可以直接繪制到自己的原生系統中。 一、繪制圖例Vue組件 <div v-for="(color, index) in colors" :key="index" class="legend-item"><div class="color-…

深度學習還可以從如下方面進行創新!!

文章目錄 一、我認為可以從如下5個方向進行創新總結 一、我認為可以從如下5個方向進行創新 新的模型結構&#xff1a;盡管現在的深度學習模型已經非常強大&#xff0c;但是還有很多未被探索的模型結構。探索新的模型結構可以帶來更好的性能和更低的計算成本。 新的優化算法&a…

JavaScript數組面試題

JavaScript數組面試題 創建一個包含多個元素的數組&#xff0c;并打印輸出數組的內容。 const array ["apple", "banana", "orange"]; console.log(array);如何訪問數組中的特定元素&#xff1f; const array ["apple", "banan…