NASAが公開しているSRTM3標高データファイルから,perlで値を読み込むサンプルです.
SRTM3データから標高を読む
公式サイト
日本のデータファイルは,
のEurasia配下にあります.たくさんありますが,ファイル名の規則はこうなっています.
ファイル名の規則
N35E139.hgt の場合
- 左下(南西)の隅が,北緯35度 東経139度
- 北緯35〜36度,東経139〜140度の範囲を含む
となります.日本全域をカバーしようとすると,全部で270ファイルぐらいになると思います.
ファイルの内容
この範囲を3秒ごとに分割した1201×1201のセルの,
ジオイドモデルWGS84/EGM96での標高値が最初から最後まで並んでいるというのが,
ファイルの内容です.
各標高値は,ビッグエンディアンの2バイト整数で格納されており,欠測値は-1です.
ファイルサイズはぴったり2884802(=1201×1201×2)バイトです.
プログラム例
#!/usr/bin/perl
use
strict;
my
$COLS
= 1201;
my
$RECSIZE
= $COLS
* 2;
# 対象位置の緯度経度を,起動引数から取得する
my
($y
, $x
) = (shift
, shift
);
my
$fx
= int
($x
);
my
$fy
= int
($y
);
my
$filename
= "N"
.$fy
. "E"
.$fx
. ".hgt"
;
my
$base_x
= $fx
;
my
$base_y
= $fy
+ 1;
my
$x_pos
= int
( ($x
- $base_x
) * 1200 );
my
$y_pos
= int
( ($base_y
- $y
) * 1200 );
if
(open
(HGTFILE, $filename
)) {
binmode
(HGTFILE);
seek
(HGTFILE, $RECSIZE
* $y_pos
+ $x_pos
* 2, 0);
my
$buf
;
read
(HGTFILE, $buf
, 2);
close
(HGTFILE);
# ビッグエンディアンのunsigned shortで取得する
my
$h
= unpack
("n*"
, $buf
);
# unsignedからsignedに変換する
$h
= $h
- 65536 if
($h
> 32767);
print
"height=$h
\n"
;
}
動いているサンプル
緯度経度取得ツールで,実際に位置から標高値を取得するのを試すことができます.