#!/bin/sh
#echo executed ${0} {$1} ${2} ${3} ${4}
#echo path $PATH
SIZE=800 # szerokosc i wysokosc obrazka
DPI=120 # rozdzielczosc w DITA - nie ruszac
SCALE=500 # domyslna skala
BORDER=$[SCALE/100] # liczba metrow, o ktora nalezy powiekszyc zasieg z kazdej strony wzgledem danych wejsciowych
BORDER_CUT=$[SCALE/100]
UUID=${RANDOM}
RETRIES=3 # liczba prob wygenerowania obrazka
PROCESSES=12 # maksymalna liczba procesow potomnych
MAP_SCHEMA_DIR="./map_schema"
MAP_SCHEMA_HEAD="${MAP_SCHEMA_DIR}/head.map.inc"
MAP_SCHEMA_TAIL="${MAP_SCHEMA_DIR}/tail.map.inc"
MAP_SCHEMA_GML="${MAP_SCHEMA_DIR}/gml_layer___TYPE__.map.inc"
MAP_SCHEMA_WMS="${MAP_SCHEMA_DIR}/wms_layer.map.inc"
error() {
echo ''
echo "${1}"
exit 1
}
usage() {
cat >&2 << EOT
Usage: ${0} -g|--gml FILE[s] [OPTION]...
FILE - GML input file
Options:
-s, --scale SCALE Scale, defult ${SCALE} (means 1:${SCALE})
-b, --border METERS Size of border in meters that will be added
around GML data (default SCALE/100 = ${BORDER})
-cb, --cut-border METERS Size of additional border in meters
while splitting image (default SCALE/100 = ${BORDER})
-p, --processes shp2img processes count limit (default ${PROCESSES}
-r, --retries Number of retries to generate signle image (default ${RETRIES})
-u, --uuid UUID for generating process, defaut - random
-w, --wms WMS_LAYER[s] URLs and layer names (as following arguments)
of external WMS layers (URL|LAYER_NAME)
Example:
${0} -g gml/projekt_3625.gml -s 500 -w "https://biuro.biall-net.pl/wms/rastry|Przywidz_Jesionowa" \\
"https://biuro.biall-net.pl/wms/podklady|MDCP_Przywidz_osiedle_jesionowa_lin" \\
"https://biuro.biall-net.pl/wms/podklady|MDCP_Przywidz_osiedle_jesionowa_textx"
EOT
exit 1
}
declare -a FILES=()
declare -a WMS=()
while [ "${1}" ]; do
case ${1} in
"-s"|"--scale")
PARAM="scale"
;;
"-b"|"--border")
PARAM="border"
;;
"-cb"|"--cut-border")
PARAM="cut_border"
;;
"-g"|"--gml")
PARAM="gml"
;;
"-p"|"--processes")
PARAM="processes"
;;
"-r"|"--retries")
PARAM="retries"
;;
"-u"|"--uuid")
PARAM="uuid"
;;
"-w"|"--wms")
PARAM="wms"
;;
*)
case ${PARAM} in
"scale")
SCALE=${1}
;;
"border")
BORDER=${1}
;;
"cut_border")
CUT_BORDER={1}
;;
"gml")
FILES+=("${1}")
;;
"processes")
PROCESSES=${1}
;;
"retries")
RETRIES=${1}
;;
"uuid")
UUID=${1}
;;
"wms")
WMS+=("${1}")
;;
*)
usage
;;
esac
esac
shift
done
if [ ${#WMS[@]} -eq 0 ]; then
usage
fi
IMAGE_FILE="${PWD}/${UUID}_image" # nazwa plikow obrazow wraz ze sciezka - sam prefix (zostana dodane oznaczenia wspolrzednych kafelkow oraz dodane rozszerzenie)
XML_FILE="${PWD}/${UUID}_images.xml" # nazwa wynikowego pliku XML wraz ze sciezka
FONT_DIR="${PWD}/fonts"
TMP=`mktemp -d`
SHAPEPATH="${TMP}/2177"
#size=`echo "${SIZE}/${DPI}*2.54*${SCALE}/100" | bc -l`
#size_cut=`echo "${size} - ${BORDER_CUT}" | bc -l`
#correction_tmp=`echo "12 - l(${SCALE}) / l(2)" | bc -l`
#correction_tmp=`echo "10 ^ (${correction_tmp} / 1)" | bc`
#correction=`echo "1 / ${correction_tmp}" | bc -l`
#correction=`echo "scale=20;a=6+l(125/${SCALE})/l(2)-0.5;scale=0;b=a/1;scale=20;1/10^b" | bc -l`
correction=`echo "e(-(6+l(142/${SCALE})/l(2)-0.3)*l(8))" | bc -l`
#correction=0
size=`echo "${SIZE}/${DPI}*2.54*(${SCALE})/100 - ${correction}" | bc -l`
size_cut=`echo "${size} - ${BORDER_CUT}" | bc -l`
correction=0
for i in `seq 0 $[${#FILES[@]}-1]`; do
FILE=${FILES[i]}
if [ ! -e ${FILE} ]; then
error "File ${FILE} not found."
fi
ogr2ogr -t_srs EPSG:2177 ${SHAPEPATH} ${FILE} 2>/dev/null
done
for FILE in ${SHAPEPATH}/*.shp; do
xmin=0
extent=(`ogrinfo -al -so ${FILE} | grep Extent | sed 's/[()]/|/g;s/, /|/g' | awk -F '|' '{print $2,$3,$5,$6}'`)
if [ ${xmin} -eq 0 ]; then
xmin=${extent[0]}
ymin=${extent[1]}
xmax=${extent[2]}
ymax=${extent[3]}
else
if [ `echo "${extent[0]} < ${xmin}" | bc` -eq 1 ]; then
xmin=${extent[0]}
fi
if [ `echo "${extent[1]} < ${ymin}" | bc` -eq 1 ]; then
ymin=${extent[1]}
fi
if [ `echo "${extent[2]} > ${xmax}" | bc` -eq 1 ]; then
xmax=${extent[2]}
fi
if [ `echo "${extent[3]} > ${ymax}" | bc` -eq 1 ]; then
ymax=${extent[3]}
fi
fi
done
echo "Project extent: ${xmin} ${ymin} ${xmax} ${ymax}"
xmin=`echo "${xmin} - 5" | bc -l`
ymin=`echo "${ymin} - 5" | bc -l`
xmax=`echo "${xmax} + 5" | bc -l`
ymax=`echo "${ymax} + 5" | bc -l`
echo "New extent after 5m border added: ${xmin} ${ymin} ${xmax} ${ymax}"
lx=`echo "(${xmax} - ${xmin} - ${BORDER_CUT}) / ${size_cut} + ((${xmax} - ${xmin} - ${BORDER_CUT}) % ${size_cut} > 0)" | bc`
ly=`echo "(${ymax} - ${ymin} - ${BORDER_CUT}) / ${size_cut} + ((${ymax} - ${ymin} - ${BORDER_CUT}) % ${size_cut} > 0)" | bc`
echo "Images count (width x height): ${lx}x${ly}"
xmin=`echo "${xmin} - (${lx} * ${size_cut} + ${BORDER_CUT} - (${xmax} - ${xmin})) / 2" | bc -l`
ymin=`echo "${ymin} - (${ly} * ${size_cut} + ${BORDER_CUT} - (${ymax} - ${ymin})) / 2" | bc -l`
xmax=`echo "${xmin} + ${lx} * ${size_cut} + ${BORDER_CUT}" | bc -l`
ymax=`echo "${ymin} + ${ly} * ${size_cut} + ${BORDER_CUT}" | bc -l`
echo "New extent after centering project features: ${xmin} ${ymin} ${xmax} ${ymax}"
MAP="${TMP}/map.map"
EXTENT="${xmin} ${ymin} ${xmax} ${ymax}"
sed "s|__SHAPEPATH__|${SHAPEPATH}|g;s/__EXTENT__/${EXTENT}/g;s|__FONT_DIR__|${FONT_DIR}|g" ${MAP_SCHEMA_HEAD} > ${MAP}
if [ ${#WMS[@]} -gt 0 ]; then
for i in `seq 0 $[${#WMS[@]}-1]`; do
URL=`echo ${WMS[i]} | cut -d '|' -f 1`
LAYER_NAME=`echo ${WMS[i]} | cut -d '|' -f 2`
sed "s|__URL__|${URL}|g;s|__EXTENT__|${EXTENT}|g;s|__LAYER_NAME__|${LAYER_NAME}|g" ${MAP_SCHEMA_WMS} >> ${MAP}
done
fi
for FILE in ${SHAPEPATH}/*.shp; do
TYPE=`ogrinfo ${FILE} | tail -1 | sed 's/[()]/|/g' | cut -d "|" -f 2`
case ${TYPE} in
"Point") TYPE="POINT";;
"Line String") TYPE="LINE";;
"Polygon") TYPE="POLYGON";;
*) error "Unknown layer type \"${TYPE}\" for ${FILE}";;
esac
LAYER_NAME=`echo ${FILE} | rev | cut -d "/" -f 1 | cut -d "." -f 2- | rev`
sed "s|__LAYER_NAME__|${LAYER_NAME}|g" ${MAP_SCHEMA_GML//__TYPE__/${TYPE}} >> ${MAP}
done
cat ${MAP_SCHEMA_TAIL} >> ${MAP}
echo '' > ${XML_FILE}
echo "" >> ${XML_FILE}
for y in `seq 1 ${ly}`; do
for x in `seq 1 ${lx}`; do
jobs=`jobs -p | wc -l`
while [ ${jobs} -ge ${PROCESSES} ]; do
sleep 1
jobs=`jobs -p | wc -l`
done
printf "Generating ${x}x${y} "
lxmin=`echo "${xmin} + ${size_cut} * (${x} -1) + ${correction}" | bc -l`
lymin=`echo "${ymin} + ${size_cut} * (${y} -1) + ${correction}" | bc -l`
lxmax=`echo "${lxmin} + ${size} - 2 * ${correction}" | bc -l`
lymax=`echo "${lymin} + ${size} - 2 * ${correction}" | bc -l`
printf "(BBOX: ${lxmin} ${lymin} ${lxmax} ${lymax})...\n"
file="${IMAGE_FILE}-${y}-${x}.png"
count=0;
for FILE in ${SHAPEPATH}/*.shp; do
count=$[count + `ogrinfo -so -al -spat ${lxmin} ${lymin} ${lxmax} ${lymax} ${FILE} | grep "Feature Count:" | sed 's/.*: //g'`]
done
if [ ${count} -gt 0 ]; then
echo " " >> ${XML_FILE}
echo " ${lxmin}" >> ${XML_FILE}
echo " ${lymin}" >> ${XML_FILE}
echo " ${lxmax}" >> ${XML_FILE}
echo " ${lymax}" >> ${XML_FILE}
echo " ${file}" >> ${XML_FILE}
echo " " >> ${XML_FILE}
echo "\tshp2img -m \"${MAP}\" -o ${file} -e ${lxmin} ${lymin} ${lxmax} ${lymax}"
{
retry=0
while [ ${retry} -le ${RETRIES} ]; do
shp2img -m "${MAP}" -o ${file} -e ${lxmin} ${lymin} ${lxmax} ${lymax} 2>>${TMP}/log && break
retry=$[retry+1]
if [ ${retry} -le ${RETRIES} ]; then
echo "Retrying ${x}x${y} (${retry}/${RETRIES})..."
else
echo "Error generating ${x}x${y}, giving up :("
touch ${TMP}/ERROR
fi
done
} &
else
echo " no features found - skipping."
fi
done
done
wait
if [ -a "${TMP}/ERROR" ]; then
echo "===== LOG START ====="
cat ${TMP}/log
echo "======LOG END ======="
rm -rf ${TMP}
error "Error during generating images"
fi
echo '' >> ${XML_FILE}
echo "===== XML (${XML_FILE}) ====="
cat ${XML_FILE}
rm -rf ${TMP}