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";
}

動いているサンプル

緯度経度取得ツールで,実際に位置から標高値を取得するのを試すことができます.


© 2024 KMIソフトウェア