GEOSTATIONARY SATELLITE GRIDDED DATA

静止衛星データグリッドフォーマットプロダクトガイド

本ページは、AMATERASSの中間ファイルとして生成される、ひまわり8・9号/AHIのフルディスク観測に位置情報の誤差補正を適用した等緯度経度グリッドプロダクトのガイドです。千葉大学環境リモートセンシング研究センターにてCEReSグリッドフォーマット(緯度経度直交座標系精密幾何補正済データ)として公開されているデータの開発者による一次情報元です。

2019年7月7日03:00 UTCのひまわり8号AHI B03フルディスク画像
2019-07-07 03:00 UTCAHI Band 03 · 0.64 µm · Reflectivity
120° × 120°85°E–155°W / 60°N–60°S
16 bandsAHI全観測バンド
0.005°–0.02°ネイティブ格子間隔
10 minフルディスク観測間隔
01

PRODUCT AT A GLANCE

プロダクトの全体像

AHIの16バンドを、同じ緯度経度系のフルディスク画像として比較できます。雲・地表・水蒸気・オゾンなど、波長ごとに異なる情報を一望できます。

このクイックルックについて

2019年7月7日 03:00 UTC。B01–B06はReflectivity、B07–B16は輝度温度(TBB)です。各レンジは画像表示用に設定したもので、データの有効範囲を規定するものではありません。

ひまわり8号AHI全16バンドの一覧
02

CHANNEL & PRODUCT DIRECTORY

16チャンネルとプロダクト体系

最初に、AHIバンド番号、AMATERASSグリッドのチャンネル名、ネイティブ解像度、4 kmサブプロダクトの命名を対応づけます。

500 mEXT

EXT.01 · AHI B03

rad / rfc / rfy
1 kmVIS

VIS.01–03 · B01/B02/B04

rad / rfc / rfy
2 kmSIR

SIR.01–02 · B05/B06

rad / rfc / rfy
2 kmTIR

TIR.01–10 · B07–B16

rad / tbb
AMATERASSグリッド名AHI中心波長ネイティブ格子4 km系接尾辞
VIS.01vis.01B010.47 µm12,000 × 12,000 / 0.01°rad / rfc / rfy
VIS.02vis.02B020.51 µm12,000 × 12,000 / 0.01°rad / rfc / rfy
EXT.01ext.01B030.64 µm24,000 × 24,000 / 0.005°rad / rfc / rfy
VIS.03vis.03B040.86 µm12,000 × 12,000 / 0.01°rad / rfc / rfy
SIR.01sir.01B051.6 µm6,000 × 6,000 / 0.02°rad / rfc / rfy
SIR.02sir.02B062.3 µm6,000 × 6,000 / 0.02°rad / rfc / rfy
TIR.05tir.05B073.9 µm6,000 × 6,000 / 0.02°rad / tbb
TIR.06tir.06B086.2 µm6,000 × 6,000 / 0.02°rad / tbb
TIR.07tir.07B096.9 µm6,000 × 6,000 / 0.02°rad / tbb
TIR.08tir.08B107.3 µm6,000 × 6,000 / 0.02°rad / tbb
TIR.09tir.09B118.6 µm6,000 × 6,000 / 0.02°rad / tbb
TIR.10tir.10B129.6 µm6,000 × 6,000 / 0.02°rad / tbb
TIR.01tir.01B1310.4 µm6,000 × 6,000 / 0.02°rad / tbb
TIR.02tir.02B1411.2 µm6,000 × 6,000 / 0.02°rad / tbb
TIR.03tir.03B1512.4 µm6,000 × 6,000 / 0.02°rad / tbb
TIR.04tir.04B1613.3 µm6,000 × 6,000 / 0.02°rad / tbb

群内チャンネル番号とAHIバンド番号は別体系です。例えば EXT.01 はAHI B03TIR.01 はAHI B13 に対応します。

PRODUCT FORMATプロダクト形式を選択
03

NATIVE DN GRID, COVERAGE & QUICKLOOK

DNグリッド:解像度別ガイド

GEOLOCATION CORRECTION · CORE DIFFERENTIATOR

衛星投影上の観測画素を、
精密な緯度経度対応データへ

ひまわり8・9号のフルディスク観測は、衛星から見た投影座標上に画素が並ぶ走査画像です。各画素が緯度経度格子へ直接対応しているわけではなく、軌道・姿勢・走査幾何から座標を求めるだけでは、観測ごとの位置情報の誤差が残ります。本プロダクトは画像からその誤差を推定・補正した後、等緯度経度格子へ変換します。

01 · OBSERVATIONフルディスク走査画像

画素は衛星投影上の列・行で記録され、緯度経度とは直接対応していません。

02 · REGISTRATION観測ごとの誤差を推定

可視画像を地形由来のランドマーク参照画像と照合し、列・行方向の変位を求めます。

03 · GRID PRODUCT位置補正済み緯度経度格子

補正後の画素を共通座標へ配置し、地表面との対応が安定したDNグリッドを生成します。

AMATERASSのGeolocation Correction methodと静止衛星グリッド生成の概要
Geolocation Correction method — 位相限定相関とランドマーク情報を用いた観測位置情報の補正
METHOD

位相限定相関(POC)2次元高速フーリエ変換を用い、反復探索を行わずに画像間の変位を高速に推定します。

REFERENCE

SRTM 1秒メッシュ由来の参照画像地形データから構築したランドマーク参照画像と可視チャンネルを照合します。

SCALE

高頻度観測を多地点で補正論文のひまわり8号実証では、10分ごとのフルディスク観測で22,709点、2.5分ごとの領域観測で5,826点を処理しました。

OUTPUT

ネイティブ解像度のDNグリッド補正した観測を0.005°、0.01°、0.02°の等緯度経度格子として生成します。

IMPLEMENTATION DESCRIBED IN TAKENAKA ET AL. (2020)

論文が示すGeolocation Correctionの実装

座標変換そのものではなく、観測画像と地理的な参照画像との対応から、観測ごとに残る位置情報の誤差を推定する処理です。

DATA LEVELLevel-1A相当からLevel-1B相当へ

入力画素は緯度経度に直接結び付いていないLevel-1A相当のディスクデータです。補正と格子化により、緯度経度を登録したLevel-1B相当の基礎データを生成します。

REFERENCE IMAGESRTM 1秒メッシュから海岸線を構築

標高だけでなく水域・海洋マスクを組み合わせ、正規化静止衛星投影上のランドマーク参照画像を作成します。

IMAGE MATCHINGPOCが変位を一回の計算で抽出

位相限定相関は反復的な探索を必要とせず、相関面の明瞭なピークから列・行方向の変位を求めます。雲などの擾乱があっても補正精度を維持しました。

QUASI-REAL-TIME高頻度観測に対応する準リアルタイム処理性能

22,709点のフルディスク処理を88スレッドで約10秒とし、10分および2.5分間隔の準リアルタイム解析へ適用できる性能を実証しました。

OFFSET FIELDcoffloffとして補正量を保持

列方向・行方向のオフセットは観測時刻ごとに求められます。統計解析から、標準データに時間変動する特徴的な位置情報誤差が含まれることも確認されました。

APPLICATION16バンドの格子化と後段解析へ

推定した位置補正を16チャンネルのグリッド生成へ反映し、物理解析、地上検証、視差補正の基礎データを生成します。この手法はNASA GeoNEXにも適用されています。

GROUND VALIDATION地上観測との正確な対応

日射量などの衛星推定値を地上観測点で検証するには、対象画素と観測地点が正しく対応している必要があります。

TIME SERIES時系列解析における地理的位置の一貫性

位置情報の誤差による非物理的な空間変動を抑え、雲や不均質な地表面の時系列解析を安定させます。

ERROR SEPARATION解析誤差の原因を分離

アルゴリズム、センサ校正、位置情報の誤差が混在することを避け、物理量推定の評価基盤を明確にします。

PRODUCT SIGNIFICANCE

このプロダクトは、フルディスク画像を所定の地図投影へ機械的に再標本化したものではありません。観測画像そのものから時刻ごとの位置情報の誤差を求め、高精度な緯度経度対応を確立した上で格子化しています。これは、定量的な大気・陸面解析、地上観測による検証、視差補正などの基礎となる処理です。

CORRECTION OUTPUTcoff / loff

EXTディレクトリに含まれる YYYYMMDDHHMN.ext.fld.coff.txt.bz2YYYYMMDDHHMN.ext.fld.loff.txt.bz2 は、Geolocation Correctionが生成する列方向・行方向の補正情報です。通常のDN利用では参照する必要はありません。

各解像度について、最初に観測範囲と格子構造を示し、その下に代表的なクイックルックとデータ仕様をまとめます。

AMATERASS SUBPRODUCT

500 mグリッド

EXT
500 mグリッドの観測範囲、格子数、データ仕様
HOW TO READ THE QUICKLOOK500 mグリッドの代表クイックルックEXT.01 · B03 · 2019-07-07 03:00 UTC
EXT.01 · B03の代表クイックルック

クイックルックが示す内容

対象データEXT.01 · B03

0.64 µm Reflectivity

観測時刻
2019-07-07 03:00 UTC
単位
%
表示範囲
0–80 %
領域・格子
Full Disk · 24,000 × 24,000
格子間隔
0.005°
格納形式
Big-endian UInt16 · headerless
収録チャンネル

EXT.01(AHI B03)

PNG/WebPは内容確認用です。数値解析には対応するバイナリファイルを使用します。

AMATERASS SUBPRODUCT

1 kmグリッド

VIS
1 kmグリッドの観測範囲、格子数、データ仕様
HOW TO READ THE QUICKLOOK1 kmグリッドの代表クイックルックVIS.03 · B04 · 2019-07-07 03:00 UTC
VIS.03 · B04の代表クイックルック

クイックルックが示す内容

対象データVIS.03 · B04

0.86 µm Reflectivity

観測時刻
2019-07-07 03:00 UTC
単位
%
表示範囲
0–85 %
領域・格子
Full Disk · 12,000 × 12,000
格子間隔
0.01°
格納形式
Big-endian UInt16 · headerless
収録チャンネル

VIS.01 / 02 / 03(AHI B01 / 02 / 04)

PNG/WebPは内容確認用です。数値解析には対応するバイナリファイルを使用します。

AMATERASS SUBPRODUCT

2 kmグリッド

SIR / TIR
2 kmグリッドの観測範囲、格子数、データ仕様
HOW TO READ THE QUICKLOOK2 kmグリッドの代表クイックルックTIR.01 · B13 · 2019-07-07 03:00 UTC
TIR.01 · B13の代表クイックルック

クイックルックが示す内容

対象データTIR.01 · B13

10.4 µm Brightness temperature

観測時刻
2019-07-07 03:00 UTC
単位
K
表示範囲
200–310 K
領域・格子
Full Disk · 6,000 × 6,000
格子間隔
0.02°
格納形式
Big-endian UInt16 · headerless
収録チャンネル

SIR.01–02 / TIR.01–10(AHI B05–B16)

PNG/WebPは内容確認用です。数値解析には対応するバイナリファイルを使用します。

共通の地理座標

範囲は85°E–155°W、60°N–60°Sです。各画素は等緯度経度格子上に配置され、解像度に対応する海岸線を使用します。

04

NATIVE DN FILENAME ANATOMY

DNファイル名を読む

GENERAL SYNTAXYYYYMMDDHHMN.{ext|vis|sir|tir}.NN.fld.geoss.bz2

中括弧は選択肢、NNは各チャンネル群の中での2桁番号を表します。実際のファイル名には中括弧や縦線は入りません。

201907070300.ext.01.fld.geoss.bz2
201907070300観測時刻(UTC)

YYYY MM DD HH MN。例は2019年7月7日03:00 UTC

extチャンネル群

ext 500 m、vis 1 km、sir/tir 2 km

01群内チャンネル

2桁固定。AHIバンド番号とは別体系

fld.geoss.bz2領域・形式・圧縮

Full Diskの補正済み格子。bzip2圧縮UInt16

GROUP + CHANNEL2要素で観測バンドを特定

ext.01 = B03vis.03 = B04tir.01 = B13です。01だけではAHIバンドを特定できません。

FIXED PRODUCT TOKENfld.geoss

fldは本ガイドのFull Disk領域を示します。geossはこのDNプロダクト系列で使用される固定トークンです。

COMPRESSION.bz2は最外層の圧縮

展開すると末尾が.fld.geossのヘッダなしBig-endian UInt16ファイルになります。.binは付きません。

EXAMPLES201907070300.ext.01.fld.geoss.bz2201907070300.vis.03.fld.geoss.bz2201907070300.tir.01.fld.geoss.bz2

利用可能な群内番号は ext.01vis.01–03sir.01–02tir.01–10です。AHIバンドとの完全な対応は上の16チャンネル表を参照してください。

05

NATIVE DN STORAGE ORDER & MISSING VALUE

DNの格納順序と欠損値

DNグリッドを西から東、北から南へ行優先で格納する順序
先頭画素北西端各行は西から東、行は北から南へ進む
インデックスrow × NX + columnヘッダなし・行優先(row-major)
欠損DN65535幾何補正後に観測値が入らない画素

解析時の注意:65535 は有効な観測DNではありません。統計量や物理量変換の前に欠損値として除外してください。

06

NATIVE DN READER SAMPLES

DNグリッドの読み出しサンプル

掲載順は、大量データの継続処理に向く言語を先にしています。いずれも bzip2 -dk FILE.bz2 などで圧縮ファイルを展開してから実行します。

1. Java掲載済み
2. C掲載済み
3. Fortran掲載済み
4. Python掲載済み
Java:ネイティブDNグリッドクリックしてソースを展開

ネイティブDNグリッド専用。ヘッダなし・行優先のBig-endianバイナリとして読み、値数とファイルサイズを確認します。

ソースをダウンロード
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.EOFException;
import java.nio.file.Files;
import java.nio.file.Path;

public class ReadAmaterassDn {
    private record Grid(int nx, int ny) {}

    private static Grid gridFromName(String name) {
        String lower = name.toLowerCase();
        if (lower.contains(".ext.")) return new Grid(24000, 24000);
        if (lower.contains(".vis.")) return new Grid(12000, 12000);
        if (lower.contains(".sir.") || lower.contains(".tir.")) return new Grid(6000, 6000);
        throw new IllegalArgumentException("filename must contain .ext., .vis., .sir., or .tir.");
    }

    public static void main(String[] args) throws Exception {
        if (args.length != 1) throw new IllegalArgumentException("usage: java ReadAmaterassDn FILE");
        Path path = Path.of(args[0]);
        Grid grid = gridFromName(path.getFileName().toString());
        long count = (long) grid.nx * grid.ny;
        long expectedBytes = count * 2L;
        if (Files.size(path) != expectedBytes)
            throw new IllegalArgumentException("unexpected file size: " + Files.size(path) + " bytes");

        int first = -1, minimum = 65535, maximum = 0;
        long missing = 0, valid = 0;
        try (DataInputStream in = new DataInputStream(new BufferedInputStream(Files.newInputStream(path)))) {
            for (long i = 0; i < count; i++) {
                int value;
                try { value = in.readUnsignedShort(); }
                catch (EOFException e) { throw new EOFException("unexpected end of file at value " + i); }
                if (i == 0) first = value;
                if (value == 65535) { missing++; continue; }
                valid++;
                minimum = Math.min(minimum, value);
                maximum = Math.max(maximum, value);
            }
            if (in.read() != -1) throw new IllegalArgumentException("file is larger than expected");
        }
        System.out.printf("grid  = %d x %d%n", grid.nx, grid.ny);
        System.out.printf("first = %d DN%nmissing = %d pixels (DN 65535)%n", first, missing);
        if (valid > 0) System.out.printf("valid min = %d DN%nvalid max = %d DN%n", minimum, maximum);
    }
}
javac ReadAmaterassDn.java
java ReadAmaterassDn 201907070300.vis.02.fld.geoss
C:ネイティブDNグリッドクリックしてソースを展開

ネイティブDNグリッド専用。ヘッダなし・行優先のBig-endianバイナリとして読み、値数とファイルサイズを確認します。

ソースをダウンロード
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>

static int grid_size(const char *name) {
    if (strstr(name, ".ext.")) return 24000;
    if (strstr(name, ".vis.")) return 12000;
    if (strstr(name, ".sir.") || strstr(name, ".tir.")) return 6000;
    fprintf(stderr, "filename must contain .ext., .vis., .sir., or .tir.\n");
    exit(EXIT_FAILURE);
}

int main(int argc, char **argv) {
    if (argc != 2) { fprintf(stderr, "usage: %s FILE\n", argv[0]); return EXIT_FAILURE; }
    int n = grid_size(argv[1]);
    uint64_t count = (uint64_t)n * (uint64_t)n, expected = count * 2u;
    struct stat info;
    if (stat(argv[1], &info) != 0) { perror(argv[1]); return EXIT_FAILURE; }
    if ((uint64_t)info.st_size != expected) {
        fprintf(stderr, "unexpected file size: %lld bytes\n", (long long)info.st_size);
        return EXIT_FAILURE;
    }

    FILE *fp = fopen(argv[1], "rb");
    if (!fp) { perror(argv[1]); return EXIT_FAILURE; }
    uint16_t first = 0, minimum = UINT16_MAX, maximum = 0;
    uint64_t missing = 0, valid = 0;
    for (uint64_t i = 0; i < count; i++) {
        uint8_t b[2];
        if (fread(b, 1, 2, fp) != 2) { fprintf(stderr, "unexpected end of file\n"); return EXIT_FAILURE; }
        uint16_t value = (uint16_t)(((uint16_t)b[0] << 8) | b[1]);
        if (i == 0) first = value;
        if (value == UINT16_MAX) { missing++; continue; }
        valid++;
        if (value < minimum) minimum = value;
        if (value > maximum) maximum = value;
    }
    fclose(fp);
    printf("grid  = %d x %d\nfirst = %u DN\nmissing = %llu pixels (DN 65535)\n",
           n, n, first, (unsigned long long)missing);
    if (valid > 0) printf("valid min = %u DN\nvalid max = %u DN\n", minimum, maximum);
    return EXIT_SUCCESS;
}
cc -O3 -std=c11 read_amaterass_dn.c -o read_dn
./read_dn 201907070300.vis.02.fld.geoss
Fortran:ネイティブDNグリッドクリックしてソースを展開

ネイティブDNグリッド専用。ヘッダなし・行優先のBig-endianバイナリとして読み、値数とファイルサイズを確認します。

ソースをダウンロード
program read_amaterass_dn
  use iso_fortran_env, only: int16, int32, int64
  implicit none
  character(len=1024) :: path
  integer :: nx, ny, unit, row, column, stat
  integer(int64) :: bytes, expected, missing, valid
  integer(int16), allocatable :: raw(:)
  integer(int32) :: value, first, minimum, maximum

  if (command_argument_count() /= 1) error stop 'usage: read_dn FILE'
  call get_command_argument(1, path)
  if (index(path, '.ext.') > 0) then
    nx=24000
  else if (index(path, '.vis.') > 0) then
    nx=12000
  else if (index(path, '.sir.') > 0 .or. index(path, '.tir.') > 0) then
    nx=6000
  else
    error stop 'filename must contain .ext., .vis., .sir., or .tir.'
  end if
  ny=nx
  inquire(file=trim(path), size=bytes)
  expected=int(nx,int64)*int(ny,int64)*2_int64
  if (bytes /= expected) error stop 'unexpected file size'

  allocate(raw(nx))
  open(newunit=unit,file=trim(path),access='stream',form='unformatted', &
       status='old',action='read',convert='big_endian')
  minimum=65535; maximum=0; first=-1; missing=0; valid=0
  do row=1,ny
    read(unit,iostat=stat) raw
    if (stat /= 0) error stop 'unexpected end of file'
    do column=1,nx
      value=iand(int(raw(column),int32),int(z'FFFF',int32))
      if (row == 1 .and. column == 1) first=value
      if (value == 65535) then
        missing=missing+1
        cycle
      end if
      valid=valid+1
      minimum=min(minimum,value); maximum=max(maximum,value)
    end do
  end do
  close(unit)
  print '(A,I0,A,I0)', 'grid  = ',nx,' x ',ny
  print '(A,I0,A)', 'first = ',first,' DN'
  print '(A,I0,A)', 'missing = ',missing,' pixels (DN 65535)'
  if (valid > 0) then
    print '(A,I0,A)', 'valid min = ',minimum,' DN'
    print '(A,I0,A)', 'valid max = ',maximum,' DN'
  end if
end program read_amaterass_dn
gfortran -O3 read_amaterass_dn.f90 -o read_dn
./read_dn 201907070300.vis.02.fld.geoss
Python:ネイティブDNグリッドクリックしてソースを展開

ネイティブDNグリッド専用。ヘッダなし・行優先のBig-endianバイナリとして読み、値数とファイルサイズを確認します。

ソースをダウンロード
from pathlib import Path
import sys
import numpy as np

def grid_size(name: str) -> int:
    name = name.lower()
    if ".ext." in name:
        return 24000
    if ".vis." in name:
        return 12000
    if ".sir." in name or ".tir." in name:
        return 6000
    raise ValueError("filename must contain .ext., .vis., .sir., or .tir.")

def main() -> None:
    if len(sys.argv) != 2:
        raise SystemExit(f"usage: {Path(sys.argv[0]).name} FILE")
    path = Path(sys.argv[1])
    n = grid_size(path.name)
    values = np.fromfile(path, dtype=">u2")
    if values.size != n * n:
        raise ValueError(f"unexpected value count: {values.size}")
    grid = values.reshape(n, n)
    valid = grid != 65535
    valid_values = grid[valid]
    print(f"grid  = {n} x {n}")
    print(f"first = {int(grid[0, 0])} DN")
    print(f"missing = {int((~valid).sum())} pixels (DN 65535)")
    if valid_values.size:
        print(f"valid min = {int(valid_values.min())} DN")
        print(f"valid max = {int(valid_values.max())} DN")

if __name__ == "__main__":
    main()
python3 read_amaterass_dn.py 201907070300.vis.02.fld.geoss

読み込み対象:DN例はファイル名中の ext / vis / sir / tir から24,000 × 24,000 / 12,000 × 12,000 / 6,000 × 6,000を判定し、符号なし16 bit整数として読みます。

DATA AVAILABILITY

CEReSグリッドフォーマットとして公開

これらのプロダクトは千葉大学環境リモートセンシング研究センターにてCEReSグリッドフォーマット(緯度経度直交座標系精密幾何補正済データ)として公開されています。これらは基本的にAMATERASSの中間ファイルです。

CEReS公開ページを開く