| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- #!/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=5 # liczba metrow, o ktora nalezy powiekszyc zasieg z kazdej strony wzgledem danych wejsciowych
- BORDER_CUT="5"
- UUID=${RANDOM}
- RETRIES=3 # liczba prob wygenerowania obrazka
- 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 '<?xml version="1.0" encoding="UTF-8"?>'
- echo "<Error>${1}</Error>"
- 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 ${BORDER})
- -cb, --cut-border METERS Size of additional border in meters
- while splitting image (default ${BORDER_CUT})
- -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"
- ;;
- "-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}")
- ;;
- "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`
- 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 version="1.0" encoding="UTF-8"?>' > ${XML_FILE}
- echo "<images uuid=\"${UUID}\">" >> ${XML_FILE}
- for y in `seq 1 ${ly}`; do
- for x in `seq 1 ${lx}`; do
- printf "Generating ${x}x${y} "
- lxmin=`echo "${xmin} + ${size_cut} * (${x} -1)" | bc -l`
- lymin=`echo "${ymin} + ${size_cut} * (${y} -1)" | bc -l`
- lxmax=`echo "${lxmin} + ${size}" | bc -l`
- lymax=`echo "${lymin} + ${size}" | 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 " <image x=\"${x}\" y=\"${y}\">" >> ${XML_FILE}
- echo " <xmin>${lxmin}</xmin>" >> ${XML_FILE}
- echo " <ymin>${lymin}</ymin>" >> ${XML_FILE}
- echo " <xmax>${lxmax}</xmax>" >> ${XML_FILE}
- echo " <ymax>${lymax}</ymax>" >> ${XML_FILE}
- echo " <file>${file}</file>" >> ${XML_FILE}
- echo " </image>" >> ${XML_FILE}
- {
- 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 '</images>' >> ${XML_FILE}
- echo "===== XML (${XML_FILE}) ====="
- cat ${XML_FILE}
- rm -rf ${TMP}
|