Tuesday, December 8, 2009

GRIB壓縮法

今日繼續有攝時間之嫌.

氣象數據常以格點形式出現, 由於數據的特性, 可用 GRIB (gridded binary) 的方法作壓縮和儲存. 今日簡介其原理.

假設有一海平面氣壓資料場, 共有 4x5 = 20 點資料. 如每點資料以 4-byte floating point 來表示的話, 總共應要 80 bytes. 但由於海平面氣壓場的上下限相差並不很大, 又由於我們只需要一定程度的準確度, 其實可以用更節約的方法來儲存.

例如, 20 點資料中的最低氣壓為 990.1257, 最高為 1000.2345. 如我們只需小數點後一位, 則會變為 990.1 和 1000.2. 接著我們可以算算最少可用多少 bit (1 byte = 8 bits)來表示它們之間的距離. 10002 減去 9901, 得出 101. 用 7-bit unsigned integer (0-127) 就可以.

儲存之前, 我們先將各點的值減去最低值 (9901), 範圍便是 0-101. 我們只需用 2-byte integer 儲存最低值 9901, 1-byte signed integer 儲存小數點的位置 -1, 1-byte unsigned integer 來儲存資料點用多少 bit, 另外 7x20 = 140 bits 來儲存格點數據就足夠, 總共約是 21 bytes, 即原先 80 bytes 的 4 分 1 左右.

網友們如想用 GRIB 方法來壓縮氣象資料, 可以到以下網站:
http://www.cpc.noaa.gov/products/wesley/gribw.html (寫)
http://www.cpc.noaa.gov/products/wesley/wgrib.html (讀)

No comments: