Project

map-tube

0.0
No commit activity in last 3 years
No release in over 3 years
The core module to process the map data. It provides the the interface to find the shortest route in terms of stoppage between two nodes.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

~> 1.11
~> 0.10.3
~> 10.0
~> 3.0

Runtime

 Project Readme

Map::Tube

Build Status Gem Version

The core module to process the map data. It provides the interface to find the shortest route in terms of stoppage between two nodes.

Installation

Add this line to your application's Gemfile:

gem 'map-tube'

And then execute:

$ bundle

Or install it yourself as:

$ gem install map-tube

Usage

Load maps and read them

require 'map/tube'

# Load from available cities
bucharest = Map::Tube.new("Bucharest").read
london = Map::Tube.new("London").read

# Or load your xml
mycity = Map::Tube.new_from_xml("My City", "path/to/xml").read

Line/Station names

bucharest.lines.map(&:name) # => ["Linia M1", "Linia M2", "Linia M3", "Linia M4"]
bucharest.stations.map(&:name)

Get the shortest path between two stations

route = london.get_shortest_route("Paddington", "Monument")
=> #<Map::Tube::Route:0x007fd81986b160
 @arrival_station=#<Map::Tube::Station:0x007fd819168430 @id="M009", @line="Circle,District", @links=#<Set: {"T009", "C008", "B003"}>, @name="Monument">,
 @departure_station=#<Map::Tube::Station:0x007fd818b953a0 @id="P001", @line="District,Circle,Hammersmith & City,Bakerloo", @links=#<Set: {"B008", "W007", "E011", "R010"}>, @name="Paddington">,
 @intermediate_stations=
  [#<Map::Tube::Station:0x007fd8191ba230 @id="E011", @line="Circle,District,Hammersmith & City,Bakerloo", @links=#<Set: {"P001", "M005", "B001"}>, @name="Edgware Road">,
   #<Map::Tube::Station:0x007fd818c3c8f8
    @id="B001",
    @line="Circle,Hammersmith & City,Bakerloo,Metropolitan,Jubilee",
    @links=#<Set: {"B018", "R004", "M005", "G008", "S023", "E011", "F004"}>,
    @name="Baker Street">,
   #<Map::Tube::Station:0x007fd818c1eb50 @id="B018", @line="Central,Jubilee", @links=#<Set: {"G009", "B001", "O005", "M004"}>, @name="Bond Street">,
   #<Map::Tube::Station:0x007fd818bdf3d8 @id="G009", @line="Victoria,Jubilee,Piccadilly", @links=#<Set: {"V002", "O005", "B018", "W027", "H036", "P006"}>, @name="Green Park">,
   #<Map::Tube::Station:0x007fd818af7bf0 @id="W027", @line="Circle,District,Jubilee", @links=#<Set: {"S022", "G009", "W008", "E015"}>, @name="Westminster">,
   #<Map::Tube::Station:0x007fd8191486f8 @id="W008", @line="Northern,Bakerloo,Jubilee,Waterloo & City", @links=#<Set: {"E015", "L002", "W027", "S021", "B003", "K001"}>, @name="Waterloo">,
   #<Map::Tube::Station:0x007fd818c37b28 @id="B003", @line="Central,DLR,Northern,Waterloo & City", @links=#<Set: {"S002", "S024", "L013", "M011", "L012", "W008", "M009"}>, @name="Bank">]>

route.pretty
# => "Paddington -> Edgware Road -> Baker Street -> Bond Street -> Green Park -> Westminster -> Waterloo -> Bank -> Monument"
route = bucharest.get_shortest_route("Dristor 1", "Pipera")

# => #<Map::Tube::Route:0x007f9769c5a550
 @arrival_station=#<Map::Tube::Station:0x007f976a08e310 @id="M2-01", @line="M2", @links=#<Set: {"M2-02"}>, @name="Pipera">,
 @departure_station=#<Map::Tube::Station:0x007f976a08fa30 @id="M1-17", @line="M1", @links=#<Set: {"M1-16", "M1-18", "M3-11"}>, @name="Dristor 1">,
 @intermediate_stations=
  [#<Map::Tube::Station:0x007f976a08ff58 @id="M1-16", @line="M1", @links=#<Set: {"M1-15", "M1-17", "M3-10"}>, @name="Mihai Bravu">,
   #<Map::Tube::Station:0x007f97698261f0 @id="M1-15", @line="M1", @links=#<Set: {"M1-14", "M1-16", "M3-09"}>, @name="Timpuri Noi">,
   #<Map::Tube::Station:0x007f976982c208 @id="M1-14", @line="M1", @links=#<Set: {"M1-13", "M1-15", "M3-08", "M2-07"}>, @name="Piața Unirii 1">,
   #<Map::Tube::Station:0x007f976a08cdd0 @id="M2-07", @line="M2", @links=#<Set: {"M2-06", "M2-08", "M3-08"}>, @name="Piața Unirii 2">,
   #<Map::Tube::Station:0x007f976a08d118 @id="M2-06", @line="M2", @links=#<Set: {"M2-05", "M2-07"}>, @name="Universitate">,
   #<Map::Tube::Station:0x007f976a08d460 @id="M2-05", @line="M2", @links=#<Set: {"M2-04", "M2-06"}>, @name="Piața Romană">,
   #<Map::Tube::Station:0x007f976a08d988 @id="M2-04", @line="M2", @links=#<Set: {"M2-03", "M2-05", "M1-06"}>, @name="Piața Victoriei">,
   #<Map::Tube::Station:0x007f976a08dcd0 @id="M2-03", @line="M2", @links=#<Set: {"M2-02", "M2-04"}>, @name="Aviatorilor">,
   #<Map::Tube::Station:0x007f976a08e018 @id="M2-02", @line="M2", @links=#<Set: {"M2-01", "M2-03"}>, @name="Aurel Vlaicu">]>

route.pretty
# => "Dristor 1 -> Mihai Bravu -> Timpuri Noi -> Piața Unirii 1 -> Piața Unirii 2 -> Universitate -> Piața Romană -> Piața Victoriei -> Aviatorilor -> Aurel Vlaicu -> Pipera"

Generate images

bucharest = Map::Tube.new("Bucharest").read;
bucharest.graphviz.generate.output(png: "bucharest.png")

Bucharest

Documentation

Map::Tube

  • .new(city_name) -> Map::Tube::Loader
  • .new_from_xml(city_name, path_to_xml) -> Map::Tube::Loader

Map::Tube::Loader

  • .new(city_name, map_path=nil)
    • (mandatory) city_name - String - It should match a city in data/ dir
    • (optional) map_path - String - Path to local xml
  • #city
  • #map_path
  • #read -> Map::Tube::Graph

Map::Tube::Graph

  • #stations -> Array [ Map::Tube::Station ]
  • #lines -> Array [ Map::Tube::Line ]
  • #get_shortest_route(from_station_name, to_station_name) -> Map::Tube::Route
    • from_station_name - String - Name of departure station
    • to_station_name - String - Name of arrival station
  • #get_station_by_id(station_id) -> Map::Tube::Station
    • station_id - String - Unique identifier of the station
  • #get_station_by_name(station_name) -> Map::Tube::Station
    • station_name - String - Name of the station
  • #get_line_by_id(line_id) -> Map::Tube::Line
    • line_id - String - Unique identifier of the line
  • #get_line_by_name(line_name) -> Map::Tube::Line
    • line_name - String - Name of the line
  • #add_line(line) -> Map::Tube::Graph
    • line - Map::Tube::Line object
  • #add_station(station) -> Map::Tube::Graph
    • station - Map::Tube::Station object
  • #to_h -> Hash
  • #graphviz ->Map::Tube::Graphviz

Map::Tube::Line

  • .new(id, name, color)
    • id - String - unique identifier of the Line
    • name - String - name of the line
    • color - String - color of the line
  • #id
  • #name
  • #color

Map::Tube::Station

  • .new(id, name, line)
    • id - String - unique identifier of the Station
    • name - String - name of the Station
    • line - String - line that supports the Station
  • #id
  • #name
  • #line
  • #links -> Set { String }
  • #add_link(link)
    • link - String - unique identifier of the station

Map::Tube::Route

  • .new(departure_station, arrival_station)
    • departure_station - Map::Tube::Station
    • arrival_station - Map::Tube::Station
  • #departure_station -> Map::Tube::Station
  • #arrival_station -> Map::Tube::Station
  • #intermediate_stations -> Array [ Map::Tube::Station ]
  • #pretty -> String

Map::Tube::Parser

  • .new(file_handle)
    • file_handle - File.open(path)
      • path - String - path to xml
  • #parse -> Map::Tube::Graph

Map::Tube::Graphviz

  • .new(graph)
    • graph - Map::Tube::Graph
  • #generate -> GraphViz

Map::Tube::Exceptions

  • StationException
  • LineException
  • RouteException
  • CityException

Contributing

Bug reports and pull requests are welcome on GitHub at radubogdan/map-tube.

License

The gem is available as open source under the terms of the MIT License.

Thanks