GeodSolve
直接測地線の問題を解決するには、Charles Karneyを使用してスクリプトを作成してみてください。 GeodSolveは入力:lat1 lon1 azi1 dist1、出力:lat2 lon2 azi2を受け入れます。
最初の列と2番目の列には、それぞれ方位角と距離を含むファイル(「azi_dist_file」)があります。以下の簡単なスクリプトでは、ユーザーに初期位置 lat1 と lon1 を提供するように要求し、azi1 と dist1 は azi_dist_file から取得します。その後、プログラムはGeodSolve
直接測地線の問題を解決し、エンドポイント位置lat2 lon2(およびここでは関係のないazi2)を返します。 2番目の場所を追加呼び出しの初期位置として使用したいが、GeodSolve
azi_dist_fileの2行目からazi2を取得します。 dist2;ファイルの最後の行に達するまで繰り返します。最後に、緯度、経度、方位角、距離の値をすべて新しいファイルに書きたいと思います。
これまで私は次のように書いています。
#!/bin/bash
echo "Enter starting latitude: "
read lat1
echo "Enter starting longitude: "
read lon1
alpha1=`awk 'NR==1{print;exit}' azi_dist_file|cut -f1 -d$'\t'`
dist1=`awk 'NR==1{print;exit}' azi_dist_file|cut -f2 -d$'\t'`
echo "$lat1 $lon1 $alpha1 $dist1" >> lat_lon_azi_dist_file
echo $lat1 $lon1 $alpha1 $dist1 | GeodSolve
lat2=`echo $lat1 $lon1 $alpha1 $dist1 | GeodSolve | cut -f1 -d' '`
lon2=`echo $lat1 $lon1 $alpha1 $dist1 | GeodSolve | cut -f2 -d' '`
echo "$lat2 $lon2"
答え1
似たようなものが欲しいようです。
#!/bin/bash -
# lat/lon passed as arguments to the script instead of being input to the
# user:
lat=${1?} lon=${2?}
while read alpha dist ignore; do
printf '%s\n' "$lat $lon $alpha $dist" >&3
read lat lon ignore < <(
printf '%s\n' "$lat $lon $alpha $dist" | GeodSolve 3>&-)
printf '%s\n' "$lat $lon"
done < azi_dist_file 3> lat_lon_azi_dist_file
これは、AT&Tとは異なり、コマンドがサブシェルで実行されることread vars < <(cmd)
を説明するためのものです。または、最新バージョンの場合は、この場合と同様の動作を使用できます。bash
zsh
ksh
cmd | read vars
read
bash
shopt -s lastpipe
bash
zsh
ksh
POSIXlyでは、次のものも使用できます。
unset -v IFS; set -f; set -- $(cmd); lat=$1 lon=$2