be-graphes-map-generator/generate.sh

256 lines
6.4 KiB
Bash
Executable File

#!/bin/bash
DEFAULT_OUTPUT_FOLDER=outputs
DEFAULT_WRITER=insa2018
if [ -z "${DEFAULT_THREADS}" ]; then
DEFAULT_THREADS=2
fi
if [ -z "${DEFAULT_MEMORY_MODE}" ]; then
DEFAULT_MEMORY_MODE=hd
fi
bounding_box=
bounding_poly=
map_id=
map_name=
debug=false
graph_only=false
mapsforge_only=false
input_file=
output_file=
# FUNCTION help_short()
#
# Print short usage information.
function help_short() {
echo "Usage: $0 [-h|--help] [-d|--debug] [-i|--id MAP_ID] [-n|--name MAP_NAME] [-b|--bounding-box FILE|BBOX] [-g|--graph-only] [-f|--mapsforge-only] [-p|--bounding-polygon FILE] [-o|--output OUTPUT_NAME] INPUT_FILE"
}
# FUNCTION help_long()
#
# Print detailed usage information.
function help_long() {
help_short
printf "\t-d,--debug\tEnable debug mode.\n"
printf "\t-i,--id\tMap ID.\n"
printf "\t-n,--name\tMap name.\n"
printf "\t--graph-only\tDo not generate Mapsforge file.\n"
printf "\t--mapsforge-only\tDo not generate graph file.\n"
printf "\t-b,--bounding-box\tSpecify a bounding-box, either via a string or a file.\n"
printf "\t-p,--bounding-polygon\tSpecify a bounding-polygon, only used for OSM2Graph.\n"
printf "\t-h,--help\tPrint this help.\n"
}
# FUNCTION error(...)
#
# Print error composed of arguments, then exit.
function error() {
echo "ERROR: $0: $*" >> /dev/stderr
exit 1
}
# FUNCTION error_and_usage(...)
#
# Print error composed of arguments, followed by help, then exit.
function error_and_usage() {
echo "ERROR: $0: $*" >> /dev/stderr
help_short
exit 1
}
# FUNCTION warning(...)
#
# Print warning / information composed of arguments.
function warning() {
echo "WARNING: $0: $*" >> /dev/stderr
}
# FUNCTION warning(...)
#
# Print information composed of arguments.
function info() {
echo "INFO: $0: $*" >> /dev/stderr
}
# FUNCTION run(...)
#
# Execute given command if debug mode is disabled, otherwize
# print it to stderr.
function run() {
$debug && warning $*
$debug || $*
}
# FUNCTION check_input_file()
#
# Check if input file exists and has read access.
function check_input_file() {
if [ -z "${input_file}" ]; then
error_and_usage "Missing input file."
fi
if [ ! -e "${input_file}" ]; then
error "${input_file} does not exist."
fi
if [ ! -e "${input_file}" ]; then
error "${input_file} does not exist."
fi
if [ ! -r "${input_file}" ]; then
error "${input_file} is not readable."
fi
}
# FUNCTION check_output_file()
#
# Check output file.
function check_output_file() {
if [ -z "${output_file}" ]; then
output_file=${DEFAULT_OUTPUT_FOLDER}/$(basename -s .pbf ${input_file})
info "No output file specific, switching to ${output_file}."
fi
}
# Loop for command line arguments, see:
# http://stackoverflow.com/a/14203146/2666289
while [ ! -z "$1" ]
do
key="$1"
case $key in
-b|--bounding-box)
bounding_box="$2"
shift
;;
-p|--bounding-polygon)
bounding_poly="$2"
shift
;;
-f|--mapsforge-only)
mapsforge_only=true
;;
-g|--graph-only)
graph_only=true
;;
-i|--id)
map_id="$2"
shift
;;
-n|--name)
map_name="$2"
shift
;;
-d|--debug)
debug=true
;;
-o|--output)
output_file="$2"
shift
;;
-h|--help)
help_long
exit 0
;;
*)
input_file="$key"
;;
esac
shift # past argument or value
done
check_input_file
check_output_file
if [ ! $mapsforge_only ] && [ -z "${map_id}" ]; then
error_and_usage "No map ID specified."
fi
if [ ! $mapsforge_only ] && [ -z "${map_name}" ]; then
error_and_usage "No map name specified."
fi
if [ ! -z "${bounding_box}" ] && [ -e "${bounding_box}" ]; then
bounding_box=$(cat ${bounding_box})
fi
if [ -z "${bounding_box}" ] && echo ${input_file} | grep "merge"; then
error_and_usage "Using a merged file (_merge) without bounding box is not possible."
fi
mkdir -p $(dirname ${output_file})
# Uncomment this or set the variable before starting the script if
# you want to generate file for huge map (change 26g to whatever is
# relevant for your system)
# export JAVACMD_OPTIONS="-Xms26g -Xmx26g"
if ${graph_only}; then
info "Skipping mapsforge generation... "
else
CMD_MF="bin/osmosis --rb ${input_file} --lp --mapfile-writer file=${output_file}.mapfg type=${DEFAULT_MEMORY_MODE} threads=${DEFAULT_THREADS}"
if [ ! -z "${bounding_box}" ]; then
CMD_MF="${CMD_MF} bbox=${bounding_box}"
fi
echo ${CMD_MF}
${CMD_MF}
fi
if ${mapsforge_only}; then
info "Skipping graph generation... "
else
# Merge file as input...
if echo ${input_file} | grep "merge"; then
# Try to find the originl (.osm.pbf)...
input_file=$(echo ${input_file} | sed 's/_merge.pbf/.osm.pbf/')
# ...or a generated .pbf...
if [ ! -e ${input_file} ]; then
input_file=$(echo ${input_file} | sed 's/.osm//')
fi
# If nothing is found, warn the user...
if [ ! -e ${input_file} ]; then
warning "Merge file specified but the original file was not found, the graph file may not be generated correctly from the merged file."
else
info "Merge file detected, original file was found: ${input_file}."
fi
fi
CMD_GR="bin/osmosis --rb ${input_file} --lp"
if [ ! -z "${bounding_poly}" ]; then
CMD_GR="${CMD_GR} --bounding-polygon file=${bounding_poly} completeWays=yes --lp"
else
if [ ! -z "${bounding_box}" ]; then
osmbbox=$(echo ${bounding_box} | \
tr "," " " | \
xargs printf "bottom=%f left=%f top=%f right=%f")
CMD_GR="${CMD_GR} --bounding-box ${osmbbox} completeWays=yes --lp"
fi
fi
CMD_GR="${CMD_GR} --tf reject-relations --lp"
CMD_GR="${CMD_GR} --tf accept-ways highway=$(cat plugins/OSM2Graph/resources/highway-filter.cmd) natural=coastline junction=roundabout --lp"
CMD_GR="${CMD_GR} --used-node --lp --osm2graph writer=${DEFAULT_WRITER} file=${output_file}.mapgr threads=${DEFAULT_THREADS}"
echo ${CMD_GR} id="${map_id}" name="${map_name}"
${CMD_GR} id="${map_id}" name="${map_name}"
fi