Skip to content

Instantly share code, notes, and snippets.

@lonvia
Created May 8, 2014 15:24
Show Gist options
  • Save lonvia/f24516f8672a0fad2740 to your computer and use it in GitHub Desktop.
Save lonvia/f24516f8672a0fad2740 to your computer and use it in GitHub Desktop.
Creating regional OSM .osc diffs
#!/bin/bash
cd /tmp
SCRIPTDIR=/etc/planet/hourly.d
BASEDIR=/srv/planet.osm.ch
DATADIR=$BASEDIR/data
WWWDIR=$BASEDIR/site
LOCKFILE=$DATADIR/chextract.lock
BBOX="5,45.3,11.3,48.3"
CHPOLY=$WWWDIR/switzerland-padded.poly
CHOUTPBF=$WWWDIR/switzerland-padded.osm.pbf
OLDBOXEXTRACT=$DATADIR/chbbox_old.o5m
NEWBOXEXTRACT=$DATADIR/chbbox.o5m
OLDCHEXTRACT=$DATADIR/switzerland_old.o5m
NEWCHEXTRACT=$DATADIR/switzerland.o5m
NEWDIFF=$DATADIR/chdiff.osc
HOURLYDIR=$WWWDIR/replication/hour
STATEFILE=$DATADIR/state.txt
# derived values
TEMPBOXEXTRACT=$(dirname $NEWBOXEXTRACT)/inprogress_$(basename $NEWBOXEXTRACT)
TEMPCHEXTRACT=$(dirname $NEWCHEXTRACT)/inprogress_$(basename $NEWCHEXTRACT)
CHPBF=${NEWCHEXTRACT%.o5m}.pbf
SEQUENCENUMBER=$(awk 'BEGIN{FS="="} /sequenceNumber/{print $2}' $HOURLYDIR/state.txt)
((SEQUENCENUMBER += 1))
((LEVEL_ONE_DIR = SEQUENCENUMBER / 1000000))
((LEVEL_TWO_DIR = (SEQUENCENUMBER / 1000) % 1000))
((LEVEL_THREE_FILE = SEQUENCENUMBER % 1000 ))
LEVEL_ONE_DIR=$(printf "%03d" $LEVEL_ONE_DIR)
LEVEL_TWO_DIR=$(printf "%03d" $LEVEL_TWO_DIR)
LEVEL_THREE_FILE=$(printf "%03d" $LEVEL_THREE_FILE)
OSCPATH=$HOURLYDIR/$LEVEL_ONE_DIR/$LEVEL_TWO_DIR/$LEVEL_THREE_FILE
lockfile-create $LOCKFILE
# lockfile create waits for some time and retries to create the lock file a few times.
# If it gives up, we need to exit now.
if [ $? -ne 0 ]; then exit 1; fi
lockfile-touch $LOCKFILE &
LOCKPID="$!"
# echo "lock down, starting update of ch extract"
function exit_on_failure
{
if [ $? -ne 0 ]
then
kill "${LOCKPID}"
lockfile-remove $LOCKFILE
exit 1
fi
}
# update to current osm state
osmupdate $NEWBOXEXTRACT $TEMPBOXEXTRACT --minutely -t=$BASEDIR/osmupdate_temp/temp -b=$BBOX
exit_on_failure
# move files
mv $OLDBOXEXTRACT $OLDBOXEXTRACT.bak
mv $NEWBOXEXTRACT $OLDBOXEXTRACT
mv $TEMPBOXEXTRACT $NEWBOXEXTRACT
# derive new swiss extract
osmconvert $NEWBOXEXTRACT -o=$TEMPCHEXTRACT -B=$CHPOLY
exit_on_failure
osmconvert $TEMPCHEXTRACT -o=$CHPBF
exit_on_failure
chmod 644 $CHPBF
# derive change file
osmconvert $NEWCHEXTRACT $TEMPCHEXTRACT --diff --fake-lonlat --emulate-osmosis -o=$NEWDIFF
exit_on_failure
# create state file
date --utc > $STATEFILE
echo sequenceNumber=$SEQUENCENUMBER >> $STATEFILE
echo timestamp=$(osmconvert $TEMPCHEXTRACT --out-timestamp) >> $STATEFILE
# move files
mv $OLDCHEXTRACT $OLDCHEXTRACT.bak
mv $NEWCHEXTRACT $OLDCHEXTRACT
mv $TEMPCHEXTRACT $NEWCHEXTRACT
mv $CHPBF $CHOUTPBF
mkdir -p $(dirname $OSCPATH)
cp $STATEFILE $OSCPATH.state.txt
gzip $NEWDIFF
mv $NEWDIFF.gz $OSCPATH.osc.gz
chmod +r $OSCPATH.osc.gz
mv $STATEFILE $HOURLYDIR/state.txt
# echo "release lock, update finished"
kill "${LOCKPID}"
lockfile-remove $LOCKFILE
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment