genpng2.sh 8.2 KB

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