zaphyra's git: gpx-map

render gpx files to tiles and display them on a map

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/
''