Skip to content

Instantly share code, notes, and snippets.

@LarsSchy
Created August 23, 2019 08:35
Show Gist options
  • Save LarsSchy/090dd391a4e4107452978a8f8b179ba7 to your computer and use it in GitHub Desktop.
Save LarsSchy/090dd391a4e4107452978a8f8b179ba7 to your computer and use it in GitHub Desktop.
Preprocess road data with extra attributes for road shields plancement
#!/bin/bash
#
# roadsigns_proc_fk.sh
#
# Preprocess road data with extra attributes for road shields plancement
#
# Author: Lars Schylberg, Saab AB
# Date: 2019-06-03
# MIT License
REQ_GDAL_VERSION=2.3.0
CLEAR='\033[0m'
RED='\033[0;31m'
function usage() {
if [ -n "$1" ]; then
echo -e "${RED}---> $1${CLEAR}\n";
fi
echo "Usage: $0 "
echo " -i, --input_file input data file"
echo " -o, --output_file output file"
echo ""
echo "Example: $0 \\"
echo "-i /data/odata/fk/fk_vl_riks.shp \\"
echo "-o /data/odata/fk/fk_vl_riks_rs.shp"
exit 1
}
# parse params
if [[ "$#" = 0 ]]; then usage "No parameters are supplied" ; fi
while [[ "$#" > 0 ]]; do case $1 in
-i|--input_file) INPUT="$2";shift;shift;;
-o|--output_file) OUTPUT="$2";shift;shift;;
*) usage "Unknown parameter passed: $1"; shift; shift;;
esac; done
# verify params
if [ -z "$INPUT" ]; then usage "Input file name is not set."; fi;
if [ -z "$OUTPUT" ]; then usage "Output file name is not set."; fi;
#
# check for needed utilities that should be installed
#
SCRIPTNAME="${0##*/}"
warn() {
printf >&2 "$SCRIPTNAME: $*\n"
}
iscmd() {
command -v >&- "$@"
}
checkdeps() {
local -i not_found
for cmd; do
iscmd "$cmd" || {
warn $"$cmd is not found"
let not_found++
}
done
(( not_found == 0 )) || {
warn $"Install dependencies listed above to use $SCRIPTNAME"
exit 1
}
}
checkdeps shptree
#
# Check gdal version
#
function version {
echo "$@" | \
awk -F. '{ printf("%d%03d%03d%03d\n", $1,$2,$3,$4); }'
}
function version {
echo "$@" | \
awk -F. '{ printf("%d%03d%03d%03d\n", $1,$2,$3,$4); }'
}
if [ $(version $(gdal-config --version)) -ge $(version "${REQ_GDAL_VERSION}") ]; then
if [ "$QUIET" != "1" ]; then echo "GDAL version is up to date" ; fi;
else
echo "GDAL version is $(gdal-config --version)"
echo "GDAL should be updated to at least ${REQ_GDAL_VERSION}"
exit 1
fi
#
# Start timer
#
begin=$(date +"%s")
# check that input directories exist
if [ ! -f ${INPUT} ] ; then
echo "Input file is not found: ${INPUT}"
exit 1
fi
OUTDIR=$(dirname ${OUTPUT})
if [ ! -d ${OUTDIR} ] ; then
echo "Creating directory: ${OUTDIR}"
mkdir -p ${OUTDIR}
fi
### Define the SQL statement
SQL_ROAD_SHIELDS_FK_NOT_NULL="SELECT DETALJTYP, VAGNR1, VAGNR2, VAGNR3,
CAST ( CASE
WHEN VAGNR1 REGEXP '^E.$' OR VAGNR1 REGEXP '^[0-9]$' OR VAGNR1 REGEXP '^[0-9][0-9]$' THEN 'VAGNRBOX'
WHEN VAGNR1 REGEXP '^E..$' OR VAGNR1 REGEXP '^[0-9][0-9][0-9]$' THEN 'VAGNRBOX_3TKN'
WHEN VAGNR1 REGEXP '^E...$' OR VAGNR1 REGEXP '^[0-9][0-9][.][0-9]$' THEN 'VAGNRBOX_4TKN'
WHEN VAGNR1 REGEXP '^E....$' THEN 'VAGNRBOX_4TKN'
END AS character(15)) AS VAGNR1_BOX,
CAST ( CASE
WHEN VAGNR2 REGEXP '^E.$' OR VAGNR2 REGEXP '^[0-9]$' OR VAGNR2 REGEXP '^[0-9][0-9]$' THEN 'VAGNRBOX'
WHEN VAGNR2 REGEXP '^E..$' OR VAGNR2 REGEXP '^[0-9][0-9][0-9]$' THEN 'VAGNRBOX_3TKN'
WHEN VAGNR2 REGEXP '^E...$' OR VAGNR2 REGEXP '^[0-9][0-9]*$' THEN 'VAGNRBOX_4TKN'
WHEN VAGNR2 REGEXP '^E....$' THEN 'VAGNRBOX_4TKN'
END AS character(15)) AS VAGNR2_BOX,
CAST ( CASE
WHEN VAGNR3 REGEXP '^E.$' OR VAGNR3 REGEXP '^[0-9]$' OR VAGNR3 REGEXP '^[0-9][0-9]$' THEN 'VAGNRBOX'
WHEN VAGNR3 REGEXP '^E..$' OR VAGNR3 REGEXP '^[0-9][0-9][0-9]$' THEN 'VAGNRBOX_3TKN'
WHEN VAGNR3 REGEXP '^E...$' OR VAGNR3 REGEXP '^[0-9][0-9]*$' THEN 'VAGNRBOX_4TKN'
WHEN VAGNR3 REGEXP '^E....$' THEN 'VAGNRBOX_4TKN'
END AS character(15)) AS VAGNR3_BOX,
CAST ( CASE
WHEN VAGNR1 REGEXP '^E.*$' THEN '115 179 115'
WHEN VAGNR1 REGEXP '^[0-9]*$' THEN '64 168 217'
END AS character(15)) AS VAGNR1_CLR,
CAST ( CASE
WHEN VAGNR2 REGEXP '^E.*$' THEN '115 179 115'
WHEN VAGNR2 REGEXP '^[0-9]*$' THEN '64 168 217'
END AS character(15)) AS VAGNR2_CLR,
CAST ( CASE
WHEN VAGNR3 REGEXP '^E.*$' THEN '115 179 115'
WHEN VAGNR3 REGEXP '^[0-9]*$' THEN '64 168 217'
END AS character(15)) AS VAGNR3_CLR,
CAST ( CASE
WHEN VAGNR1 REGEXP '^.*$' AND VAGNR2 REGEXP '^.*$' AND VAGNR3 REGEXP '^.*$' THEN '3'
WHEN VAGNR1 REGEXP '^.*$' AND VAGNR2 REGEXP '^.*$' AND VAGNR3 IS NULL THEN '2'
WHEN VAGNR1 REGEXP '^.*$' AND VAGNR2 IS NULL AND VAGNR3 IS NULL THEN '1'
END AS character(2)) AS NUM_SIGNS,
GEOMETRY
FROM fk_vl_riks
WHERE (( DETALJTYP
IN ('VÄGA1.M','VÄGA2.M','VÄGA3.M','VÄGAS.D','VÄGBN.M','VÄGGG.D', 'VÄGGG.M','VÄGMO.D','VÄGA0BY.M'))
AND (VAGNR1 IS NOT NULL))"
DIR=$(dirname $OUTPUT)
BASENAME=$(basename $OUTPUT .shp)
## Process zoom level 13-19
FEATURE=${BASENAME}_13-19
ogr2ogr -f "ESRI Shapefile" \
${DIR}/${FEATURE}.shp \
${INPUT} \
-dialect SQLITE \
-sql "$SQL_ROAD_SHIELDS_FK_NOT_NULL"
# Remove road signs national roads with number larger than 500
ogr2ogr \
${DIR}/${FEATURE}_LT_500.shp \
${DIR}/${FEATURE}.shp \
-dialect SQLITE \
-sql "SELECT DETALJTYP, VAGNR1, VAGNR2, VAGNR3, VAGNR1_BOX, VAGNR2_BOX, \
VAGNR3_BOX, VAGNR1_CLR, VAGNR2_CLR, VAGNR3_CLR, NUM_SIGNS, \
GEOMETRY \
FROM 'fk_vl_riks_rs_13-19' \
WHERE (((VAGNR1 REGEXP '^[0-9]*$') AND ( VAGNR1 <= 499)) OR (VAGNR1 REGEXP '^E.*$' ))"
#-lco ENCODING=UTF-8 \
#--config SHAPE_ENCODING "ISO-8859-1" \
ogrinfo ${DIR}/${FEATURE}_LT_500.dbf -sql "RESIZE ${FEATURE}__LT_500"
ogrinfo ${DIR}/${FEATURE}_LT_500.shp -sql "CREATE INDEX ON ${FEATURE}_LT_500 USING NUM_SIGNS"
shptree ${DIR}/${FEATURE}_LT_500.shp
# Remove intermidiate results
rm ${DIR}/${FEATURE}.*
#######################################################################
#
# Print script execution time:
#
termin=$(date +"%s")
difftimelps=$(($termin-$begin))
echo "Script Execution time: $(($difftimelps / 60)) minutes \
and $(($difftimelps % 60)) seconds."
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment