genpng2.sh 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  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. TMP=`mktemp -d`
  112. SHAPEPATH="${TMP}/2177"
  113. #size=`echo "${SIZE}/${DPI}*2.54*${SCALE}/100" | bc -l`
  114. #size_cut=`echo "${size} - ${BORDER_CUT}" | bc -l`
  115. #correction_tmp=`echo "12 - l(${SCALE}) / l(2)" | bc -l`
  116. #correction_tmp=`echo "10 ^ (${correction_tmp} / 1)" | bc`
  117. #correction=`echo "1 / ${correction_tmp}" | bc -l`
  118. #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`
  119. correction=`echo "e(-(6+l(142/${SCALE})/l(2)-0.3)*l(8))" | bc -l`
  120. #correction=0
  121. size=`echo "${SIZE}/${DPI}*2.54*(${SCALE})/100 - ${correction}" | bc -l`
  122. size_cut=`echo "${size} - ${BORDER_CUT}" | bc -l`
  123. correction=0
  124. for i in `seq 0 $[${#FILES[@]}-1]`; do
  125. FILE=${FILES[i]}
  126. if [ ! -e ${FILE} ]; then
  127. error "File ${FILE} not found."
  128. fi
  129. ogr2ogr -t_srs EPSG:2177 ${SHAPEPATH} ${FILE} 2>/dev/null
  130. done
  131. for FILE in ${SHAPEPATH}/*.shp; do
  132. xmin=0
  133. extent=(`ogrinfo -al -so ${FILE} | grep Extent | sed 's/[()]/|/g;s/, /|/g' | awk -F '|' '{print $2,$3,$5,$6}'`)
  134. if [ ${xmin} -eq 0 ]; then
  135. xmin=${extent[0]}
  136. ymin=${extent[1]}
  137. xmax=${extent[2]}
  138. ymax=${extent[3]}
  139. else
  140. if [ `echo "${extent[0]} < ${xmin}" | bc` -eq 1 ]; then
  141. xmin=${extent[0]}
  142. fi
  143. if [ `echo "${extent[1]} < ${ymin}" | bc` -eq 1 ]; then
  144. ymin=${extent[1]}
  145. fi
  146. if [ `echo "${extent[2]} > ${xmax}" | bc` -eq 1 ]; then
  147. xmax=${extent[2]}
  148. fi
  149. if [ `echo "${extent[3]} > ${ymax}" | bc` -eq 1 ]; then
  150. ymax=${extent[3]}
  151. fi
  152. fi
  153. done
  154. echo "Project extent: ${xmin} ${ymin} ${xmax} ${ymax}"
  155. xmin=`echo "${xmin} - 5" | bc -l`
  156. ymin=`echo "${ymin} - 5" | bc -l`
  157. xmax=`echo "${xmax} + 5" | bc -l`
  158. ymax=`echo "${ymax} + 5" | bc -l`
  159. echo "New extent after 5m border added: ${xmin} ${ymin} ${xmax} ${ymax}"
  160. lx=`echo "(${xmax} - ${xmin} - ${BORDER_CUT}) / ${size_cut} + ((${xmax} - ${xmin} - ${BORDER_CUT}) % ${size_cut} > 0)" | bc`
  161. ly=`echo "(${ymax} - ${ymin} - ${BORDER_CUT}) / ${size_cut} + ((${ymax} - ${ymin} - ${BORDER_CUT}) % ${size_cut} > 0)" | bc`
  162. echo "Images count (width x height): ${lx}x${ly}"
  163. xmin=`echo "${xmin} - (${lx} * ${size_cut} + ${BORDER_CUT} - (${xmax} - ${xmin})) / 2" | bc -l`
  164. ymin=`echo "${ymin} - (${ly} * ${size_cut} + ${BORDER_CUT} - (${ymax} - ${ymin})) / 2" | bc -l`
  165. xmax=`echo "${xmin} + ${lx} * ${size_cut} + ${BORDER_CUT}" | bc -l`
  166. ymax=`echo "${ymin} + ${ly} * ${size_cut} + ${BORDER_CUT}" | bc -l`
  167. echo "New extent after centering project features: ${xmin} ${ymin} ${xmax} ${ymax}"
  168. MAP="${TMP}/map.map"
  169. EXTENT="${xmin} ${ymin} ${xmax} ${ymax}"
  170. sed "s|__SHAPEPATH__|${SHAPEPATH}|g;s/__EXTENT__/${EXTENT}/g;s|__FONT_DIR__|${FONT_DIR}|g" ${MAP_SCHEMA_HEAD} > ${MAP}
  171. if [ ${#WMS[@]} -gt 0 ]; then
  172. for i in `seq 0 $[${#WMS[@]}-1]`; do
  173. URL=`echo ${WMS[i]} | cut -d '|' -f 1`
  174. LAYER_NAME=`echo ${WMS[i]} | cut -d '|' -f 2`
  175. sed "s|__URL__|${URL}|g;s|__EXTENT__|${EXTENT}|g;s|__LAYER_NAME__|${LAYER_NAME}|g" ${MAP_SCHEMA_WMS} >> ${MAP}
  176. done
  177. fi
  178. for FILE in ${SHAPEPATH}/*.shp; do
  179. TYPE=`ogrinfo ${FILE} | tail -1 | sed 's/[()]/|/g' | cut -d "|" -f 2`
  180. case ${TYPE} in
  181. "Point") TYPE="POINT";;
  182. "Line String") TYPE="LINE";;
  183. "Polygon") TYPE="POLYGON";;
  184. *) error "Unknown layer type \"${TYPE}\" for ${FILE}";;
  185. esac
  186. LAYER_NAME=`echo ${FILE} | rev | cut -d "/" -f 1 | cut -d "." -f 2- | rev`
  187. sed "s|__LAYER_NAME__|${LAYER_NAME}|g" ${MAP_SCHEMA_GML//__TYPE__/${TYPE}} >> ${MAP}
  188. done
  189. cat ${MAP_SCHEMA_TAIL} >> ${MAP}
  190. echo '<?xml version="1.0" encoding="UTF-8"?>' > ${XML_FILE}
  191. echo "<images uuid=\"${UUID}\">" >> ${XML_FILE}
  192. for y in `seq 1 ${ly}`; do
  193. for x in `seq 1 ${lx}`; do
  194. jobs=`jobs -p | wc -l`
  195. while [ ${jobs} -ge ${PROCESSES} ]; do
  196. sleep 1
  197. jobs=`jobs -p | wc -l`
  198. done
  199. printf "Generating ${x}x${y} "
  200. lxmin=`echo "${xmin} + ${size_cut} * (${x} -1) + ${correction}" | bc -l`
  201. lymin=`echo "${ymin} + ${size_cut} * (${y} -1) + ${correction}" | bc -l`
  202. lxmax=`echo "${lxmin} + ${size} - 2 * ${correction}" | bc -l`
  203. lymax=`echo "${lymin} + ${size} - 2 * ${correction}" | bc -l`
  204. printf "(BBOX: ${lxmin} ${lymin} ${lxmax} ${lymax})...\n"
  205. file="${IMAGE_FILE}-${y}-${x}.png"
  206. count=0;
  207. for FILE in ${SHAPEPATH}/*.shp; do
  208. count=$[count + `ogrinfo -so -al -spat ${lxmin} ${lymin} ${lxmax} ${lymax} ${FILE} | grep "Feature Count:" | sed 's/.*: //g'`]
  209. done
  210. if [ ${count} -gt 0 ]; then
  211. echo " <image x=\"${x}\" y=\"${y}\">" >> ${XML_FILE}
  212. echo " <xmin>${lxmin}</xmin>" >> ${XML_FILE}
  213. echo " <ymin>${lymin}</ymin>" >> ${XML_FILE}
  214. echo " <xmax>${lxmax}</xmax>" >> ${XML_FILE}
  215. echo " <ymax>${lymax}</ymax>" >> ${XML_FILE}
  216. echo " <file>${file}</file>" >> ${XML_FILE}
  217. echo " </image>" >> ${XML_FILE}
  218. echo "\tshp2img -m \"${MAP}\" -o ${file} -e ${lxmin} ${lymin} ${lxmax} ${lymax}"
  219. {
  220. retry=0
  221. while [ ${retry} -le ${RETRIES} ]; do
  222. shp2img -m "${MAP}" -o ${file} -e ${lxmin} ${lymin} ${lxmax} ${lymax} 2>>${TMP}/log && break
  223. retry=$[retry+1]
  224. if [ ${retry} -le ${RETRIES} ]; then
  225. echo "Retrying ${x}x${y} (${retry}/${RETRIES})..."
  226. else
  227. echo "Error generating ${x}x${y}, giving up :("
  228. touch ${TMP}/ERROR
  229. fi
  230. done
  231. } &
  232. else
  233. echo " no features found - skipping."
  234. fi
  235. done
  236. done
  237. wait
  238. if [ -a "${TMP}/ERROR" ]; then
  239. echo "===== LOG START ====="
  240. cat ${TMP}/log
  241. echo "======LOG END ======="
  242. rm -rf ${TMP}
  243. error "Error during generating images"
  244. fi
  245. echo '</images>' >> ${XML_FILE}
  246. echo "===== XML (${XML_FILE}) ====="
  247. cat ${XML_FILE}
  248. rm -rf ${TMP}