Jung-Bin Wang things speak by themself

用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! :)

參考資料