Install PostGIS and pgRouting
The following will install
pgRouting and its dependencies including
PostgreSQL if not installed:
brew install pgrouting
osm2pgrouting is for importing OSM data into PostgreSQL database, and creating routable topology.
It is said that osm2pgrouting has limitation:
Can’t process “large” files, continents, big countries, or very large states.
For large files, we can use osm2po.
Install via homebrew (Mac)
brew install osm2pgrouting
Note that a mapconfig.xml file is at:
Manually install the lastest version
(The following notes are based on version 2.1. Now with homebrew you can already install the latest version.)
- Download code from repo
CMakeLists.txtto install app to
/usr/local/binand other files to
- line 5 —> set (SHARE_DIR “/usr/local/share/osm2pgrouting”)
- line 36 —> RUNTIME DESTINATION “/usr/local/bin”
- Add the following headers to
src/way.h(otherwise there will be errors)
- Build and install
cmake -H. -Bbuild
Create new database if needed:
For each database that postgis and pgrouting are used, we should install corresponding extensions:
psql routing -c "create extension postgis" psql routing -c "create extension pgrouting"
For test of installation:
psql routing -c "SELECT postgis_full_version()" psql routing -c "SELECT pgr_version()"
Import OpenStreetMap data
OSM map data can be downloaded in many places. We are interested in the OSM XML format.
To import map data to database:
osm2pgrouting --file beijing_china.osm --conf /usr/local/Cellar/osm2pgrouting/[version]/share/osm2pgrouting/mapconfig.xml --dbname routing --username [username] --clean
If you are adding data, do not use flag
We could browse the tables with
psql mydb -c "dt"
Notes for tables
Two main tables:
ways: stores the edges
ways_vertices_pgr: stores the end nodes of edges
reverse_cost_s. According to post here:
lengthis length of the segment in degree units
reverse_costis the length in degree units. (include the negative values for wrong way)
length_mis in meters (there is no cost_m or reverse_cost_m)
reverse_cost_sis in time: seconds units (using the maxspeed value that is in km/hr transforming it to meters/second and using the
Do routings in SQL
Now we can calculate routes with
pgRouting. For example, to calculate one-to-one shortest path:
SELECT * FROM pgr_dijkstra( 'SELECT gid as id, source, target, cost, reverse_cost FROM ways', 100, 200, TRUE
Do routings in Python
I bet that You don’t want to write SQLs. Good news here if you like writing Python! I wrote a
psycopgr Python module to encapsulate database connection (via
pgRouting callings. Here is a tutorial.