genpng2.sh 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. #!/bin/sh
  2. #echo executed ${0} {$1} ${2} ${3} ${4}
  3. #echo path $PATH
  4. SIZE=800 # szerokosc i wysokosc obrazka
  5. DPI=120 # rozdzielczosc w DITA - nie ruszac
  6. SCALE=500 # domyslna skala
  7. BORDER=5 # liczba metrow, o ktora nalezy powiekszyc zasieg z kazdej strony wzgledem danych wejsciowych
  8. BORDER_CUT="5"
  9. UUID=${RANDOM}
  10. RETRIES=3 # liczba prob wygenerowania obrazka
  11. MAP_SCHEMA_DIR="./map_schema"
  12. MAP_SCHEMA_HEAD="${MAP_SCHEMA_DIR}/head.map.inc"
  13. MAP_SCHEMA_TAIL="${MAP_SCHEMA_DIR}/tail.map.inc"
  14. MAP_SCHEMA_GML="${MAP_SCHEMA_DIR}/gml_layer___TYPE__.map.inc"
  15. MAP_SCHEMA_WMS="${MAP_SCHEMA_DIR}/wms_layer.map.inc"
  16. error() {
  17. echo '<?xml version="1.0" encoding="UTF-8"?>'
  18. echo "<Error>${1}</Error>"
  19. exit 1
  20. }
  21. usage() {
  22. cat >&2 << EOT
  23. Usage: ${0} -g|--gml FILE[s] [OPTION]...
  24. FILE - GML input file
  25. Options:
  26. -s, --scale SCALE Scale, defult ${SCALE} (means 1:${SCALE})
  27. -b, --border METERS Size of border in meters that will be added
  28. around GML data (default ${BORDER})
  29. -cb, --cut-border METERS Size of additional border in meters
  30. while splitting image (default ${BORDER_CUT})
  31. -r, --retries Number of retries to generate signle image (default ${RETRIES})
  32. -u, --uuid UUID for generating process, defaut - random
  33. -w, --wms WMS_LAYER[s] URLs and layer names (as following arguments)
  34. of external WMS layers (URL|LAYER_NAME)
  35. Example:
  36. ${0} -g gml/projekt_3625.gml -s 500 -w "https://biuro.biall-net.pl/wms/rastry|Przywidz_Jesionowa" \\
  37. "https://biuro.biall-net.pl/wms/podklady|MDCP_Przywidz_osiedle_jesionowa_lin" \\
  38. "https://biuro.biall-net.pl/wms/podklady|MDCP_Przywidz_osiedle_jesionowa_textx"
  39. EOT
  40. exit 1
  41. }
  42. declare -a FILES=()
  43. declare -a WMS=()
  44. while [ "${1}" ]; do
  45. case ${1} in
  46. "-s"|"--scale")
  47. PARAM="scale"
  48. ;;
  49. "-b"|"--border")
  50. PARAM="border"
  51. ;;
  52. "-cb"|"--cut-border")
  53. PARAM="cut_border"
  54. ;;
  55. "-g"|"--gml")
  56. PARAM="gml"
  57. ;;
  58. "-r"|"--retries")
  59. PARAM="retries"
  60. ;;
  61. "-u"|"--uuid")
  62. PARAM="uuid"
  63. ;;
  64. "-w"|"--wms")
  65. PARAM="wms"
  66. ;;
  67. *)
  68. case ${PARAM} in
  69. "scale")
  70. SCALE=${1}
  71. ;;
  72. "border")
  73. BORDER=${1}
  74. ;;
  75. "cut_border")
  76. CUT_BORDER={1}
  77. ;;
  78. "gml")
  79. FILES+=("${1}")
  80. ;;
  81. "retries")
  82. RETRIES=${1}
  83. ;;
  84. "uuid")
  85. UUID=${1}
  86. ;;
  87. "wms")
  88. WMS+=("${1}")
  89. ;;
  90. *)
  91. usage
  92. ;;
  93. esac
  94. esac
  95. shift
  96. done
  97. if [ ${#WMS[@]} -eq 0 ]; then
  98. usage
  99. fi
  100. IMAGE_FILE="${PWD}/${UUID}_image" # nazwa plikow obrazow wraz ze sciezka - sam prefix (zostana dodane oznaczenia wspolrzednych kafelkow oraz dodane rozszerzenie)
  101. XML_FILE="${PWD}/${UUID}_images.xml" # nazwa wynikowego pliku XML wraz ze sciezka
  102. FONT_DIR="${PWD}/fonts"
  103. TMP=`mktemp -d`
  104. SHAPEPATH="${TMP}/2177"
  105. size=`echo "${SIZE}/${DPI}*2.54*${SCALE}/100" | bc -l`
  106. size_cut=`echo "${size} - ${BORDER_CUT}" | bc -l`
  107. for i in `seq 0 $[${#FILES[@]}-1]`; do
  108. FILE=${FILES[i]}
  109. if [ ! -e ${FILE} ]; then
  110. error "File ${FILE} not found."
  111. fi
  112. ogr2ogr -t_srs EPSG:2177 ${SHAPEPATH} ${FILE} 2>/dev/null
  113. done
  114. for FILE in ${SHAPEPATH}/*.shp; do
  115. xmin=0
  116. extent=(`ogrinfo -al -so ${FILE} | grep Extent | sed 's/[()]/|/g;s/, /|/g' | awk -F '|' '{print $2,$3,$5,$6}'`)
  117. if [ ${xmin} -eq 0 ]; then
  118. xmin=${extent[0]}
  119. ymin=${extent[1]}
  120. xmax=${extent[2]}
  121. ymax=${extent[3]}
  122. else
  123. if [ `echo "${extent[0]} < ${xmin}" | bc` -eq 1 ]; then
  124. xmin=${extent[0]}
  125. fi
  126. if [ `echo "${extent[1]} < ${ymin}" | bc` -eq 1 ]; then
  127. ymin=${extent[1]}
  128. fi
  129. if [ `echo "${extent[2]} > ${xmax}" | bc` -eq 1 ]; then
  130. xmax=${extent[2]}
  131. fi
  132. if [ `echo "${extent[3]} > ${ymax}" | bc` -eq 1 ]; then
  133. ymax=${extent[3]}
  134. fi
  135. fi
  136. done
  137. echo "Project extent: ${xmin} ${ymin} ${xmax} ${ymax}"
  138. xmin=`echo "${xmin} - 5" | bc -l`
  139. ymin=`echo "${ymin} - 5" | bc -l`
  140. xmax=`echo "${xmax} + 5" | bc -l`
  141. ymax=`echo "${ymax} + 5" | bc -l`
  142. echo "New extent after 5m border added: ${xmin} ${ymin} ${xmax} ${ymax}"
  143. lx=`echo "(${xmax} - ${xmin} - ${BORDER_CUT}) / ${size_cut} + ((${xmax} - ${xmin} - ${BORDER_CUT}) % ${size_cut} > 0)" | bc`
  144. ly=`echo "(${ymax} - ${ymin} - ${BORDER_CUT}) / ${size_cut} + ((${ymax} - ${ymin} - ${BORDER_CUT}) % ${size_cut} > 0)" | bc`
  145. echo "Images count (width x height): ${lx}x${ly}"
  146. xmin=`echo "${xmin} - (${lx} * ${size_cut} + ${BORDER_CUT} - (${xmax} - ${xmin})) / 2" | bc -l`
  147. ymin=`echo "${ymin} - (${ly} * ${size_cut} + ${BORDER_CUT} - (${ymax} - ${ymin})) / 2" | bc -l`
  148. xmax=`echo "${xmin} + ${lx} * ${size_cut} + ${BORDER_CUT}" | bc -l`
  149. ymax=`echo "${ymin} + ${ly} * ${size_cut} + ${BORDER_CUT}" | bc -l`
  150. echo "New extent after centering project features: ${xmin} ${ymin} ${xmax} ${ymax}"
  151. MAP="${TMP}/map.map"
  152. EXTENT="${xmin} ${ymin} ${xmax} ${ymax}"
  153. sed "s|__SHAPEPATH__|${SHAPEPATH}|g;s/__EXTENT__/${EXTENT}/g;s|__FONT_DIR__|${FONT_DIR}|g" ${MAP_SCHEMA_HEAD} > ${MAP}
  154. if [ ${#WMS[@]} -gt 0 ]; then
  155. for i in `seq 0 $[${#WMS[@]}-1]`; do
  156. URL=`echo ${WMS[i]} | cut -d '|' -f 1`
  157. LAYER_NAME=`echo ${WMS[i]} | cut -d '|' -f 2`
  158. sed "s|__URL__|${URL}|g;s|__EXTENT__|${EXTENT}|g;s|__LAYER_NAME__|${LAYER_NAME}|g" ${MAP_SCHEMA_WMS} >> ${MAP}
  159. done
  160. fi
  161. for FILE in ${SHAPEPATH}/*.shp; do
  162. TYPE=`ogrinfo ${FILE} | tail -1 | sed 's/[()]/|/g' | cut -d "|" -f 2`
  163. case ${TYPE} in
  164. "Point") TYPE="POINT";;
  165. "Line String") TYPE="LINE";;
  166. "Polygon") TYPE="POLYGON";;
  167. *) error "Unknown layer type \"${TYPE}\" for ${FILE}";;
  168. esac
  169. LAYER_NAME=`echo ${FILE} | rev | cut -d "/" -f 1 | cut -d "." -f 2- | rev`
  170. sed "s|__LAYER_NAME__|${LAYER_NAME}|g" ${MAP_SCHEMA_GML//__TYPE__/${TYPE}} >> ${MAP}
  171. done
  172. cat ${MAP_SCHEMA_TAIL} >> ${MAP}
  173. echo '<?xml version="1.0" encoding="UTF-8"?>' > ${XML_FILE}
  174. echo "<images uuid=\"${UUID}\">" >> ${XML_FILE}
  175. for y in `seq 1 ${ly}`; do
  176. for x in `seq 1 ${lx}`; do
  177. printf "Generating ${x}x${y} "
  178. lxmin=`echo "${xmin} + ${size_cut} * (${x} -1)" | bc -l`
  179. lymin=`echo "${ymin} + ${size_cut} * (${y} -1)" | bc -l`
  180. lxmax=`echo "${lxmin} + ${size}" | bc -l`
  181. lymax=`echo "${lymin} + ${size}" | bc -l`
  182. printf "(BBOX: ${lxmin} ${lymin} ${lxmax} ${lymax})...\n"
  183. file="${IMAGE_FILE}-${y}-${x}.png"
  184. count=0;
  185. for FILE in ${SHAPEPATH}/*.shp; do
  186. count=$[count + `ogrinfo -so -al -spat ${lxmin} ${lymin} ${lxmax} ${lymax} ${FILE} | grep "Feature Count:" | sed 's/.*: //g'`]
  187. done
  188. if [ ${count} -gt 0 ]; then
  189. echo " <image x=\"${x}\" y=\"${y}\">" >> ${XML_FILE}
  190. echo " <xmin>${lxmin}</xmin>" >> ${XML_FILE}
  191. echo " <ymin>${lymin}</ymin>" >> ${XML_FILE}
  192. echo " <xmax>${lxmax}</xmax>" >> ${XML_FILE}
  193. echo " <ymax>${lymax}</ymax>" >> ${XML_FILE}
  194. echo " <file>${file}</file>" >> ${XML_FILE}
  195. echo " </image>" >> ${XML_FILE}
  196. {
  197. retry=0
  198. while [ ${retry} -le ${RETRIES} ]; do
  199. shp2img -m "${MAP}" -o ${file} -e ${lxmin} ${lymin} ${lxmax} ${lymax} 2>>${TMP}/log && break
  200. retry=$[retry+1]
  201. if [ ${retry} -le ${RETRIES} ]; then
  202. echo "Retrying ${x}x${y} (${retry}/${RETRIES})..."
  203. else
  204. echo "Error generating ${x}x${y}, giving up :("
  205. touch ${TMP}/ERROR
  206. fi
  207. done
  208. } &
  209. else
  210. echo " no features found - skipping."
  211. fi
  212. done
  213. done
  214. wait
  215. if [ -a "${TMP}/ERROR" ]; then
  216. echo "===== LOG START ====="
  217. cat ${TMP}/log
  218. echo "======LOG END ======="
  219. rm -rf ${TMP}
  220. error "Error during generating images"
  221. fi
  222. echo '</images>' >> ${XML_FILE}
  223. echo "===== XML (${XML_FILE}) ====="
  224. cat ${XML_FILE}
  225. rm -rf ${TMP}