-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathwmsmap2scaledenominator
executable file
·57 lines (47 loc) · 1.43 KB
/
wmsmap2scaledenominator
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#!/usr/bin/env bash
PROGRAM_NAME=$(basename "$0")
URL="$1"
function usage {
echo "Calculate the scale denominator of a WMS GetMap request."
echo "When no DPI parameter provided in the URL (e.g. \`DPI=92\`), "
echo "the script assumes a default DPI value of 90.71446714322."
echo ""
echo "usage: $PROGRAM_NAME <getmap_url> "
echo " - <getmap_url>: WMS GetMap request URL"
exit 1
}
# see https://stackoverflow.com/a/37840948
function urldecode() {
: "${*//+/ }"
echo -e "${_//%/\\x}"
}
if test "$#" -ne 1; then
usage
fi
# shellcheck disable=SC1001
if ! [[ $URL = \http://* || $URL = \https://* ]];then
usage
fi
set -euo pipefail
URL="$(urldecode "$URL")"
QUERY_STRING=$(cut -d? -f2 <<<"$URL")
declare -A param
while IFS='=' read -r -d '&' key value && [[ -n "$key" ]]; do
param["$key"]=$value
done <<<"${QUERY_STRING}&"
BBOX=${param[BBOX]}
IMAGE_WIDTH=${param[WIDTH]}
MIN_X=$(cut -d, -f1 <<<"$BBOX")
MAX_X=$(cut -d, -f3 <<<"$BBOX")
DELTA_X=$(bc <<<"$MAX_X-$MIN_X")
if [ ${param[DPI]+_} ]; then
DPI=${param[DPI]}
else
echo "NO DPI query param found, using default value for DPI: 90.71446714322"
DPI="90.71446714322"
fi
# SCALE: "1:${SCALEDENOMINATOR}"
# SCALEDENOMINATOR = $REALWORLD_DISTANCE/$SCREEN_DISTANCE
SCREEN_DISTANCE=$(bc -l <<<"(((${IMAGE_WIDTH}/${DPI})*2.54)/100)")
SCALEDENOMINATOR=$(bc -l <<<"${DELTA_X}/${SCREEN_DISTANCE}")
echo "${SCALEDENOMINATOR}" | xargs printf "%.2f"