1

スペースで区切られたデータを含む巨大なESRI Gridファイルがあります。この質問を簡単にするために、elevation.asc5x5 の値を持つサンプル ファイルを使用します。

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

さて、これまでに何を試しましたか?whilex 座標と 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ます。sizex 方向と y 方向のデータの 2 つのフィールド間のステップのサイズ (メートル単位) です。したがって、これを呼び出す:

 $ ./myscript.sh elevation.asc 3356387.137 5800803.818

... x 方向に 2 ステップ、y 方向に 4 ステップ移動すると、 が得られz=29.58562ます。マトリックスで数えるだけです。

あればもっと簡単ですがxllcorneryllcornerそうではあり0ません。

4

2 に答える 2