The Magic Bus project was started in 2004 as an effort to improve the experience of University bus passengers by enabling them to see where buses are and when they can be expected at bus stops. A student-run project, Magic Bus is a joint effort, funded by the U of M Parking & Transportation Services and implemented by the College of Engineering's Atmospheric, Oceanic, and Space Science Department.
The project was overseen by Professor Chris Ruf of the AOSS and EECS Departments, with technical assistance from AOSS engineering staff. The system itself was designed and implemented primarily by undergraduate engineering students in Electrical Engineering, Computer Engineering, Computer Science and the Undergraduate Research Opportunity Program (UROP) program.
Using the Global Positioning System (GPS), the system is able to display real-time bus location data on a publicly available website with less than four seconds latency. Its key feature for riders is its ability to also display an estimated number of minutes until the next bus will arrive at a given stop, so riders know when to head to the bus stop.
There are several ways to access the data disseminated by Magic Bus. The primary way is this website. For the more technically inclined, we are offering part of the back-end of our system: an XML feeds that contains all of the data displayed on this site. Users can use this data in any way they see fit. Potential applications include Google Homepage Gadgets, Apple Dashboard Widgets and AIMbots.
If you are a University of Michigan student and would like to get involved in the Magic Bus project, or have other technical questions about our system that are not addressed here, we encourage you to e-mail the Magic Bus team at email@example.com. Other inquiries should be directed to the firstname.lastname@example.org at Parking & Transportation Services.
The public XML feed showing the current active routes, bus stops and bus arrival times is located at http://mbus.pts.umich.edu/shared/public_feed.xml. Its format is as follows:
<livefeed> <route> <name>Commuter Northbound</name> <id>1</id> <topofloop>0</topofloop> <stop> <name>Kipke and Greene N</name> <name2>Plant Ops</name2> <name3>None</name3> <latitude>42.26806</latitude> <longitude>-83.7473</longitude> <toa1>1600.19</toa1> <id1>118</id1> <toa2>2910</toa2> <id2>104</id2> <toa3>2580</toa3> <id3>145</id3> <toacount>3</toacount> </stop> <stop> <name>Administrative Services Building N</name> <name2>Admin Services</name2> <name3>None</name3> <latitude>42.26932</latitude> <longitude>-83.74747</longitude> <toa1>1627.79</toa1> <id1>118</id1> <toa2>2937.6</toa2> <id2>104</id2> <toacount>2</toacount> </stop> <stopcount>18</stopcount> </route> <routecount>1</routecount> </livefeed>
The entire feed is enclosed in the <livefeed> tag. Each route is its own child, and each stop is listed within that. Also within each <route> is the <topofloop> node and the <stopcount> node. <topofloop> is the stop in a route's sequence that represents the top of that route's loop, if that route is a loop. For example, the Northwood route goes up to the stop Northwood V 1 before it comes back down. Northwood V 1 is the 19th stop in the Northwood sequence (starting with C.C. Little being 0), so <topofloop>'s node value would be 19. If a route is not a loop, the value is 0. <stopcount> is the total number of stops on a route, and <routecount> is the total number of routes in the feed.
Within each route, each stop is represented by a <stop> node. Each stop has two names: the official, unique name (<name>), and a non-unique but more readily recognizable name (<name2>). Also in each stop are one or more <toa> nodes, which contain the estimated number of seconds until a bus of the current route will arrive at the current stop. They are not necissarily in any sorted order. Finally, the <toacount> node contains the number of <toan>s for that stop.