2022年10月16日 星期日

用matplotlib畫衛星雲圖

用另外一種方式畫衛星雲圖。這方法式結合了matplotlib、pyresample和cartopy

使用viridis這個色階畫出來長這樣。

2022年10月9日 星期日

色調強化衛星雲圖

色調強化雲圖簡單的來說,就是將紅外線雲圖依照溫度填上不同的顏色。

首先,必須有一張對照表,定義個溫度區間所要使用的顏色,然後再查表,找出資料灰度值所代表的溫度,我使用的高知大學提供的向日葵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')

2022年10月2日 星期日

再為雲圖上加上海岸線和經緯度線

延續前一篇文章,使用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的格式,否則海岸線和經緯線也會是黑白的。

2022年9月25日 星期日

衛星雲圖的投影,用pyresample

這個程式的目的是要做投影的轉換,原本高知大學提供的衛星雲圖是等經緯度的投影

等經緯度的投影轉換成其他投影,例如藍伯特投影(LCC),就需用到pyresample這套件。

2022年9月18日 星期日

使用2種衛星頻道,製作RGB合成雲圖

使用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的資料,就選軒蘭諾颱風。

2022年9月11日 星期日

讀取PGM檔並繪製衛星雲圖

將一筆衛星資料,畫出一筆灰階的衛星雲圖。

下載資料

從日本日本高知大學衛星資料庫下載一筆資料。 選取檔案格式為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讀取,讀進來的格式直接就是圖形的物件。

2022年9月4日 星期日

讀一張衛星雲圖再寫出去

寫一個python程式,讀一張衛星雲圖,經過一些處理之後,產生一個新的圖檔。
這個方法適用於各種圖檔,不一定是衛星雲圖。
首先,先到中央氣象局官網下載一張衛星雲圖,正好今天有個宣嵐諾颱風,於是我選了這張黑白的紅外線衛星雲圖。

用matplotlib畫衛星雲圖

用另外一種方式畫衛星雲圖。這方法式結合了matplotlib、pyresample和cartopy 使用viridis這個色階畫出來長這樣。