Finding a Way for Routing

I was working on a small hack involving paths on a OpenStreetMap map, and I found the public, free service provided by Project OSRM to calculate car routes beetwen two points.
But I've been disappointed by the fact the public server was often unavailable due the high rate of incoming requests, so I tried to host a private instance of OSRM on my own VPS.
I've been even more disappointed by the high resources required to run an OSRM instance, even on a small area: on my VPS, sporting 2GB of RAM, I've been unable to even pre-process (with the osrm-prepare utility) a small OSM file fetched from OpenStreetMap database.

In the end I found Routino, a naive but quite functional alternative to OSRM. It is already packaged in Debian Wheezy (on the contrary of OSRM), it is fast enough in execution (probably not such as OSRM, but good for me), and - most important due my constraints - the pre-process of a small OSM file occupies just a few megabytes of RAM and ends within one minute.

I'm hosting a public instance, limited for now to the area of Turin, Italy (the one which interests to me), which can be freely queried with this example code:

var url = 'http://route.madbob.org/router.cgi?transport=motorcar;lat1=' + start['lat] + ';lon1=' + start['lon'] + ';lat2=' + end['lat'] + ';lon2=' + end['lon'] + ';type=shortest';

$.get(url, function(generated) {
	var uuid = generated.substr(0, generated.indexOf("\n"));
	$.get('http://route.madbob.org/results.cgi?uuid=' + uuid + ';type=shortest;format=gpx-track', function(xml) {
		// DO THINGS
	});
});

To host your own instance, just apt-get install routino routino-www. The Debian package provides most of the setup, as usual you will find the configuration in /etc/apache2/conf.d/routino.conf.

To run on top of nginx, you have also to apt-get install fcgiwrap and setup your virtual host as:

server {
	listen   80;

	server_name  route.madbob.org;
	root         /usr/share/routino/www;

	location ~* \.cgi$ {
		gzip           off;
		root           /usr/share/routino/www/;
		fastcgi_pass   unix:/var/run/fcgiwrap.socket;

		fastcgi_param  QUERY_STRING       $query_string;
		fastcgi_param  REQUEST_METHOD     $request_method;
		fastcgi_param  CONTENT_TYPE       $content_type;
		fastcgi_param  CONTENT_LENGTH     $content_length;
		fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
		fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
		fastcgi_param  REQUEST_URI        $request_uri;
		fastcgi_param  DOCUMENT_URI       $document_uri;
		fastcgi_param  DOCUMENT_ROOT      $document_root;
		fastcgi_param  SERVER_PROTOCOL    $server_protocol;
		fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
		fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;
		fastcgi_param  REMOTE_ADDR        $remote_addr;
		fastcgi_param  REMOTE_PORT        $remote_port;
		fastcgi_param  SERVER_ADDR        $server_addr;
		fastcgi_param  SERVER_PORT        $server_port;
		fastcgi_param  SERVER_NAME        $host;

		# This is to permit the whole web to query your service, remove if you
		# don't want that
		add_header     Access-Control-Allow-Origin *;
	}
}

Script to periodically update the data:

#!/bin/sh

# This is the default folder for Routino data, can be configured in
# /usr/share/routino/www/paths.pl
mv /var/lib/routino

# Those are my coordinates, change it accordly your needs
wget "http://overpass-api.de/api/map?bbox=7.4765,44.9553,8.0156,45.1699" -O file.osm

# For some reason, those two tags - appearing of top of XML exported by
# OverPassAPI - are not liked by planetsplitter. Can be remove with no concerns
sed "s/^<meta .*$//g" -i file.osm
sed "s/^<note>.*$//g" -i file.osm

mkdir temp
planetsplitter --dir=temp/ file.osm
rm data/*
mv temp/* data/
rm -rf temp

rm file.osm

Enjoy free maps!