#!/bin/bash # Convert a huge .png file into smaller chunks for LeafletJS. # # Copyright (C) 2020 Y. Wang # Copyright (C) 2020 Markus Koch # # This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. # You can obtain a copy of the license at https://mozilla.org/MPL/2.0/. TILESIZE=256 MAPFILE="$1" MAPNAME="${1/.png/}" width=`file "$MAPFILE" | sed -n "s/.* \([0-9]\+\) x \([0-9]\+\).*/\1/p"` crop=$TILESIZE zoom=0 # Enabled because my VPS IMFLAGS="-limit area 0" #IMFLAGS="" echo -n "Getting highest zoomlevel... "; while [ $crop -lt $width ]; do crop=$(($crop * 2)); zoom=$(($zoom + 1)); done; echo "$zoom"; echo "Extending map for maptile generation..." extended=$(mktemp) echo " The extended map is temporarily saved to $extended." convert $MAPFILE -extent ${crop}x${crop} png:$extended while [ $zoom -ge 0 ]; do out="$MAPNAME/$zoom" tempfile=$out/temp.png echo "Generating maps for zoomlevel $zoom to $out..." mkdir -p $out; echo " Scaling image..." convert png:$extended -resize ${crop}x${crop} $tempfile echo " Generating tiles..." convert $tempfile -crop ${TILESIZE}x${TILESIZE} +adjoin $out/%d.png rm $tempfile echo " Creating symlinks..." n=$(($crop / $TILESIZE)) for i in $(seq 0 $(($n-1))); do rm -rf $out/$i >/dev/null 2>/dev/null # Nobody cares if this fails ... mkdir $out/$i for j in $(seq 0 $(($n-1))); do ln -s ../$(($j*$n+$i)).png $out/$i/${j}.png done done crop=$(($crop / 2)) zoom=$(($zoom - 1)) done; rm $extended