Build your own BRouter segments files
Posted on November 10, 2018 in Dev • 5 min read
I recently started to have a deeper look into routing for bikes, on top of
OpenStreetMap data and came across
BRouter. This article is a follow-up to the first
one and will cover how to build your own segments
files and add new tags to be extracted from the OSM data for your profiles.
Building BRouter files
BRouter uses its own data format (.rd5
files), split in tiles of 5 x 5
in latitude and longitude. You can download the official tiles from
brouter.de but you can also build them
yourself from an OSM dump.
OSM dumps are available from planet.osm.org (for the full planet files) or geographical extracts are provided by Geofabrik.
Build the pbfparser
First, there are two file formats available to download OSM data: bzip
-ed
XML files (very large) and .pbf
(Protobuf format) which is much
more efficient. If you want to use the latter one, you will have to build the
pbfparser
(in misc/pbfparser
first):
- Download the latest version of Osmosis and unzip it somewhere.
- Copy the
lib/default/protobuf-java-*.jar
andlib/default/osmosis-osm-binary-*.jar
files from the unzipped Osmosis archive tomisc/pbfparser/protobuf.jar
andmisc/pbfparser/osmosis.jar
. - Build
brouter-server
(as we did in the previous article) and copybrouter-server/target/brouter-server-*-jar-with-dependencies.jar
tomisc/pbfparser/brouter.jar
. - You can build the
pbfparser
using, in themisc/pbfparser/
folder,
javac -d . -cp "brouter.jar:protobuf.jar:osmosis.jar" *.java
- Finally, you can build a
jar
file from these files using
jar cf pbfparser.jar btools/**/*.class
Note: If the jar
file is not properly created, everything else will seem
to work normally but there will not be any data extracted from the OSM data
dump. You can check what is actually inside the built jar
file using jar tf
pbfparser.jar
.
You can now move the files brouter.jar
, protobuf.jar
, pbfparser.jar
and
osmosis.jar
from the misc/pbfparser
folder to the
misc/scripts/mapcreation
folder.
Run the map creation script
You can now run the misc/scripts/mapcreation/process_pbf_planet.sh
script to
build the segments.
Here are a few useful tips before running it:
* Checkout this PR which improves
a lot the script and adds documentation.
* The script should be run from the misc/scripts/mapcreation
folder.
* Have a look at the variables defined at the beginning of the files and
overwrite them according to your needs.
* The script is meant to be used for the BRouter production setup. You likely
want to comment the beginning (downloading of the whole planet file and
removal of the previous segments) and the very least (copy of the
generated segments to the webserver location).
Note: It is possible that you encounter an error complaining about not being
able to run bash^M
. You can fix this one by running sed -i -e 's/\r$//'
process_pbf_planet.sh
.
Beware of the size and requirements to handle the whole planet file, it might be better to start with a regional extract from geofabrik.de.
If you want to have elevation information in the generated segments files, you
should download the required SRTM
files.
Any flavor of the 90m SRTM database should be working, but the one used by the
official BRouter segments files are the ones provided by
CGIAR.
If you are working with rather small geographical extracts, you can download
tiles manually using this
interface (use the
“ArcInfo ASCII” format), instead of having to ask for an access for bulk
download of data. There is no need to unzip the downloaded files, the
process_pbf_planet.sh
script expects a folder with all the ZIP files inside
and will manage it.
Note that if you don’t have the SRTM data available, the segments files will still be generated without any issue (but they will miss the elevation data). If you are not sure which SRTM files you have to download, you can run the script once and it will log all the SRTM files it is looking for. Also note that there will not be any error shown if you miss a SRTM file.
Custom lookups.dat
Now that we know how to build our own segments files for BRouter, we can start
hacking the lookups.dat
file to add new tags that we may need.
A very good introduction to the lookups.dat
file (not really easy to read,
but is full of useful information) is the profile_developers_guide.txt
file. The main points
to keep in mind are:
- There are two context, delimited by a line starting with
--- context:
. Theway
context applies to OSM ways and thenode
context defines tag extraction rules for OSM nodes. - The
lookups.dat
has alookupversion
(major version) and aminorversion
defined at the very beginning. Increasing theminorversion
means the change is retro-compatible, increasing thelookupversion
means it is not. This is important for the BRouter app for Android but if you just play withlookups.dat
andbrouter-server
, this should not matter. - The numbers are an indication of the frequency of this tag in Germany. You can just put any number and don’t care about this.
- You can define aliases in this file by putting multiple tags values on the same line, separated by a space. For instance
busway;0000056005 opposite opposite_lane opposite_track
means it will extract the busway
tag values opposite
, opposite_lane
and
opposite_track
and BRouter will expose all these values as the first value,
busway=opposite
in this case.
- Aliases can actually be used with any name to have a custom alias (even if
it is not a known OSM value). You can use
zone:maxspeed;0000001616 20 DE:20 FR:20
for instance to have a uniform output (zone:maxspeed=20
) for all the zone with speed limitations of20
, no matter the country, even if there was no tagzone:maxspeed=20
within OSM. - The lookup table used by BRouter afterwards is based on the position of the
tag entry in the
lookups.dat
. Then, you should add new tags at the end (of the appropriate context) or replace one of the “dummy” tags that separate the real way tags from the relation pseudo tags, to make it as retro-compatible as possible. (See this post on the forum) - Same when you add a tag value to an alias, you should always put the new value at the end.
Note that once you have built the segments files with your new lookups.dat
file and ask a route from brouter-server
, it might not output all the newly
added tags values (in the JSON output, or in the “Data” tab of brouter-web).
This is due to the fact that BRouter only outputs tags which are actually used
by the profile. You can set assign processUnusedTags = true
in your profile
to output all tags for the considered ways, even if they were not used (see
the dummy
profile
which can be used for this purpose).
The last article of the serie will be about writing your own profiles and writing test cases to assist you in this task.