GMS-5に関するプロダクトの仕様について

岡田 格・近藤昭彦

 

 受信機によって取得したデータは、無加工のまま保存されると共に(Raw data)、 以下に示すデータセットとして保存される。ユーザーには衛星データ検索システムから リクエストすることができるほか、ここからダウンロードすることができる。なお、データは圧縮、連結してあるので、gzip、tarを使って解凍する必要がある。

1. Browse image Global image, Japan imageの2種類
2. Fine grid data 赤道上で約10kmの分解能(0.1°)の緯度・経度にマッピングされたデータ
3. Rough grid data 同じく0.25°で緯度・経度にマッピングされたデータ

GMS5の各チャンネルの波長帯域は以下のようになっている(気象庁発行、「気象衛星資料利用のてびき」)。
 

可視(vis)   0.55-0.90μm
赤外1(ir1) 10.5-11.5μm
赤外2(ir2) 11.5-12.5μm
水蒸気(wv)   6.5-7.0 μm

(注意)本データセットにおける時刻の表示は受信したデータの直前の正時をあらわす。

1.Browse用データセット JPG画像FTPサイト(衛星データ検索システムで見ることができるGIF画像)

WWWでの視覚的な表示、および、検索時に雲の大ざっぱな分布などの情報を簡単に知らせるために作成された。ただし、rawデータなのでアプリケーションプログラムで安易に見られるように適切な形式に変換する必要がある(Web上のデータベースではjpeg形式になっている)。

(1) 日本ファイル

ファイル名:g0598073003.jp.ir1.gi (g05: GMS-5, 98: year, 07: month, 30: day, 03: hour, jp: Japan browse data, ir1: IR1 channel, gi: global image formatの意味)
波長種別:可視(vis)、赤外1(ir1)、赤外2(ir2)、水蒸気(wv)
領域:北緯22度~49度、東経123度~156度をPolar Stereoで表示する。約6km毎のサンプリングに相当する。
データ形式:一画素を8ビットで表現し512*512画素から成る。
表示値:8ビットで表現するために赤外1、赤外2、水蒸気のデータは輝度温度に変換した上で、100Kを差し引いている。
その他:海岸線と緯度経度の10度毎の線を画像に加えている。

 

(2) 全体ファイル

ファイル名:g0598073003.br.ir1.gi (g05: GMS-5, 98: year, 07: month, 30: day, 03: hour, br: browse data, ir1: IR1 channel, gi: global image formatの意味)
波長種別:可視(vis)、赤外1(ir1)、赤外2(ir2)、水蒸気(wv)
領域:北緯55度~南緯51度、東経77度~西経158度を表示する。
データ形式:一画素を8ビットで表現し512*512画素から成る。
表示値:8ビットで表現するために赤外1、赤外2、水蒸気のデータは輝度温度に変換した上で、100Kを差し引いている。
その他:海岸線と緯度経度の10度毎の線を画像に加えている。

(3) データの取り出し方

(1) の日本画像も(2)の全体画像も同じ方法であるが、文末に添付したgicvt.cの実行ファイル(仮にgicvtとする)により gicvt g0500111423.jp.vis.gi を実行すると

g0500111423.jp.vis.g
g0500111423.jp.vis.p

の2ファイルが作成される。このうち、*.pのファイルに画像データは含まれている。最初の80byteを除いた部分が画像である。例えば、

#include <stdio.h>
main()
{
    FILE *fp1, *fp2;
    int i, j, idum;
    int idata[262144];/* 262144=512*512*/
    float temp;
    fp1 = fopen("g0500111423.jp.wv.p", "r");
    fp2 = fopen("g0500111423.jp.wv.pgm", "w");
    for (i=0; i<80; i++) { idum = getc(fp1); }
    for (j=0; j<262144; j++) { idata[j] = getc(fp1); }
    close(fp1);
    fprintf(fp2,"%s\n", "P5");
    fprintf(fp2,"%s\n", "512 512");
    fprintf(fp2,"%s\n", "255");
    for (j=0; j<262144; j++) { fputc(idata[j], fp2); }
    close(fp2);
}
のようなプログラムにより80バイトを除いて、PGM形式のヘッダーをつけておくと、convert等のツールにより、

convert xxx.pgm xxx.jpg

のようにして容易にjpegあるはgif形式などに変換できる。
 

2. 解析用データセット

研究用に物理量として扱えるように作成されたデータセットである。ファイル容量節約のために8ビットのデータおよび物理量への変換表から構成される。

(1) Rough grid data

ファイル名:g0598073003.ro.ir1.gi (g05: GMS-5, 98: year, 07: month, 30: day, 03: hour, ro: rough grid data, ir1: IR1 channel, gi: global image formatの意味)
波長種別:可視(vis)、赤外1(ir1)、赤外2(ir2)、水蒸気(wv)
データ形式:一画素を8ビットで表現し580*580画素から成る(なお、80バイトのヘッダーが付いている)
領域:北緯55度~南緯51度、東経77度~西経158度を表示する。

(2) Fine grid data

ファイル名:g0598073003.fi.ir1.gi (g05: GMS-5, 98: year, 07: month, 30: day, 03: hour, fi: fine grid data, ir1: IR1 channel, gi: global image formatの意味)
波長種別:可視(vis)、赤外1(ir1)、赤外2(ir2)、水蒸気(wv)
データ形式:一画素を8ビットで表現し1448*1448画素から成る(なお、80バイトのヘッダーが付いている)
投影法:Platte Carre
次の4つのパラメータを用いて、

    ulhlat : latitude of the upper left hand corner of the image.
    dlat : delta latitude in degree per pixel.
    ulhlon : longitude of the upper left hand corner of the image.
    dlon : delta longitude in degree per pixel.

以下のように画素の位置を特定する。画素のline(行)とsamp(列)は次の関係で緯度経度に変換される。

      lat = ulhlat + ((line - 1) * dlat)
      lon = ulhlon + ((samp - 1) * dlon)
      lon = lon % 360.0
      if (lon > 180.0)
       lon = lon - 360.0

  ただし、fine grid dataにおいては、

     ulhlat = 65.020981
     ulhlon = 74.979027
     dlat = -.0899322
     dlon = .0899322

を用いる。


3. 校正表

解析用データセットはセンサーのデジタル出力値(8ビット)で表現されているので物理量に変更する必要がある。デジタル出力値および校正表はそれぞれのファイルに含まれるので、それらを取り出す必要がある。
下記にデジタル出力値および校正表を抜き出すプログラムgicvt.cの例を示す。なお、このプログラムではデジタル出力値および校正表を、それぞれ、*.g および*.cのファイル名として出力する。
―――――――――――――――――――――――――――――――――――――
/* gicvt *** convert gi-file to p-file g-file ... ***
                 Jul. 16th, 1998 E.miyamoto */
 
#include <stdio.h>
#include <string.h>

#define     STRSIZ     30
#define     DUMSIZ     300000

main(argc, argv)
int   argc;
char  **argv;
{
    FILE      *fp, *fpw;
    unsigned    nlnpbn=0, nbnpim=0, nbypln=0;
    unsigned    nbyplb=0, nlb=0, nstim=0;
    unsigned long  nbypim=0;
    unsigned    dtyp=0, dorg=0;
    char      pid[5];
    unsigned short pidchr;
    char      *wstrp, wstring[STRSIZ];
    unsigned    wbyte;
    unsigned long  i, j;
    unsigned    nlen;
    unsigned long  wsiz, allsiz, wstart, wend;
    
/* argc == 2 ? */

    if (argc != 2) {
        printf("Usage: %s gi-file \n", *argv);
        exit(1);
    }

/* extract file name from argv[1] */

    strncpy(wstring, argv[1], STRSIZ);
    nlen = strlen(wstring);
    if (strncmp(wstring+nlen-3, ".gi", 3)){
        printf("Usage: gi-file has .gi identifier\n", argv[1]);
        exit(1);
    }else{
        wstring[nlen-2] = '\0';
    }
 
/* open and read gi-file */

    if ((fp = fopen(argv[1], "r")) == NULL) {
        printf("Error: %s is not gi-file.\n", argv[1]);
        exit(1);
    }
    i = 0, j = 0;
    while ((char)(wbyte = getc(fp)) != EOF && i < DUMSIZ){
        if (i < 4) {
            nlnpbn = wbyte + nlnpbn * 256;
        } else if (i < 8) {
            nbnpim = wbyte + nbnpim * 256;
        } else if (i < 12) {
            nbypln = wbyte + nbypln * 256;
        } else if (i < 16) {
            nlb = wbyte + nlb * 256;
        } else if (i < 20) {
            nbyplb = wbyte + nbyplb * 256;
        } else if (i < 24) {
            dorg = wbyte + dorg * 256;
        } else if (i < 28) {
            dtyp = wbyte + dtyp * 256;
        } else if (i < 32) {
            nstim = wbyte + nstim * 256;
        } else if (i < 36) {
            pid[j++] = wbyte;
        }
        i++;
    }
 
/* set write file identifier */

    pid[j] = '\0';
    if ((strcmp("Imag", pid) != 0) && (strcmp("imag", pid) != 0)){
        printf("Error: p-file does not exist.\n");
        exit(1);
    }else{
        pidchr = 'p';
    }
 
/* set write file size */

    wsiz = (double)nlnpbn * (double)nbnpim * (double)nbypln
            + (double)nstim;
    fclose(fp);
 
/* loop */

    wstart = 0;
    wend = wsiz;
    while (1){
        if ((fp = fopen(argv[1], "r")) == NULL) {
            printf("Error: %s can not be read-opened.\n", argv[1]);
            exit(1);
        }
        wstring[nlen-2] = pidchr;
        wstring[nlen-1] = '\0';
        if ((fpw = fopen(wstring, "w")) == NULL) {
            printf("Error: %s can not be write-opened.\n", wstring);
            exit(1);
        }
 
/* make file */

        i = 0;
        while (i < wend){
            wbyte = getc(fp);
            if (i >= wstart)
                putc(wbyte, fpw);
            i++;
        }

/* get next file information */

        pidchr = 0;
        wsiz = 0;
        for (i=0; i < 8; i++){
            if ((wbyte = getc(fp)) == EOF){
                fclose(fp);
                fclose(fpw);
                printf("end of gi-file\n");
                printf("program gicvt end\n");
                exit(0);
            }else if (i < 4){
                pidchr = wbyte + pidchr * 256;
            }else if (i < 8){
                wsiz = wbyte + wsiz * 256;
            }
        }
                fclose(fp);
        fclose(fpw);
        pidchr = pidchr + 'a';
        wstart = wend;
        wend = wend + wsiz + 8;
    }
 
    printf("Error: wrong p-file information.\n");

    exit(1);
}