iT邦幫忙

2022 iThome 鐵人賽

DAY 9
0
AI & Data

氣象食材系列 第 9

[Day 9] 進階觀測資料- 高解析紅外線亮度溫度資料-東亞 (GeoTiff)

  • 分享至 

  • xImage
  •  

前面的主題都是基本開頭,這一篇變為進階了!
其實我的基本跟進階的差別只是在常見或不常見的資料格式。
對一般人而言,常接觸到的資料儲存格式是csv, xml, txt等

但對於大家應該鮮少接觸到GeoTiff的資料格式。
GeoTiff是遙測觀測儀器常使用的資料儲存格式,遙測資料如衛星資料。
而GeoTiff僅是Tiff檔案格的一種特例,主要是多了地理資訊的訊息。
至於Tiff應該就相對常見,因為是處理圖形資訊常用的格式。

氣象局開放資料有提供GeoTiff格式的衛星資料,我們就來試試看吧
先到氣象局開放資料下載,如下圖
https://ithelp.ithome.com.tw/upload/images/20220923/20150923vZdQryaiNJ.jpg

另外提供資料說明連結

下載xml檔案格式後,檔案名稱應該是O-B0056-001.xml,使用瀏覽器開啟xml,內容如下圖
https://ithelp.ithome.com.tw/upload/images/20220923/20150923n1bKdrqUjV.jpg

可以看到xml檔案裏面有提供一行連結網址,這個網址是GeoTiff資料的下載連結。
所以要能夠下載並且解壓縮,執行的程式如下

import zipfile, requests
import xmltodict as xdict

with open("O-B0056-001.xml", "r", encoding="utf-8") as fn:
    satdict = xdict.parse(fn.read())
    
url = satdict["cwbopendata"]["dataset"]["resource"]["uri"] #取得下載連結
print(url)
r = requests.get(url, stream=True) #下載檔案為連續檔案於記憶體

#將下載的檔案變為壓縮檔
with open("test.zip", 'wb') as fd:
    for chunk in r.iter_content(chunk_size=128):
        fd.write(chunk)

#解壓縮到該資料夾下的test資料夾
extractdir = "test"
with zipfile.ZipFile("test.zip", 'r') as zip_ref:
    listOfFileNames = zip_ref.namelist()
    for fileName in listOfFileNames:
        if fileName.endswith('.gtif'):
            zip_ref.extract(fileName, extractdir)
print(extractdir +"/" +fileName)

上面的程式執行完成後,應該會得到
https://cwbopendata.s3.ap-northeast-1.amazonaws.com/MSC/O-B0056-001.gtif.zip
test/data4/hsd/PG261/2022-09-23_2110.B13.LCC.gtif

那現在就是要讀取2022-09-23_2110.B13.LCC.gtif
這邊介紹使用gdal來解,安裝方式如下
conda install -c conda-forge gdal

pip3 install gdal

安裝完成後就開始解吧

gtifpath = extractdir +"/" +fileName
sattif = gdal.Open(gtifpath,gdal.GA_ReadOnly)
data  = sattif.GetRasterBand(1) #取值
data2arr = data.ReadAsArray() #僵值轉換為array
temp = data2arr/100. #說明文件有提到要將數值除以100

上面的程式就將亮度溫度讀取完成

下面提供簡易的視覺化(沒有加投影資訊)

fig , axs = plt.subplots(1,2,figsize=(8,8))
axs[0].imshow(plt.imread("LCC_IR1_CR_2750-2022-09-23-20-50.jpg"))
ishow = axs[1].imshow(temp,cmap="Blues",extent=(lonst,lonend,latst,latend))
plt.colorbar(ishow,fraction=0.05)
plt.title(obsTime)

左邊的圖為氣象局觀測的紅外線雲圖,拿來驗證用的
右邊的圖是透過開放資料提供的亮度溫度繪製而成,看起來我們是有將資料讀對的
https://ithelp.ithome.com.tw/upload/images/20220923/20150923768PKd4PRx.png


上一篇
[Day 8] 基本觀測資料-過去1小時雷達定量降雨估計 (xml)
下一篇
[Day 10] 進階觀測資料- 高解析可見光反照率資料-東亞 (GeoTiff)
系列文
氣象食材30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言