Created
August 23, 2019 08:35
-
-
Save LarsSchy/090dd391a4e4107452978a8f8b179ba7 to your computer and use it in GitHub Desktop.
Preprocess road data with extra attributes for road shields plancement
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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