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

PRODUCT AT A GLANCE
AHIの16バンドを、同じ緯度経度系のフルディスク画像として比較できます。雲・地表・水蒸気・オゾンなど、波長ごとに異なる情報を一望できます。
2019年7月7日 03:00 UTC。B01–B06はReflectivity、B07–B16は輝度温度(TBB)です。各レンジは画像表示用に設定したもので、データの有効範囲を規定するものではありません。

CHANNEL & PRODUCT DIRECTORY
最初に、AHIバンド番号、AMATERASSグリッドのチャンネル名、ネイティブ解像度、4 kmサブプロダクトの命名を対応づけます。
EXT.01 · AHI B03
rad / rfc / rfyVIS.01–03 · B01/B02/B04
rad / rfc / rfySIR.01–02 · B05/B06
rad / rfc / rfyTIR.01–10 · B07–B16
rad / tbb| AMATERASSグリッド名 | AHI | 中心波長 | ネイティブ格子 | 4 km系接尾辞 |
|---|---|---|---|---|
VIS.01vis.01 | B01 | 0.47 µm | 12,000 × 12,000 / 0.01° | rad / rfc / rfy |
VIS.02vis.02 | B02 | 0.51 µm | 12,000 × 12,000 / 0.01° | rad / rfc / rfy |
EXT.01ext.01 | B03 | 0.64 µm | 24,000 × 24,000 / 0.005° | rad / rfc / rfy |
VIS.03vis.03 | B04 | 0.86 µm | 12,000 × 12,000 / 0.01° | rad / rfc / rfy |
SIR.01sir.01 | B05 | 1.6 µm | 6,000 × 6,000 / 0.02° | rad / rfc / rfy |
SIR.02sir.02 | B06 | 2.3 µm | 6,000 × 6,000 / 0.02° | rad / rfc / rfy |
TIR.05tir.05 | B07 | 3.9 µm | 6,000 × 6,000 / 0.02° | rad / tbb |
TIR.06tir.06 | B08 | 6.2 µm | 6,000 × 6,000 / 0.02° | rad / tbb |
TIR.07tir.07 | B09 | 6.9 µm | 6,000 × 6,000 / 0.02° | rad / tbb |
TIR.08tir.08 | B10 | 7.3 µm | 6,000 × 6,000 / 0.02° | rad / tbb |
TIR.09tir.09 | B11 | 8.6 µm | 6,000 × 6,000 / 0.02° | rad / tbb |
TIR.10tir.10 | B12 | 9.6 µm | 6,000 × 6,000 / 0.02° | rad / tbb |
TIR.01tir.01 | B13 | 10.4 µm | 6,000 × 6,000 / 0.02° | rad / tbb |
TIR.02tir.02 | B14 | 11.2 µm | 6,000 × 6,000 / 0.02° | rad / tbb |
TIR.03tir.03 | B15 | 12.4 µm | 6,000 × 6,000 / 0.02° | rad / tbb |
TIR.04tir.04 | B16 | 13.3 µm | 6,000 × 6,000 / 0.02° | rad / tbb |
群内チャンネル番号とAHIバンド番号は別体系です。例えば EXT.01 はAHI B03、TIR.01 はAHI B13 に対応します。
NATIVE DN GRID, COVERAGE & QUICKLOOK
ひまわり8・9号のフルディスク観測は、衛星から見た投影座標上に画素が並ぶ走査画像です。各画素が緯度経度格子へ直接対応しているわけではなく、軌道・姿勢・走査幾何から座標を求めるだけでは、観測ごとの位置情報の誤差が残ります。本プロダクトは画像からその誤差を推定・補正した後、等緯度経度格子へ変換します。
画素は衛星投影上の列・行で記録され、緯度経度とは直接対応していません。
可視画像を地形由来のランドマーク参照画像と照合し、列・行方向の変位を求めます。
補正後の画素を共通座標へ配置し、地表面との対応が安定したDNグリッドを生成します。

位相限定相関(POC)2次元高速フーリエ変換を用い、反復探索を行わずに画像間の変位を高速に推定します。
SRTM 1秒メッシュ由来の参照画像地形データから構築したランドマーク参照画像と可視チャンネルを照合します。
高頻度観測を多地点で補正論文のひまわり8号実証では、10分ごとのフルディスク観測で22,709点、2.5分ごとの領域観測で5,826点を処理しました。
ネイティブ解像度のDNグリッド補正した観測を0.005°、0.01°、0.02°の等緯度経度格子として生成します。
座標変換そのものではなく、観測画像と地理的な参照画像との対応から、観測ごとに残る位置情報の誤差を推定する処理です。
入力画素は緯度経度に直接結び付いていないLevel-1A相当のディスクデータです。補正と格子化により、緯度経度を登録したLevel-1B相当の基礎データを生成します。
標高だけでなく水域・海洋マスクを組み合わせ、正規化静止衛星投影上のランドマーク参照画像を作成します。
位相限定相関は反復的な探索を必要とせず、相関面の明瞭なピークから列・行方向の変位を求めます。雲などの擾乱があっても補正精度を維持しました。
22,709点のフルディスク処理を88スレッドで約10秒とし、10分および2.5分間隔の準リアルタイム解析へ適用できる性能を実証しました。
coff・loffとして補正量を保持列方向・行方向のオフセットは観測時刻ごとに求められます。統計解析から、標準データに時間変動する特徴的な位置情報誤差が含まれることも確認されました。
推定した位置補正を16チャンネルのグリッド生成へ反映し、物理解析、地上検証、視差補正の基礎データを生成します。この手法はNASA GeoNEXにも適用されています。
日射量などの衛星推定値を地上観測点で検証するには、対象画素と観測地点が正しく対応している必要があります。
位置情報の誤差による非物理的な空間変動を抑え、雲や不均質な地表面の時系列解析を安定させます。
アルゴリズム、センサ校正、位置情報の誤差が混在することを避け、物理量推定の評価基盤を明確にします。
このプロダクトは、フルディスク画像を所定の地図投影へ機械的に再標本化したものではありません。観測画像そのものから時刻ごとの位置情報の誤差を求め、高精度な緯度経度対応を確立した上で格子化しています。これは、定量的な大気・陸面解析、地上観測による検証、視差補正などの基礎となる処理です。
coff / loffEXTディレクトリに含まれる YYYYMMDDHHMN.ext.fld.coff.txt.bz2 と YYYYMMDDHHMN.ext.fld.loff.txt.bz2 は、Geolocation Correctionが生成する列方向・行方向の補正情報です。通常のDN利用では参照する必要はありません。
各解像度について、最初に観測範囲と格子構造を示し、その下に代表的なクイックルックとデータ仕様をまとめます。

EXT.01 · B030.64 µm Reflectivity
EXT.01(AHI B03)
PNG/WebPは内容確認用です。数値解析には対応するバイナリファイルを使用します。

VIS.03 · B040.86 µm Reflectivity
VIS.01 / 02 / 03(AHI B01 / 02 / 04)
PNG/WebPは内容確認用です。数値解析には対応するバイナリファイルを使用します。

TIR.01 · B1310.4 µm Brightness temperature
SIR.01–02 / TIR.01–10(AHI B05–B16)
PNG/WebPは内容確認用です。数値解析には対応するバイナリファイルを使用します。
範囲は85°E–155°W、60°N–60°Sです。各画素は等緯度経度格子上に配置され、解像度に対応する海岸線を使用します。
NATIVE DN FILENAME ANATOMY
YYYYMMDDHHMN.{ext|vis|sir|tir}.NN.fld.geoss.bz2中括弧は選択肢、NNは各チャンネル群の中での2桁番号を表します。実際のファイル名には中括弧や縦線は入りません。
201907070300.ext.01.fld.geoss.bz2YYYY MM DD HH MN。例は2019年7月7日03:00 UTC
ext 500 m、vis 1 km、sir/tir 2 km
2桁固定。AHIバンド番号とは別体系
Full Diskの補正済み格子。bzip2圧縮UInt16
ext.01 = B03、vis.03 = B04、tir.01 = B13です。01だけではAHIバンドを特定できません。
fld.geossfldは本ガイドのFull Disk領域を示します。geossはこのDNプロダクト系列で使用される固定トークンです。
.bz2は最外層の圧縮展開すると末尾が.fld.geossのヘッダなしBig-endian UInt16ファイルになります。.binは付きません。
201907070300.ext.01.fld.geoss.bz2201907070300.vis.03.fld.geoss.bz2201907070300.tir.01.fld.geoss.bz2利用可能な群内番号は ext.01、vis.01–03、sir.01–02、tir.01–10です。AHIバンドとの完全な対応は上の16チャンネル表を参照してください。
NATIVE DN STORAGE ORDER & MISSING VALUE
row × NX + columnヘッダなし・行優先(row-major)65535幾何補正後に観測値が入らない画素解析時の注意:65535 は有効な観測DNではありません。統計量や物理量変換の前に欠損値として除外してください。
NATIVE DN READER SAMPLES
掲載順は、大量データの継続処理に向く言語を先にしています。いずれも bzip2 -dk FILE.bz2 などで圧縮ファイルを展開してから実行します。
ネイティブ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
ネイティブ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
ネイティブ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_dngfortran -O3 read_amaterass_dn.f90 -o read_dn ./read_dn 201907070300.vis.02.fld.geoss
ネイティブ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整数として読みます。
4 KM PHYSICAL QUANTITY PRODUCTS
全16バンドを共通の3000 × 3000格子へ変換した物理量プロダクトです。各チャンネルにRadianceを収録し、B01–B06にはReflectanceとReflectivity、B07–B16には輝度温度(TBB)を併せて収録します。
500 m・1 km・2 kmのDNはBig-endian UInt16です。4 kmプロダクトは物理量ごとに独立したBig-endian Float32ファイルとして提供され、1ファイルの展開後サイズは36,000,000 byteです。
Radianceは全16バンドに共通し、短波長側と赤外側で追加される物理量が異なります。
rad + rfc + rfyradRadiance放射輝度
rfcReflectancecos(SZA)による正規化あり
rfyReflectivitycos(SZA)による正規化なし
rad + tbbradRadiance放射輝度
tbbBrightness temperature輝度温度[K]
rad · RadianceVIS.02 · B02 · 2019-07-07 03:00 UTC
rad · VIS.02 · B020.51 µm Radiance
201907070300.vis.02.rad.fld.4km.bin.bz2
tmapによる内容確認用クイックルックです。数値解析には対応するバイナリファイルを使用します。
rfc · ReflectanceVIS.02 · B02 · 2019-07-07 03:00 UTC
rfc · VIS.02 · B020.51 µm Reflectance
201907070300.vis.02.rfc.fld.4km.bin.bz2
tmapによる内容確認用クイックルックです。数値解析には対応するバイナリファイルを使用します。
rfy · ReflectivityVIS.02 · B02 · 2019-07-07 03:00 UTC
rfy · VIS.02 · B020.51 µm Reflectivity
201907070300.vis.02.rfy.fld.4km.bin.bz2
tmapによる内容確認用クイックルックです。数値解析には対応するバイナリファイルを使用します。
tbb · Brightness temperatureTIR.03 · B15 · 2019-07-07 03:00 UTC
tbb · TIR.03 · B1512.4 µm Brightness temperature
201907070300.tir.03.tbb.fld.4km.bin.bz2
tmapによる内容確認用クイックルックです。数値解析には対応するバイナリファイルを使用します。
SHORTWAVE NORMALIZATION
放射輝度を L、変換に用いるバンド別太陽放射照度を E₀、太陽天頂角を SZA とします。rfc は cos(SZA) を分母に含み、rfy は含みません。
rfy = 100 × πL / E₀cos(SZA)による正規化なし。ファイル値の単位は%です。
rfc = πL / (E₀ cos(SZA))太陽天頂角による正規化あり。無次元量です。
FILENAME ANATOMY
YYYYMMDDHHMN.GROUP.NN.QUANTITY.fld.4km.bin.bz2GROUP.NNはAMATERASSグリッド名、QUANTITYは変換後の物理量を表します。
201907070300.vis.02.rfy.fld.4km.bin.bz2YYYYMMDDHHMN · UTC
VIS群02番 · AHI B02
rad / rfc / rfy / tbb
Full Disk · 3,000 × 3,000
Float32 · bzip2
rad放射輝度。EXT、VIS、SIR、TIRの全16バンドで生成されます。
rfc / rfyReflectanceとReflectivity。EXT、VIS、SIRにのみ存在します。
tbb輝度温度。TIRの10バンドにのみ存在します。
YYYYMMDDHHMN.VARIABLE.fld.4km.bin.bz2チャンネルを持たない格子情報・観測幾何情報は、GROUP.NN.QUANTITYの代わりに lat、lng、sun.azm、sat.zth、grd.time.mjd.hms などの変数名を置きます。
4 km化した後も、ファイル名には vis.02 や tir.03 などAMATERASSグリッドのチャンネル名が入ります。AHIバンド番号との対応は上の16チャンネル表で確認できます。
AMATERASS 4 KM INTERMEDIATE PRODUCTS
これらはAMATERASSの fld.4km 解析で、放射伝達計算へ渡す前段階に生成される格子情報・観測幾何情報です。物理量プロダクトと同じ3000 × 3000格子で、画素ごとに対応します。
ヘッダなしBig-endian Float32、行優先。西から東へ1行を書き、北から南へ行を進めます。
| ファイル名中の変数 | 内容 | 単位 | 定義・注意 |
|---|---|---|---|
lat | 緯度 | degree | 十進度。北緯を正とする格子点緯度 |
lng | 経度 | degree | 十進度。85°Eから205°E(155°W) |
grd.time.mjd.hms | 画素観測時刻 | UTC day fraction | 0–1で正規化。12:00 UTCは0.5。厳密な走査時刻ではなく近似値 |
sun.zth | 太陽天頂角 | degree | 天頂を0°とする |
sun.azm | 太陽方位角 | degree | 真南を0°とし、時計回り |
sat.zth | 衛星天頂角 | degree | 天頂を0°とする |
sat.azm | 衛星方位角 | degree | 真南を0°とし、時計回り |
方位角規約:sun.azm と sat.azm は本ガイドでは真南0°・時計回りで統一します。AMATERASSの放射伝達では太陽と衛星の相対方位角を使用します。
4 KM FLOAT32 READER SAMPLES
掲載順は、大量データの継続処理に向く言語を先にしています。いずれも bzip2 -dk FILE.bz2 などで圧縮ファイルを展開してから実行します。
4 km物理量プロダクト専用。ヘッダなし・行優先の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 ReadAmaterass4km {
private static final int NX = 3000, NY = 3000;
public static void main(String[] args) throws Exception {
if (args.length != 1) throw new IllegalArgumentException("usage: java ReadAmaterass4km FILE");
Path path = Path.of(args[0]);
long count = (long) NX * NY, expectedBytes = count * 4L;
if (Files.size(path) != expectedBytes)
throw new IllegalArgumentException("unexpected file size: " + Files.size(path) + " bytes");
float first = Float.NaN, minimum = Float.POSITIVE_INFINITY, maximum = Float.NEGATIVE_INFINITY;
long finite = 0;
try (DataInputStream in = new DataInputStream(new BufferedInputStream(Files.newInputStream(path)))) {
for (long i = 0; i < count; i++) {
float value;
try { value = in.readFloat(); }
catch (EOFException e) { throw new EOFException("unexpected end of file at value " + i); }
if (i == 0) first = value;
if (Float.isFinite(value)) {
finite++;
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", NX, NY);
System.out.printf("first = %.7g%nfinite = %d%nmin = %.7g%nmax = %.7g%n",
first, finite, minimum, maximum);
}
}javac ReadAmaterass4km.java java ReadAmaterass4km 201907070300.vis.02.rfy.fld.4km.bin
4 km物理量プロダクト専用。ヘッダなし・行優先のBig-endianバイナリとして読み、値数とファイルサイズを確認します。
#include <math.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#define NX 3000
#define NY 3000
int main(int argc, char **argv) {
if (argc != 2) { fprintf(stderr, "usage: %s FILE\n", argv[0]); return EXIT_FAILURE; }
const uint64_t count = (uint64_t)NX * NY, expected = count * 4u;
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; }
float first = NAN, minimum = INFINITY, maximum = -INFINITY;
uint64_t finite = 0;
for (uint64_t i = 0; i < count; i++) {
uint8_t b[4];
if (fread(b, 1, 4, fp) != 4) { fprintf(stderr, "unexpected end of file\n"); return EXIT_FAILURE; }
uint32_t bits = ((uint32_t)b[0] << 24) | ((uint32_t)b[1] << 16) |
((uint32_t)b[2] << 8) | (uint32_t)b[3];
float value;
memcpy(&value, &bits, sizeof value);
if (i == 0) first = value;
if (isfinite(value)) {
finite++;
if (value < minimum) minimum = value;
if (value > maximum) maximum = value;
}
}
fclose(fp);
printf("grid = %d x %d\nfirst = %.7g\nfinite = %llu\nmin = %.7g\nmax = %.7g\n",
NX, NY, first, (unsigned long long)finite, minimum, maximum);
return EXIT_SUCCESS;
}cc -O3 -std=c11 read_amaterass_4km.c -o read_4km ./read_4km 201907070300.vis.02.rfy.fld.4km.bin
4 km物理量プロダクト専用。ヘッダなし・行優先のBig-endianバイナリとして読み、値数とファイルサイズを確認します。
program read_amaterass_4km
use iso_fortran_env, only: int64, real32
use, intrinsic :: ieee_arithmetic, only: ieee_is_finite
implicit none
integer, parameter :: nx=3000, ny=3000
character(len=1024) :: path
integer :: unit, row, column, stat
integer(int64) :: bytes, expected, finite
real(real32), allocatable :: values(:)
real(real32) :: value, first, minimum, maximum
if (command_argument_count() /= 1) error stop 'usage: read_4km FILE'
call get_command_argument(1, path)
inquire(file=trim(path), size=bytes)
expected=int(nx,int64)*int(ny,int64)*4_int64
if (bytes /= expected) error stop 'unexpected file size'
allocate(values(nx))
open(newunit=unit,file=trim(path),access='stream',form='unformatted', &
status='old',action='read',convert='big_endian')
minimum=huge(minimum); maximum=-huge(maximum); finite=0; first=0.0_real32
do row=1,ny
read(unit,iostat=stat) values
if (stat /= 0) error stop 'unexpected end of file'
do column=1,nx
value=values(column)
if (row == 1 .and. column == 1) first=value
if (ieee_is_finite(value)) then
finite=finite+1; minimum=min(minimum,value); maximum=max(maximum,value)
end if
end do
end do
close(unit)
print '(A,I0,A,I0)', 'grid = ',nx,' x ',ny
print '(A,ES14.6)', 'first = ',first
print '(A,I0)', 'finite = ',finite
print '(A,ES14.6)', 'min = ',minimum
print '(A,ES14.6)', 'max = ',maximum
end program read_amaterass_4kmgfortran -O3 read_amaterass_4km.f90 -o read_4km ./read_4km 201907070300.vis.02.rfy.fld.4km.bin
4 km物理量プロダクト専用。ヘッダなし・行優先のBig-endianバイナリとして読み、値数とファイルサイズを確認します。
from pathlib import Path
import sys
import numpy as np
NX, NY = 3000, 3000
def main() -> None:
if len(sys.argv) != 2:
raise SystemExit(f"usage: {Path(sys.argv[0]).name} FILE")
path = Path(sys.argv[1])
values = np.fromfile(path, dtype=">f4")
if values.size != NX * NY:
raise ValueError(f"unexpected value count: {values.size}")
grid = values.reshape(NY, NX)
finite = np.isfinite(grid)
print(f"grid = {NX} x {NY}")
print(f"first = {float(grid[0, 0]):.7g}")
print(f"finite = {int(finite.sum())}")
print(f"min = {float(grid[finite].min()):.7g}")
print(f"max = {float(grid[finite].max()):.7g}")
if __name__ == "__main__":
main()python3 read_amaterass_4km.py 201907070300.vis.02.rfy.fld.4km.bin
読み込み対象:4 km例は3,000 × 3,000の32 bit浮動小数点数として読みます。rad / rfc / rfy / tbbで読み込み形式は共通です。
DATA AVAILABILITY
これらのプロダクトは千葉大学環境リモートセンシング研究センターにてCEReSグリッドフォーマット(緯度経度直交座標系精密幾何補正済データ)として公開されています。これらは基本的にAMATERASSの中間ファイルです。