shellcheck overpass

This commit is contained in:
Hugoren Martinako 2021-04-08 20:01:39 +02:00
parent 220df86e66
commit cc5233a2dc
3 changed files with 85 additions and 79 deletions

View File

@ -1 +0,0 @@
nw[shop~"yes|convenience|supermarket|mall"][~"name"~"lupa",i];

View File

@ -1,16 +1,22 @@
#!/bin/bash
usage() {
echo
echo -e "Usage:\t$0 <filename.ql>"
echo
echo -e "\t[-p <string>]\tGeographic scope. Split by commas. If empty, search area will be ['ISO3166-1'=ES]"
echo -e "\t[-a <string>]\tSearch area expression. Wrapped with brackets, i.e. [name=Matarrosa][admin_level=8]"
echo -e "\t[-t <integer>]\tQuery timeout in seconds (default: 900)"
echo -e "\t[-n <string>]\tOutput filename"
echo -e "\t[-s <string>]\tOverpass server (default: https://overpass-api.de/api/interpreter)"
echo -e "\t[-w <integer>]\tRetry time in seconds (default: 60)"
echo
cat <<-EOF | column -s"~" -t
~
Usage:~${0} <filename.ql> [OPTIONS]
~
-p~Geographic scope. Split by commas. If empty, search area will be ['ISO3166-1'=ES]
~Available presets:
~ ccaa: AN AR AS CB CE CL CM CN CT EX GA IB MC MD ML NC PV RI VC
~ prov: A AB AL AV B BA BI BU C CA CC CO CR CS CU GC GI GR GU H HU J L LE LO LU M MA MU NA O OR P PM PO S SA SE SG SO SS T TE TF TO V VA VI Z ZA
-a~Search area expression. Wrapped with brackets, i.e. [name=Matarrosa][admin_level=8]
-t~query timeout in seconds (default: 900)
-n~Output filename
-s~Overpass server (default: https://overpass-api.de/api/interpreter)
-w~Retry time in seconds (default: 60)
~
EOF
exit 1;
}
@ -23,14 +29,14 @@ if [[ ! -f $1 ]] ; then
usage;
fi
TIMEOUT=900
WAITRETRY=60
SERVER="https://overpass-api.de/api/interpreter"
PROVINCES=()
AREAEXPR=
NAME=
QUERY=$1
JOIN=
# defaults
timeout=900
waitretry=60
server="https://overpass-api.de/api/interpreter"
provinces=()
areaexpr=
name=
query=$1
# move the file argument, to parse the rest of options
shift
@ -38,115 +44,115 @@ shift
while getopts "t:s:w:a:p:n:" o; do
case "${o}" in
t)
TIMEOUT=${OPTARG}
timeout=${OPTARG}
;;
s)
SERVER=${OPTARG}
server=${OPTARG}
;;
w)
WAITRETRY=${OPTARG}
waitretry=${OPTARG}
;;
a)
AREAEXPR=${OPTARG}
areaexpr=${OPTARG}
;;
n)
NAME=${OPTARG}
name=${OPTARG}
;;
p)
# presets for group elements all in once
if [[ $OPTARG == "CCAA" ]]; then
PROVINCES=(AN AR AS CB CE CL CM CN CT EX GA IB MC MD ML NC PV RI VC)
elif [[ $OPTARG == "PROV" ]]; then
PROVINCES=(A AB AL AV B BA BI BU C CA CC CO CR CS CU GC GI GR GU H HU J L LE LO LU M MA MU NA O OR P PM PO S SA SE SG SO SS T TE TF TO V VA VI Z ZA)
if [[ "${OPTARG,,}" == "ccaa" ]]; then
provinces=(AN AR AS CB CE CL CM CN CT EX GA IB MC MD ML NC PV RI VC)
elif [[ "${OPTARG,,}" == "prov" ]]; then
provinces=(A AB AL AV B BA BI BU C CA CC CO CR CS CU GC GI GR GU H HU J L LE LO LU M MA MU NA O OR P PM PO S SA SE SG SO SS T TE TF TO V VA VI Z ZA)
else
set -f
IFS=','
PROVINCES=($OPTARG)
IFS="," read -r -a provinces <<< "${OPTARG}"
fi
;;
j)
JOIN=1
;;
*)
usage
;;
esac
done
function out() {
local CONTENT="$1"
# waiting time in seconds of the waitretry +/- 25%
delay=$(( ( RANDOM % $(( "${waitretry}" * 5 / 4 )) ) + $(( "${waitretry}" * 3 / 4 )) ));
cat <<-EOF
[out:xml][timeout:$TIMEOUT];
$CONTENT
out meta;
>;
out meta qt;
# handle kill signs
trap "echo; exit 1" INT TERM
function out() {
local content="$1"
cat <<EOF
[out:xml][timeout:${timeout}];
${content}
out meta;
>;
out meta qt;
EOF
}
function province() {
local CONTENT_SCOPED=$(echo "$1" | sed -r "s/(node|way|rel|nw|wr|nwr)/\1(area.searchArea)/")
local content_scoped
content_scoped=$(echo "$1" | sed -r "s/(node|way|rel|nw|wr|nwr)/\1(area.searchArea)/")
case "$2" in
ES)
AREA="area['ISO3166-1'=ES]"
area="area['ISO3166-1'=ES]"
;;
CUSTOM)
AREA="area$3"
area="area$3"
;;
*)
AREA="area['ISO3166-2'='ES-$2']"
area="area['ISO3166-2'='ES-$2']"
;;
esac
cat <<-EOF
$AREA->.searchArea;
$CONTENT_SCOPED
cat <<EOF
${area}->.searchArea;
${content_scoped}
EOF
}
# waiting time in seconds of the WAITRETRY +/- 25%
DELAY=$(( ( RANDOM % $(expr $WAITRETRY \* 5 / 4) ) + $(expr $WAITRETRY \* 3 / 4) ));
function query() {
while true; do
defname=$1
filename=${name:-"${defname}"}.osm
if wget -O "data/${filename}" --post-file="${tmp}" "${server}" --no-verbose; then break; fi; # check return value, break if successful (0)
if [[ ! -z "${PROVINCES[@]}" ]]; then
for i in "${PROVINCES[@]}"; do
tmp=/tmp/overpassql/$(date +%F).$i.$(basename $QUERY)
mkdir -p $(dirname $tmp) && touch $tmp
province "$(< $QUERY)" $i > $tmp
out "$(< $tmp)" | tee $tmp
sleep "${delay}";
done;
}
while [ 1 ]; do
defname=$(basename $QUERY).$i
filename=${NAME:-$defname}.osm
wget -O data/$filename --post-file=$tmp $SERVER --no-verbose
if [ $? = 0 ]; then break; fi; # check return value, break if successful (0)
sleep $DELAY;
done
if [[ "${#provinces[@]}" -ne 0 ]]; then
for i in "${provinces[@]}"; do
tmp="/tmp/overpassql/$(date +%F).${i}.$(basename "${query}")"
mkdir -p "$(dirname "${tmp}")" && touch "${tmp}"
rm $tmp
province "$(< "${query}")" "${i}" > "${tmp}"
out "$(< "${tmp}")" | tee "${tmp}"
query "$(basename "${query}")"."${i}"
rm "${tmp}"
done
else
tmp=/tmp/overpassql/$(date +%F).$(basename $QUERY)
mkdir -p $(dirname $tmp) && touch $tmp
echo "$(< $QUERY)" > $tmp
tmp="/tmp/overpassql/$(date +%F).$(basename "${query}")"
mkdir -p "$(dirname "${tmp}")" && touch "${tmp}"
echo "$(< "${query}")" > "${tmp}"
if [[ ! -z "$AREAEXPR" ]]; then
province "$(< $tmp)" CUSTOM "$AREAEXPR" > $tmp
if [[ -n "${areaexpr}" ]]; then
province "$(< "${tmp}")" CUSTOM "${areaexpr}" > "${tmp}"
fi
out "$(< $tmp)" | tee $tmp
out "$(< "${tmp}")" | tee "${tmp}"
while [ 1 ]; do
defname=$(basename $QUERY)
filename=${NAME:-$defname}.osm
wget -O data/$filename --post-file=$tmp $SERVER --no-verbose
if [ $? = 0 ]; then break; fi; # check return value, break if successful (0)
sleep $DELAY;
done;
query "$(basename "${query}")"
rm $tmp
rm "${tmp}"
fi
exit 0;

View File

@ -0,0 +1 @@
nwr["name"]["alt_name"](if: t["name"] == t["alt_name"]);