尝试编写一个使用 Charles Karney 的脚本GeodSolve
来解决直接的测地线问题。 GeodSolve 接受输入:lat1 lon1 azi1 dist1,输出:lat2 lon2 azi2。
我有一个文件(“azi_dist_file”),分别在第一列和第二列中包含方位角和距离。在下面的简单脚本中,要求用户提供初始位置 lat1 和 lon1,而 azi1 和 dist1 是从 azi_dist_file 中获取的。然后,程序GeodSolve
将解决直接测地线问题并返回端点位置 lat2 lon2 (以及此处不相关的 azi2);我希望将第二个位置用作进一步调用 的初始位置GeodSolve
,但从 azi_dist_file 的第二行获取 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
这read vars < <(cmd)
是为了解决以下事实:在bash
(与zsh
AT&T相反ksh
)中cmd | read vars
,read
命令在子 shell 中运行。或者,对于最新版本的bash
,您可以在本例中使用类似于或 的shopt -s lastpipe
行为。bash
zsh
ksh
POSIXly,您还可以使用:
unset -v IFS; set -f; set -- $(cmd); lat=$1 lon=$2