#!/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}