用另外一種方式畫衛星雲圖。這方法式結合了matplotlib、pyresample和cartopy
使用viridis這個色階畫出來長這樣。
色調強化雲圖簡單的來說,就是將紅外線雲圖依照溫度填上不同的顏色。
首先,必須有一張對照表,定義個溫度區間所要使用的顏色,然後再查表,找出資料灰度值所代表的溫度,我使用的高知大學提供的向日葵8號衛星資料,附一個對照表,依照需求整理成下表。
依照表格,可以利用for迴圈把每一個格點的顏色填入。from PIL import Image import numpy as np import pyresample as pr from pycoast import ContourWriterAGG import aggdraw Source_def = pr.load_area('Table/Projection.proj','KoChi_1800') # 原始FDK資料的投影 Image_def = pr.load_area('Table/Projection.proj','LCC_1000') # 輸出圖檔的投影 PGMIR1='HMW822090416IR1.pgm' cntS = np.fromfile(PGMIR1,dtype='uint8') dsize=1800 arraysize=dsize*dsize cntS = cntS[-arraysize:] cntS = cntS.reshape((dsize,dsize)) RoI = 5000 # 取樣之影響半徑 Cnt = pr.kd_tree.resample_nearest(Source_def, cntS, Image_def, radius_of_influence=RoI) xs = Cnt.shape[0] ys = Cnt.shape[1] cntRGB = np.zeros((xs,ys,3),dtype=np.uint8) for x in range(xs) : for y in range(ys) : if Cnt[y,x] > 249 : # -90. : cntRGB[y,x,:] = [255,255,255] elif Cnt[y,x] >243 : #-80. : cntRGB[y,x,:] = [255,70,255] elif Cnt[y,x] >237 : # -70. : cntRGB[y,x,:] = [255,0,255] elif Cnt[y,x] > 230 : # -60. : cntRGB[y,x,:] = [0,200,200] elif Cnt[y,x] > 211 : #< -40. : cntRGB[y,x,:] = [0,0,0] elif Cnt[y,x] > 184 : # -20. : cntRGB[y,x,:] = [200,155,0] elif Cnt[y,x] > 149 : # 0. : cntRGB[y,x,:] = [0,145,0] elif Cnt[y,x] > 105: # 20. : cntRGB[y,x,:] = [0,40,255] else : cntRGB[y,x,:] = [0,40,200] Img_new = Image.fromarray(cntRGB,'RGB') ShapePath = 'Table/gshhg-shp-2.3.7' cw = ContourWriterAGG(ShapePath) cw.add_coastlines(Img_new,Image_def,resolution='l',outline=(255,0,0),width=2) ttfFile = 'Table/LiberationMono-Regular.ttf' font = aggdraw.Font('white',ttfFile) cw.add_grid(Img_new,Image_def,(20,20),(10,10),font,outline=(0,0,255),width=3) Img_new.show() Img_new.save('LCC_Enhance.png')
延續前一篇文章,使用pyresample轉換了衛星雲圖的投影。接下來要在圖上加上海岸線和經緯線。
from PIL import Image import numpy as np import pyresample as pr from pycoast import ContourWriterAGG import aggdraw Source_def = pr.load_area('Table/Projection.proj','KoChi_1800') # 原始FDK資料的投影 Image_def = pr.load_area('Table/Projection.proj','LCC_1000') # 輸出圖檔的投影 PGMIR1='HMW822090416IR1.pgm' cntS = np.fromfile(PGMIR1,dtype='uint8') dsize=1800 arraysize=dsize*dsize cntS = cntS[-arraysize:] cntS = cntS.reshape((dsize,dsize)) RoI = 5000 # 取樣之影響半徑 Cnt = pr.kd_tree.resample_nearest(Source_def, cntS, Image_def, radius_of_influence=RoI) Img = Image.fromarray(Cnt,'L') Img_new=Img.convert('RGB') #把灰階的Img轉換成RGB的Img_new
前面這些程式碼先把要輸出的圖準備好,注意,要把圖轉換成RBG的格式,否則海岸線和經緯線也會是黑白的。
這個程式的目的是要做投影的轉換,原本高知大學提供的衛星雲圖是等經緯度的投影
等經緯度的投影轉換成其他投影,例如藍伯特投影(LCC),就需用到pyresample這套件。
使用2種衛星頻道,製作RGB合成雲圖。
從日本日本高知大學衛星資料庫下載2筆資料。 選取檔案格式為Geo-coordinate mapped data for GAME research area. N70 - S20, E70 - E160. 1/20 degree resolution. 1800 x 1800 pixels. PGM (Portable Gray Map) format with Gzip compression.的資料。
選紅外線頻道IR1及IR2的資料,就選軒蘭諾颱風。
將一筆衛星資料,畫出一筆灰階的衛星雲圖。
從日本日本高知大學衛星資料庫下載一筆資料。 選取檔案格式為Geo-coordinate mapped data for GAME research area. N70 - S20, E70 - E160. 1/20 degree resolution. 1800 x 1800 pixels. PGM (Portable Gray Map) format with Gzip compression.的資料。
選一個紅外線頻道IR1的資料,就選上週的軒蘭諾颱風。有兩種讀寫方式,第一種是直接用PIL讀取,讀進來的格式直接就是圖形的物件。
用另外一種方式畫衛星雲圖。這方法式結合了matplotlib、pyresample和cartopy 使用viridis這個色階畫出來長這樣。