Map::Metro::Plugin::Map - How to make your own map


Version 0.2405, released 2016-07-23.


    # This is a modified part of the map from Map::Metro::Plugin::Map::Stockholm


    # comments are possible
    Gamla stan
    Sergels torg

    T-Centralen|Sergels torg|weight:4

    10|T10|Blue line
    11|T11|Blue line
    19|T19|Green line|color:#79c142
    7|L7|Spårväg city

    10->,11<-|Stadshagen|Fridhemsplan % Västermalmsgallerian
    10,11|Fridhemsplan|Rådhuset % :Radhuset
    19|T-Centralen|Gamla stan
    19|Gamla stan|Slussen
    7|Sergels torg|Nybroplan


It is straightforward to create a map file. It consists of four parts:


This is a list of all stations in the network. Currently only one value per line. Don't use | in station names.


This is a list of Transfers. If two stations share at least one line they are not transfers. Three groups of data per line (delimited by |):

The first station.
The following station.
Optional options.

The options in turn is a comma separated list of colon separated key-value pairs. Currently the only supported option is:

weight. Integer. Set a custom weight for the 'cost' of making this transfer. Default value is 5. (Travelling between two stations on the same line cost 1, and changing lines at a station costs 3).


This is a list of all lines in the network. Three values per line (delimited by |):

* Line id (only a-z, A-Z and 0-9 allowed). Used in segments.

* Line name. This should preferably be short(ish) and a common name for the line.

* Line description. This can be a longer common name for the line.

* Optional options, a comma separated list of colon separated key-value pairs:

    * color. Hexadecimal, preceeded by '#'. Can be used by visualization tools to give lines their regular colours.

    * width. Integer. Can be used by visualization tools to give lines different widths, for example differentiate different types of transport.


This is a list of all Segments in the network. (A segment is a pair of consecutive stations.) Three groups of data per line (delimited by |):

* A list of line ids (comma delimited). This references the line list above. The list of line ids represents all lines travelling between the two stations.

* The first station.

* The following station

In the synopsis, segments part starts like this:

    10->,11<-|Stadshagen|Fridhemsplan % Västermalmsgallerian
    10,11|Fridhemsplan|Rådhuset % :Radhuset

First, the arrow notation describes the direction of travel (the default is both ways, all three can be combined in one segment definition).

-> means that the line only travels from Stadshagen to Fridhemsplan.

<- means that the line only travels from Fridhemsplan to Stadshagen.

Second, the % notation makes it possible to attach more names to the station.

If the name begins with a : it is considered a search name. This mean that it is possible to search, but it is generally not displayed (eg. by the PrettyPrinter hook).

If the name doesn't begin with a : it is considered an alternative name. The PrettyPrinter hook displays them as "first given name/alternative name".

When to use what?

Alternative names are used when the same station is known as both names. This is not very common.

Search names is mostly useful when a station has changed names (keep the old name as a search name)

Overriding station names through a hook (as Map::Metro::Plugin::Hook::Helsinki::Swedish does) can be a good way to present translations or transliterations of station names.

Just make sure that no names collide.


Start a distribution called Map::Metro::Plugin::Map::$city.

With Dist::Zilla

The easiest way to do that is to use Dist::Zilla with Dist::Zilla::MintingProfile::MapMetro::Map. See also Task::MapMetro::Dev.

    $ dzil new -P MapMetro::Map  Map::Metro::Plugin::Map::TheCity

Without Dist::Zilla

Save the map file as map-$city.metro in the share directory.

Say we make a map for London; then Map::Metro::Plugin::Map::London would look like this:

    use strict;

    package Map::Metro::Plugin::Map::London;

    our $VERSION = 0.01;

    use Moose;
    with 'Map::Metro::Plugin::Map';

    has '+mapfile' => (
        default => 'map-london.metro',
    sub map_version {
        return $VERSION;
    sub map_package {
        return __PACKAGE__;



By default, station names with diacritics get their un-diacritic form added as a search name. If this causes problems with a map file, add this to the module definition and it is turned off:

    has '+do_undiacritic' => (
        default => 0,




Erik Carlsson <>


This software is copyright (c) 2016 by Erik Carlsson.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.