スペースで区切られたデータを含む巨大なESRI Gridファイルがあります。この質問を簡単にするために、elevation.asc
5x5 の値を持つサンプル ファイルを使用します。
my のヘッダーにはelevation.asc
、最初の値の開始座標 (緯度、経度) など、データに関する追加情報が含まれています。完全なファイルは次のようになります。
ncols 5
nrows 5
xllcorner 3356385.137
yllcorner 5800799.818
cellsize 1.0
NODATA_value -9999
31.11266 31.03987 31.15038 30.98865 30.96297
29.65054 29.65345 29.65598 29.60781 29.61685
29.70712 29.66978 29.73194 29.83858 29.87868
29.54893 29.60815 29.62812 29.66953 29.70786
29.55878 29.55927 29.58562 29.66112 29.79232
今私の質問は、bash
スクリプトを使用して指定された座標でこのファイルの標高データにアクセスする方法ですか?
スクリプトを呼び出して、次のような最初のデータ値を生成したいusage: myscript.sh {file} {x} {y}
:
$ ./myscript.sh elevation.asc 3356385.137 5800799.818
31.11266
または:
$ ./myscript.sh elevation.asc 3356387.137 5800803.818
29.58562
さて、これまでに何を試しましたか?while
x 座標と y 座標を反復処理awk
し、ヘッダーを解析し、bc
浮動小数点計算を行うループをいじっていました。しかし、私は今、どのように進めるべきか迷っています。これは私が得たものです:
#!/bin/bash
E_BADARGS=65
E_NOINPUT=66
N_ARGS=3
# Checks for proper number of command line args.
if [ $# -ne $N_ARGS ] ; then
echo "Usage: `basename $0` {input.file} {x} {y}"
exit $E_BADARGS
fi
# Checks for proper input file.
INPUT=$1
[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit $E_NOINPUT; }
# Parses file header info.
cols=$(awk '$1 == "ncols" { print $2 }' $INPUT)
rows=$(awk '$1 == "nrows" { print $2 }' $INPUT)
x11=$(awk '$1 == "xllcorner" { print $2 }' $INPUT)
y11=$(awk '$1 == "yllcorner" { print $2 }' $INPUT)
size=$(awk '$1 == "cellsize" { print $2 }' $INPUT)
nodata=$(awk '$1 == "NODATA_value" { print $2 }' $INPUT)
# Calculates maximum coordinates.
xpp=$(bc <<< "$x11+$cols-1")
ypp=$(bc <<< "$y11+$rows-1")
# Gets requested coordinates from args.
X=$2
Y=$3
### What now?
しかし、ええ、今何ですか?ループを使用してラスター全体を反復処理してwhile
座標の位置を見つけることができますが、保存されたデータ値ではなく、入力座標を見つけるだけであることに気付きました。
# Iterates through the whole raster.
while [ $(echo "$y11 < $ypp" | bc) == 1 ] ; do
while [ $(echo "$x11 < $xpp" | bc) == 1 ] ; do
if [ $X == $x11 ] && [ $Y == $y11 ] ; then
### What now?
fi
x11=$(bc <<< "$x11+$size")
done
y11=$(bc <<< "$y11+$size")
done
進め方がわかりません。bash スクリプトを使用して標高データにアクセスするには?
更新: 説明
この質問の上にある 5x5 マトリックスは、数値標高モデルを表すデータ プロットです。各値は海抜メートルを意味します。
入力と出力: ファイル名、緯度座標 (x)、経度座標 (y) の 3 つの引数を指定してスクリプトを呼び出します。そのように:
$ ./myscript.sh elevation.asc 3356385.137 5800799.818
ここで、ヘッダーで定義されているデータセットは、左上隅 (最初の座標) の座標xllcorner=3356385.137
およびから始まりyllcorner=5800799.818
ます。したがって、この 2 つの座標でスクリプトを呼び出すと、5x5 マトリックスの左上隅にある最初の高度データ (z) が生成されz=31.11266
ます。size
x 方向と y 方向のデータの 2 つのフィールド間のステップのサイズ (メートル単位) です。したがって、これを呼び出す:
$ ./myscript.sh elevation.asc 3356387.137 5800803.818
... x 方向に 2 ステップ、y 方向に 4 ステップ移動すると、 が得られz=29.58562
ます。マトリックスで数えるだけです。
あればもっと簡単ですがxllcorner
、yllcorner
そうではあり0
ません。