Jung-Bin Wang things speak by themself

雷達能看到多低的雲?! 使用wradlib套件繪製雷達地形遮蔽圖

不同高度發展之各種雲狀。資料來源:wikipedia
不同高度發展之各種雲狀。資料來源:wikipedia

會下雨的雲主要是積雨雲(Cb)與雨層雲(Ns),前者導因於大氣中垂直對流旺盛,把下層水氣往上層帶凝結所致,發展範圍可從500公尺至對流層頂(中緯度處~10公里),後者可以是對流能量不夠強,以致衝不高所致,又或是伴隨著強烈對流系統出現之層狀降雨,發展範圍可從500公尺至5,500公尺。

參考資料: 收集水氣的濃積雲雲的故事、wikipedia

氣象雷達(Radar)的主要目的為提供即時的、大範圍的降雨估計,透過發射S-band(波長~10cm)或是C-band(波長~5cm)的脈衝電磁波,偵測周遭空間水氣含量分布得回波強度dBZ後,進行Z-R關係式做簡單降雨估計或使用雙偏極化參數作更精確之估計。

給定空間中雨滴粒徑分布關係(Raindrop size distribution),透過電磁波散射矩陣計算(T-matrix),則可得雷達觀測所使用的Z-R關係式,然而問題是,不同的降雨系統如層狀降水(stratiform)與對流降水(convective)的雨滴粒徑分布有所差異,若使用同一組Z-R關係式進行降雨估計,則有高估或低估問題,因此如何掌握當下降雨系統的雨滴粒徑分布,即時修正雷達降雨估計計算,則是另一個課題,雨滴粒徑分布觀測資料是透過一種叫做雨滴譜儀(Parsivel)的觀測儀器得到。

參考資料: Raindrop size distributionpytmatrix雨滴譜儀Parsivel2

使用wradlib套件繪製雷達訊號發射路徑與地形遮蔽

wradlib是一款可讀取雷達資料的python套件,與另一款常用的雷達資料處理套件pyart不同點之一在於,前者擅長讀取德國Selex雷達的rb5資料,後者則是美國NEXRAD雷達資料。

本文參考自wradlilb官網文章Beam Blockage Calculation using a DEM,給定雷達站經緯度與高度資料,結合數值地形模型資料(Digital Elevation Model),就可以畫出雷達訊號發射路徑及其受地形遮蔽情況(Beam Blockage)。

完整程式碼

使用資料

  • 臺灣雷達氣象站地理位置(googlemap查詢,僅供參考)

  • GMTED2010 dataset - 10N120E_20101117_gmted_mea300.tif

如前所述,為了繪製雷達發射傳播路徑與受地形遮蔽情況,需要雷達經緯度與高度資訊與數值地形模型DEM,前者網路上都能查到,或是googlemap就可估計,DEM可從美國地質調查局USGS下載,這裡使用30角秒資料(解析度25公尺~42公尺)。必須注意的是,地形資料並沒有包含建築物高度資訊。

繪製結果

S-band雷達,RCWF五分山雷達站

lon, lat, height = (121.782018, 25.071787, 766.0)

這裡僅顯示掃描範圍一百公里以內的雷達發射路徑與地形遮蔽資料,增加程式變數bins可增加掃描範圍。

從Beam Blockage Fraction可看到,五分山雷達很好的涵蓋了北北基桃和宜蘭地區一定的低空區域,然而較高設站高度(766公尺)雖然換取了更多有效掃描範圍,但也犧牲了較多1000公尺以下的觀測區域(僅於20km以內有效,且高於766公尺)。特別是宜蘭地區受地形遮蔽影響,較無法有效觀測蘭陽溪河谷中上游區域對流發展狀況,想必這也是為什麼氣象局希望在宜蘭設置降雨雷達了吧。

新聞 宜蘭居民反對設降雨監測雷達 氣象局:有在找備選地點

參考資料 : 終止七星山氣象雷達站的設置

五分山雷達站0.5度發射仰角路徑與所經地形遮蔽情形。
五分山雷達站0.5度發射仰角路徑與所經地形遮蔽情形。

站在地球外來看,則會有下面這張圖,紅色線為水平線,綠色線為考慮電磁波被大氣折射所得水平發射路徑,藍色為雷達0.5度發射路徑,虛藍線為main lobe的3dB線,雷達主要發射能量都集中在main lobe上,上圖中黑線BBF為main lobe 3dB範圍內隨距離被地形遮蔽的比例。

同前圖,考慮地球曲率後。
同前圖,考慮地球曲率後。

S-band雷達,RCHL 花蓮雷達站

lon, lat, height = (121.628372, 23.988536, 61.0)

西邊陡峭的中央山脈以及南南西方突兀的海岸山脈,使得花蓮雷達站肩負的主要任務不是觀測臺灣本島,而是東方太平洋海面的颱風動態,以爭取更早的預警時間。

花蓮雷達站0.5度發射仰角路徑與所經地形遮蔽情形。
花蓮雷達站0.5度發射仰角路徑與所經地形遮蔽情形。

他曾協助興建氣象雷達站 50年後Mr. Hal Bogin來台重溫過往點滴

S-band雷達,RCKT 墾丁雷達站

lon, lat, height = (120.855609, 21.900181, 40.85)

從0.5度Beam Blockage Fraction來看,墾丁雷達站扮演的腳色與花蓮站相同,主要提供巴士海峽上的颱風動態。

墾丁雷達站0.5度仰角發射路徑與所經地形遮蔽情形。
墾丁雷達站0.5度仰角發射路徑與所經地形遮蔽情形。

新聞 遊墾丁一定看過神秘「哈密瓜」!真實作用竟然是…

S-band雷達,RCCG 七股雷達站

lon, lat, height = (120.088978, 23.147402, 33.0)

由於七股居民抗爭,七股雷達站後續會牽涉到現址西北方海堤處。從Beam Blockage Fraction來看,七股雷達站為臺灣西半部提供了絕佳的地面天氣觀測,有效涵蓋從地面以上之觀測區域,對臺灣夏季西南氣流的降雨估計至關重要。

七股雷達站0.5度發射仰角路徑與所經地形遮蔽情形。
七股雷達站0.5度發射仰角路徑與所經地形遮蔽情形。

新聞 台南七股氣象雷達新站動土 可望成新地標

C-band雷達,RCSL 新北樹林雷達站

lon, lat, height = (121.400546, 25.003839, 290.0)

前面提到的4座S-band雷達是臺灣早先建立的雷達觀測站,主要提供大範圍降雨觀測,然而近幾年來短時強降雨等極端降雨致災事件發生頻率越來越高,後續政府針對都會地區防洪需求設置掃描頻率較高(每2分鐘)的C-band雷達,由於波長較短,對強降水區域更為敏感,但反過來說,有效觀測範圍也較小(150公里),分別於2017、2018、2019年啟用高雄林園、台中南屯、新北樹林防災降雨雷達。

參考資料:RADAR POLARIMETRY AT S, C, AND X BANDS

若將樹林雷達站與五分山雷達站的0.5度Beam Blockage Fraction相比,乍看五分山雷達有更好的有效涵蓋範圍,但如前所述,這是由於五分山雷達站蓋在七百多公尺的山上,在有效低空觀測區域來比,高度三百公尺左右的樹林雷達站明顯更勝一籌,在此認知下去看樹林雷達站的Beam Blockage Fraction圖,就會了解確實是非常優秀的選址地點,能有效涵蓋雙北最低三百公尺以上低空區域,東北方達基隆,西南方可監測桃園新竹都會區。

新北樹林雷達站0.5度發射仰角路徑與所經地形遮蔽情形。
新北樹林雷達站0.5度發射仰角路徑與所經地形遮蔽情形。

新聞 全台第3座降雨雷達於新北啟用!防災、淹水預警更精準

C-band雷達,RCNT 台中南屯雷達站

lon, lat, height = (120.579441, 24.144220, 293.0)

坐落於大肚山台地西南側望高寮的台中南屯雷達站主要肩負台中都會區防洪重任,觀測區域為東側市區上空與東方雪山山脈區域,南南東方可觀草屯、南投、集集等地上空,東北方可觀卓蘭、石岡、東勢山區降雨,能夠為大安溪、大甲溪、大肚溪、濁水溪中上游集水區提供更密集的降雨估計資料,為台中都會區及下游流域鄉鎮爭取防洪預警時間。

臺中南屯雷達站0.5度發射仰角路徑與所經地形遮蔽情形。
臺中南屯雷達站0.5度發射仰角路徑與所經地形遮蔽情形。

新聞 第二座防災降雨雷達 台中望高寮啟用

C-band雷達,RCLY 高雄林園雷達站

lon, lat, height = (120.380659, 22.526775, 153.0)

位於軍方林園營區的高雄林園雷達,則可監控高雄都會區以及高屏溪上游荖濃溪與隘寮溪之降雨情況。

高雄林園雷達站0.5度發射仰角路徑與所經地形遮蔽情形。
高雄林園雷達站0.5度發射仰角路徑與所經地形遮蔽情形。

新聞 防豪雨 氣象局南部防災降雨雷達啟用

回到一開始的問題,「雷達能看到多低的雲?」看到這裡想必已經能大概了解台灣目前七座氣象雷達能夠看到多低的雲了,取決於雷達高度、發射仰角及被周遭地形遮蔽的情況,還有雷達觀測波段對水氣的敏感程度也會影響。

那雷達可以看到多高的雲呢? 為什麼有時候衛星雲圖看的到雲,雷達觀測圖卻沒看到呢? 這又是另一個故事了…

enjoy :)

使用氣象局Open Data測站溫度資料建立機率迴歸模型

前陣子在Coursera上學了“Probabilistic Deep Learning with TensorFlow 2”這門課,驚嘆Tensorflow Probabilty的威力,能同時估計資料不確定性以及模型不確定性,迫不及待來牛刀小試一下。機率迴歸方法在這裡有清楚的實作介紹,本文中相關程式碼亦參考自此。

使用資料

氣象局開放資料可透過API取得,授權碼註冊帳號即有,氣象局opendata使用說明

這裡擷取局屬有人測站的資料,含有過去三十天測站每小時的氣象觀測資料,如測站溫度、測站相對濕度、測站氣壓等等。

資料格式為json,但礙於自身才疏學淺,找不到可以直接轉換的工具,只好暴力轉成Dataframe後使用,有

  • “station” 測站資訊

  • “stationObsTimes” 測站逐時觀測氣象資料

  • “stationObsStatistics” 測站觀測資料的簡單統計資訊(這裡我只擷取溫度資料)

以板橋測站(466880)為例,就資料畫出過去三十天的溫度、相對濕度、測站氣壓、測站風速

板橋測站過去三十日氣象觀測資料。由左至右、從上自下分別為溫度、相對濕度、測站氣壓、風速,小圖左為觀測資料依時作圖,小圖右為將觀測資料依日期、時間作格點圖。
板橋測站過去三十日氣象觀測資料。由左至右、從上自下分別為溫度、相對濕度、測站氣壓、風速,小圖左為觀測資料依時作圖,小圖右為將觀測資料依日期、時間作格點圖。

可清楚看到在1月8日寒流侵襲造成溫度驟降至10度以下,以及1月21日溫度回升至30度上下的情況。

若不考慮日期,只考慮溫度在每個小時的觀測值,可了解過去三十天中,小時溫度的分布狀況。

板橋測站過去三十日溫度觀測資料。小時溫度觀測值。
板橋測站過去三十日溫度觀測資料。小時溫度觀測值。

對小時溫度資料做機率迴歸分析

一般迴歸分析只擬合出具MSE最小的趨勢線,沒有估計預測值的不確定性,機率迴歸分析在擬合趨勢線同時亦給出預測值不確定性的估計值,這裡的不確定性指的是來自資料本身(Aleatoric),而非模型本身(Epistemic)的不確定性。

# 建立模型
encoded_shape = 1
model = tf.keras.Sequential([
  tf.keras.layers.Dense(256, activation='relu'),                           
  tf.keras.layers.Dense(256, activation='relu'),                           
  tf.keras.layers.Dense(256, activation='relu'),
  tf.keras.layers.Dense(tfp.layers.IndependentNormal.params_size(encoded_shape)),
  tfp.layers.IndependentNormal(encoded_shape)
])

# 訓練model時所用的 loss function - negative log-likelihood
nll = lambda y, rv_y: -rv_y.log_prob(y)

# 訓練模型
model.compile(optimizer=tf.optimizers.Adam(learning_rate=1e-4), loss=nll)
model.fit(x, y, epochs=2000, verbose=False)

與簡單迴歸分析不同的是,模型的最後一層使用了Probabilistic Layer,這層輸出的是一維正規機率分布。給定平均值與標準差,就可以決定正規機率分布,而機率層的前一層Dense layer,就是要去參數化平均值與標準差的所需參數。

另外,不同於一般訓練模型使用MSE作為loss function,這裡使用negative log-likelihood計算loss,back propagation來逐步調整模型的機率分布逼近訓練資料的分布。而其實MSE即是假設資料分布為Normal下所得到的約束結果,文章剖析深度學習 (4):Sigmoid, Softmax怎麼來?為什麼要用MSE和Cross Entropy?談廣義線性模型把這個關係講的很清楚。

對板橋測站過去三十日溫度觀測資料小時溫度觀測值做機率迴歸分析。藍點為觀測值,紅線平均值,綠線兩個標準差位置。
對板橋測站過去三十日溫度觀測資料小時溫度觀測值做機率迴歸分析。藍點為觀測值,紅線平均值,綠線兩個標準差位置。

分析可見在清晨六、七點會是一天最低溫的最可能出現時間,這是由於地表熱能透過紅外線長波輻射逸散所造成(輻射冷卻),最高溫則發生在下午一點前後。從平均溫度值的斜率變化可粗略估計地表太陽輻射加熱效率、以及輻射冷卻降溫效率。

由於測站溫度會受到當時候大氣系統影響,偶而會出現一些較為極端的觀測值,特別在寒流來臨時更為明顯。

板橋測站過去三十日溫度觀測資料。小時溫度觀測值。黑框處為超過小時觀測值兩標準差以外的觀測值。
板橋測站過去三十日溫度觀測資料。小時溫度觀測值。黑框處為超過小時觀測值兩標準差以外的觀測值。

完整程式碼

enjoy :)

在ARM Cortex-M上部屬KWS應用

如何訓練模型是一件事,在現實場景中應用模型又是另一回事。物聯網科技透過IOT技術連結各種電子儀器,若再賦予其AI演算法就朝智慧物聯網邁進一步了,而微控制器(Microcontroller)則是物聯網應用所乘載的關鍵實體元件之一,如何將訓練好的AI演算法有效部屬在MCU上,關乎實際運行時的效能。

ARM這篇2017年文章Hello Edge: Keyword Spotting on Microcontrollers以部屬KWS(語音喚醒)技術在MCU為例,探討在MCU上部屬AI演算法時可能遭遇到資源侷限與運算速度等實際問題,也對當時的KWS技術做了一些review,是可以學習到綜觀觀點的一篇優質文章。

這裡我嘗試依照ARM這篇教學文件Build Arm Cortex-M voice assistant with Google TensorFlow Lite,在colab上將預先訓練好的KWS模型部屬在STM32f746NG開發版上。

準備開發環境

安裝gcc-arm與相關套件

!sudo apt-get -qq update -y
!sudo apt-get -qq install -y xxd
!sudo pip -q install --upgrade mbed-cli
!sudo apt-get -qq install mercurial
!sudo apt-get -qq install -y gcc-arm-none-eabi

下載tensorflow repo

!git clone https://github.com/tensorflow/tensorflow.git

使用 mbed-cli + gcc_arm 編譯部屬

產出編譯MCU所需相關原始碼

%cd tensorflow
!make -f tensorflow/lite/micro/tools/make/Makefile TARGET=mbed TAGS="disco_f746ng" generate_micro_speech_mbed_project

下載MCU所需相關libray

%cd tensorflow/lite/micro/tools/make/gen/mbed_cortex-m4/prj/micro_speech/mbed
!mbed config root .
!mbed deploy

使用gcc-arm-none-eabi開始編譯相關檔案

!mbed compile -m DISCO_F746NG -t GCC_ARM 

部屬執行檔到MCU,看看成果如何

cp ./BUILD/DISCO_F746NG/GCC_ARM/mbed.bin /你的MCU/
LCD顯示MCU的KWS偵測結果一直為'unknown'。:(
LCD顯示MCU的KWS偵測結果一直為'unknown'。:(

實際執行發現,即使在沒有什麼背景噪音的情況下,會一直產出”Heard unknown”的訊息,而非應該產出的”Heard silence”,可能是演算法過於sensitive,又或者是MCU的的microphone有問題!? 而且必須靠近MCU版的microphone念出”no”字才有機會偵測到,並且偵測成功率很差,keyword “yes”則更慘,幾乎沒成功偵測幾個,之後debug方向,要嘛是MCU的micro有問題,要嘛是用的model真的太爛…

另一個安裝版本…

後來發現arm教學文件似乎參考的是這個github,照著readme.md上的說明也的確可以產出執行檔,部屬到MCU上後,發現反而才是教學文件中所使用的code…

一樣安裝相關套件

!sudo apt-get -qq update -y
!sudo apt-get -qq install -y xxd
!sudo pip -q install --upgrade mbed-cli
!sudo apt-get -qq install mercurial
!sudo apt-get -qq install -y gcc-arm-none-eabi

import repo

!mbed import https://github.com/uTensor/tf_microspeech

編譯、部屬

%cd tf_microspeech/
!mbed compile -m DISCO_F746NG -t GCC_ARM --profile=tflm/tensorflow/lite/build_profiles/release.json 

這個版本中,偵測結果訊號只走usb回傳,LCD螢幕不會顯示偵測結果,可以用gtkterm以baud rate 9600讀取

透過usb讀取MCU回傳KWS模型偵測結果。
透過usb讀取MCU回傳KWS模型偵測結果。

結果這個版本的偵測效果非常的好!輕聲說出yes或no也能偵測的出來 :D 看來可能是model的問題比較大,但因為是部屬到mcu上,從聲音訊號的擷取到最後模型偵測結果,中間任何library使用錯誤都可能導致結果不如預期,但至少可以確定的是,我的MCU上的microphone沒有問題 :D

透過usb讀取MCU回傳KWS模型偵測結果'yes'。
透過usb讀取MCU回傳KWS模型偵測結果'yes'。
透過usb讀取MCU回傳KWS模型偵測結果'no'。
透過usb讀取MCU回傳KWS模型偵測結果'no'。

若要加上螢幕顯示偵測結果可以參考ARM教學文件章節”Extend the program”去修改程式碼command_responder.cc,並將LCD相關libray與header複製到目錄tf_microspeech底下

%cp -rf /content/tensorflow/tensorflow/lite/micro/tools/make/gen/mbed_cortex-m4/prj/micro_speech/mbed/LCD_DISCO_F746NG* /content/tf_microspeech/.

重新編譯後部屬即可!

%cd /content/tf_microspeech/
!mbed config root .
!mbed compile -m DISCO_F746NG -t GCC_ARM --profile=tflm/tensorflow/lite/build_profiles/release.json  -v

enjoy! :)

用Satpy套件繪製臺灣真實色衛星雲圖

身處AI大航海時代的背景下,資料開放是時勢所趨,如何使用資料的domain knowledge固然重要,但手中沒有資料也全無用武之地。今年10月氣象局聯合其他單位舉辦了「第一屆臺灣氣象產業論壇」暨「第三屆氣候服務工作坊」,邀請產官學研討論如何推動臺灣氣象產業,其中關鍵問題莫過於開放氣象資料,可以預見氣象局未來定位會在於提供高品質資料,由民間開發各種氣象資料的客製化衍生應用。目前氣象局有設置開放資料平台,但所提供資料完整性和資料架接方便度顯然還有很大進步空間。

日本Himawari-8衛星資料

但其實可以不用透過開放資料平台就可以取得衛星雲圖原始資料,氣象局使用的日本向日葵8號(Himawari-8)衛星資料,日本政府已經開放在Amazon的AWS資料平台上資料說明文件非常齊全。

HW data 資料來源: www.data.jma.go.jp

Himawari-8是一顆同步衛星,對西太平洋區域做全天候觀測,觀測資料分為FLDK(全景)、Region(日本區域)、Target(像是颱風等特定資訊)和Landmark(輔助衛星導航用),aws資料平台提供前述三種Level 1資料及其他衍生Level 2資料。資料頻率10分鐘一張FLDK,四張Region,四張Target。

Colab + Satpy + AWS HW8 data

下面是在Colab平台上使用Python Satpy套件讀取AWS Himawari-8衛星資料的範例,參考自這篇

在colab上安裝Satpy套件與aws cli環境

安裝相關Library

!sudo apt-get -qq update
!sudo apt-get -qq install libproj-dev proj-data proj-bin
!sudo apt-get -qq install libgeos-dev
!sudo pip -q install cython
!sudo pip -q install cartopy==0.16
!sudo pip uninstall -y shapely
!sudo pip install shapely --no-binary shapely
!sudo apt-get -qq install python3-grib
!sudo apt-get -qq install build-essential python3-dev python3-numpy libhdf4-dev -y

安裝Satpy套件與讀取aws資料用aws cli、s3fs套件

!sudo pip -q install satpy[all] 
!sudo pip -q install awscli s3fs

讀取Full Disk衛星資料

import讀取資料所需function

from satpy import Scene, find_files_and_readers
from satpy.resample import get_area_def
from datetime import datetime

連線amazon aws資料庫搜尋有效Himawari-8衛星資料

import s3fs, datetime
files = find_files_and_readers(
      base_dir="s3://noaa-himawari8/AHI-L1b-FLDK/2020/11/06/0400/",
      fs=s3fs.S3FileSystem(anon=True),
      reader="ahi_hsd",
      start_time=datetime.datetime(2020, 11, 6, 4, 0),
      end_time=datetime.datetime(2020, 11, 6, 4, 0))

下載資料

!aws s3 cp s3://noaa-himawari8/AHI-L1b-FLDK/2020/11/06/0150/ . --no-sign-request --recursive

繪製全球真實色衛星雲圖

讀取資料

scn = Scene(sensor='ahi', filenames=files)

設定合成真實色圖

rgbname = 'true_color'
scn.load([rgbname])

依資料中最小區域做native resample

new_scn = scn.resample(scn.min_area(), resampler='native')

產出資料

new_scn.save_dataset(rgbname, filename='himawari_ahi_truecolor_{datetime}.png'.format(datetime=scn.start_time.strftime('%Y%m%d%H%M')))

輸出資料大小大約在幾百MB左右

資料時間:2020年11月6日4點0分 UTC
資料時間:2020年11月6日4點0分 UTC

繪製東亞真實色衛星雲圖

保留前面的scn變數,定義東亞區域,再透過resample方法轉換得到東亞區域衛星雲圖

from pyresample.utils import get_area_def
area_id = 'east_asia'
x_size = 1600
y_size = 1600
area_extent = (-2000000, -2000000, 2000000, 2000000)
#  Center of Taiwan 23.9738° N, 120.9797° E
projection = '+proj=laea +lat_0=23.9738 +lon_0=120.9797 +ellps=WGS84'

description = "East Asia"
proj_id = "laea_23.9738_120.9797"
areadef = get_area_def(area_id, description, proj_id, projection,x_size, y_size, area_extent)

對設定區域做resample

local_scene = scn.resample(areadef)

產出資料

local_scene.show(rgbname)
資料時間:2020年11月6日4點0分 UTC,圖片中心為臺灣地理中心 23.9738° N 120.9797° E,邊距上下左右各2000公里。
資料時間:2020年11月6日4點0分 UTC,圖片中心為臺灣地理中心 23.9738° N 120.9797° E,邊距上下左右各2000公里。

繪製臺灣真實色衛星雲圖

修改邊距為490公里,重新resample可得臺灣區域衛星雲圖

資料時間:2020年7月12日2點0分 UTC,圖片中心為臺灣地理中心 23.9738° N, 120.9797° E,邊距上下左右各490公里。
資料時間:2020年7月12日2點0分 UTC,圖片中心為臺灣地理中心 23.9738° N, 120.9797° E,邊距上下左右各490公里。

繪製颱風真實色衛星雲圖

同樣方法讀取Target資料可繪製颱風衛星雲圖

import s3fs, datetime
files = find_files_and_readers(
      base_dir="s3://noaa-himawari8/AHI-L1b-Target/2020/11/06/0400/",
      fs=s3fs.S3FileSystem(anon=True),
      reader="ahi_hsd",
      start_time=datetime.datetime(2020, 11, 6, 4, 0),
      end_time=datetime.datetime(2020, 11, 6, 4, 0))

一次掃描週期有四筆資料,選取其中一筆R301資料繪製

strings = ['R301']
files = {'ahi_hsd':  [x for x in files['ahi_hsd'] if any(s in x for s in strings)] }
資料時間:2020年11月6日4點02分 UTC,颱風閃電正經過墾丁外海。
資料時間:2020年11月6日4點02分 UTC,颱風閃電正經過墾丁外海。

繪製日本真實色衛星雲圖

同樣方法可得日本真實色衛星雲圖

import s3fs, datetime
files = find_files_and_readers(
      base_dir="s3://noaa-himawari8/AHI-L1b-Japan/2020/08/19/0300/",
      fs=s3fs.S3FileSystem(anon=True),
      reader="ahi_hsd",
      start_time=datetime.datetime(2020, 8, 19, 3, 0),
      end_time=datetime.datetime(2020, 8, 19, 3, 0))
strings = ['JP01']
files = {'ahi_hsd':  [x for x in files['ahi_hsd'] if any(s in x for s in strings)] }
資料時間:2020年8月19日3點0分 UTC
資料時間:2020年8月19日3點0分 UTC

enjoy :)

參考資料

Load Himawari-8 AHI data and generate true color RGB

Introduction to Himawari-8 RGB composite imagery

建立自己的github.io網頁

fork範本與發布網頁

github有提供一個官方範本,若要使用範本,直接fork範本repo即可,再把專案名稱改成username.github.io後,瀏覽器網址打上username.github.io就可看到精美的網頁。至此基本上已經完成網頁部署了!(現在寫網頁好快啊)

什麼,好醜? 那就來更換版型吧!網路上有很多基於jekyll技術的網頁範本,任君挑選,像是這個。使用方法也是fork範本repo到你的github就對了。 (copy&paste就是這樣advance)

fork好範本後,接著把範本repo複製到你的電腦上

git clone https://github.com/{username}/{repo_name}.git

等修改工作都在本機端完成後,再push到github上,就完成了一個網頁修改的cycle了。

記得好多年前無名小站關站時,還要特地把所有寫過的文章備存下來,但多年下來也不知道遺失在哪顆硬碟裡了。

現在這種靜態網頁修改發布的流程就可以避免這種情況,因為寫文章、修改版面都在自己的本機端完成,再投過git發布到git server上面,哪天筆電不見了,再從遠端git server抓下來就好。

設定jekyll環境

為了在本機上編輯網頁,必須安裝Ruby的jekyll和bundler套件。安裝Ruby請至官網下載

jekyll是一個用Ruby寫成的套件,用來從pain text生成靜態網頁文本,而為了產生靜態網頁的過程中,jekyll會使用許多不同的Ruby套件輔助,這些套件稱為Gem,而bundler則是為了維護套件相依性所寫稱的另一個Gem套件。

gem install bundler jekyll

安裝好後,進入範本repo,透過bundler安裝所需要的gem套件。

cd {repo_name}
bundle install

在本機端開啟server後,瀏覽器網址打上localhost:4000即可看到精美網頁。

bundle exec jekyll serve

以Lanyon範本為例

以上是針對有使用gem套件的範本repo的大致設定流程。但為了設定本網頁所使用的Lanyon範本可是費了不少功夫… 拜google大神之賜,找到了這篇過來人苦主的參考文章

當你把Lanyon fork到你的github,也把範本repo更名為username.github.io後,你會發現網頁排版走掉了,問題在於當把範本repo push到github上後,github端會透過自己的jekyll server產製靜態網頁到public資料夾下,正好覆蓋了Lanyon放在public資料夾下的css檔案,把public資料夾更名為assets即可正常瀏覽。

原始Laynon範本並沒有使用gem套件,所以只需要

jekyll build
jekyll serve

即可。

編輯更新網頁

編輯jekyll網頁所需基本了解可參考jekyll上的step by step

  • 在本機端編輯網頁時,jekyll會在目錄_site下依據設定檔與資料產出靜態網頁。
  • 主要設定在設定檔_config.yml
  • _layouts中放有產製網頁所使用的框架。
  • 目錄_includes放有會被其他網頁常常拿去用的內容。
  • 目錄_posts中放置新增markdown檔XXX.md,編輯的靜態網頁要放在這裡。
  • 目錄_data可放置像是social-media設定…等資料。

每次存檔後jekyll會自動更新靜態網頁,若是修改_config.yml,則必須重啟jekyll服務才會看到更新

enjoy! :)

參考資料