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>のようなプログラムにより80バイトを除いて、PGM形式のヘッダーをつけておくと、convert等のツールにより、
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);
}
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);
}