1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
{
callPackage,
stdenv,
makeWrapper,
perl,
perlPackages,
pngquant,
writeShellScript,
writeShellScriptBin,
}:
let
datamaps = callPackage ../datamaps/package.nix { };
parse-gpx = stdenv.mkDerivation {
name = "parse-gpx";
src = ../../../parse-gpx.pl;
dontUnpack = true;
nativeBuildInputs = [ makeWrapper ];
buildInputs = [ perl ];
installPhase = "mkdir -p $out/bin; cp $src $out/bin/parse-gpx; chmod +x $out/bin/parse-gpx;";
postFixup =
let
perlPath = with perlPackages; makePerlPath [ XMLParser ];
in
"wrapProgram $out/bin/parse-gpx --prefix PERL5LIB : '${perlPath}'";
};
makeTile = writeShellScript "makeTile.sh" ''
mkdir -p tiles/$2/$3
echo "rendering $1 $2 $3 $4 $5 $6"
if [ $2 -gt 13 ];
then
${datamaps}/bin/render -g -t0 -L4 -c 'ff8800' -S 'ff8800' $1 $2 $3 $4 | ${pngquant}/bin/pngquant 256 > tiles/$2/$3/$4.png
else
${datamaps}/bin/render -g -t0 -L7 -c 'ff8800' -S 'ff8800' $1 $2 $3 $4 | ${pngquant}/bin/pngquant 256 > tiles/$2/$3/$4.png
fi
'';
in
writeShellScriptBin "generateTilesFromGPX" ''
# strict mode
set -euo pipefail
IFS=$'\n\t'
TMP_DIR=`mktemp -d -t tiles.XXXXXXXXXX`
trap "{ rm -rf "$TMP_DIR"; }" SIGINT SIGTERM ERR EXIT
if [ ! -d "$1" ]; then
echo "$1 does not exist."
exit 1
fi
if [ -z "$(ls -A $1)" ]; then
echo "$1 is empty."
exit 1
fi
if [ ! -d "$2" ]; then
echo "$2 does not exist."
exit 1
fi
if [ ! -z "$(ls -A $2)" ]; then
echo "$2 is not empty."
exit 1
fi
GPX_DIR=`realpath $1`
TILES_DIR=`realpath $2`
cd $TMP_DIR
find $GPX_DIR -name '*.gpx' -print0 | xargs -0 ${parse-gpx}/bin/parse-gpx | ${datamaps}/bin/encode -z16 -m8 -o $TMP_DIR/gpx.dm
${datamaps}/bin/enumerate -s -Z6 -z16 ./gpx.dm | xargs -L1 -P3 ${makeTile}
mv $TMP_DIR/tiles/* $TILES_DIR/
''