Extension:Kartographer
The Kartographer extension lets you display maps (based around OpenStreetMap) in wiki pages. It was specifically designed in order to run on Wikimedia sites such as Wikivoyage and Wikipedia, although it can be used on any wiki.
Note: the tile server used by default by the Wikimedia Foundation is not available to 3rd parties. Please use your own tileserver.
Usage
Kartographer defines the wikitext tags <mapframe>
and <maplink>
, which both display a map on the page. See Help:Extension:Kartographer for how to call these tags.
Example

Installation
Configuration
parameter | default | comment |
---|---|---|
$wgKartographerWikivoyageMode | false
|
Enables Wikivoyage mode. |
$wgKartographerUseMarkerStyle | false
|
Allows Kartographer to extract CSS style to be used by the link from the GeoJSON. |
$wgKartographerStaticMapframe | false
|
Defines if the map will be a static image. |
$wgKartographerEnableMapFrame | true
|
Enables the <mapframe> tag to be used to create static or interactive maps. |
$wgKartographerMapServer | "https://maps.wikimedia.org"
|
Server providing the map tiles |
$wgKartographerStyles | ["osm-intl", "osm"]
|
Available map styles on $wgKartographerMapServer |
Implementation
Kartographer makes use of a suite of open-source, open-data tools for displaying maps:
- On the client side (within the browser):
- Leaflet, a JavaScript mapping library
- On the server side:
- Kartotherian, a map tile service developed by the Wikimedia Foundation, which itself contains code from Mapbox. Third party installations should use non-Wikimedia tile servers listed on https://wiki.openstreetmap.org/wiki/Tile_servers
- Generating the data in advance:
- Tilerator, a tile pre-generation service also developed by the Wikimedia Foundation
- OpenStreetMap, an open map data source, the source for the map data as well as for most of the points of interest (POIs).
For more information on these, see Maps#Production maps cluster. For more information on the production aspects of running these services, see the Wikitech Maps page.
Goals
General goals
- A simple method to insert a map into an article without requiring common.js code changes
- Ability to add extra information (marks, area, popups, text, links) to the map
- Ability to gather map usage statistics (KPI) to better gauge how and what should be improved.
- TBD: experimentation - if the user is aware of the privacy implications, the map should be able to show external data from non-production source, e.g. wmflabs. Static, server-side rendered images will not include the extra data added via this method until the extra data source is hosted in the secure production environment and can be shown without the user action.
Wikivoyage goals
Wikivoyage tends to have a large number of points of interest (POIs), such as museums and restaurants, listed on a page (see example and scroll down to the "See" section). Each POI is usually added with a template, but all of them should appear on the same map. Also, each POI should be referable by showing an icon with a number, both in the text of the article, and on the map:
- Ability to incrementally add features to the map. For example, each usage of the restaurant template adds a single POI, and the map shows all of them.
- Added features need to be indexable. E.g. the first restaurant template would show [1] on the page, and map would show POI as a clickable [1] element. There could be multiple index counters at the same time, each for its own type of POIs.
Known problems
See the corresponding project(s) in Phabricator for a complete list of bugs.
![]() |
Note: When you edit this page, you agree to release your contribution under the [<tvar
The Kartographer extension powers interactive maps on Wikimedia wikis. This page shows techniques for creating dynamic maps by using the Kartographer tags Getting started![]() Downtown San Francisco This code will insert a simple interactive map, like the one you see in this section with the subject "Downtown San Francisco"
<mapframe text="Downtown [[wikipedia:San Francisco|San Francisco]]" width=250 height=250 zoom=13 latitude=37.8013 longitude=-122.3988 />
The Maps can also be added with the VisualEditor, see section below. If the map uses features, as explained below, zoom, latitude, and longitude do not need to be set, the map will automatically adjust to fit all features. Width and height however, must always be set.
<mapframe> usageThe content of the <mapframe text="San Francisco museums" width=350 height=350 zoom=13 latitude=37.8013 longitude=-122.3988>
{
"type": "Feature",
"geometry": { "type": "Point", "coordinates": [-122.3988, 37.8013] },
"properties": {
"title": "[[wikipedia:Exploratorium|Exploratorium]]",
"description": "[[File:Giant_Mirror_at_the_Exploratorium.jpeg|200px]]",
"marker-symbol": "museum",
"marker-size": "large",
"marker-color": "0050d0"
}
}
</mapframe>
FramesFrameless maps are good for insertion as part of a template, whereas framed maps are good for insertion directly into the page, either by hand or by using the visual editor.
Adding the text attribute automatically enables a frame, even if there is a
frameless attribute.
<maplink>Changing <maplink zoom="13" latitude="37.8103" longitude="-122.3995" />
<maplink text="click me" zoom="13" latitude="37.8103" longitude="-122.3995" />
Add additional classes to <maplink class="no-icon" text="click me" zoom="13" latitude="37.8103" longitude="-122.3995" />
The <maplink> and auto-counters
If GeoJSON has more than one counter, the value of the first one will be shown as the link text. Optionally, editors may add a suffix to have multiple counters on the page at the same time. This way It would make sense to use a distinct color for each counting group. All data added via {{see
| name=Exploratorium | url=http://www.exploratorium.edu/
| lat=37.8013 | long=-122.3988
| content=A great museum
}}
could be expanded into <maplink zoom=13 latitude=37.8013 longitude=-122.3988>
{
"type": "Feature",
"geometry": { "type": "Point", "coordinates": [-122.3988, 37.8013] },
"properties": {
"title": "Exploratorium",
"marker-color": "228b22",
"marker-symbol": "-number-see"
}
}
</maplink>
The attributes MarkersMarkers can be added to maps to denote a location. These features are added using the JSON format. Help:Extension:Kartographer/Icons contains a full list of icons that can be used as marker symbols. These examples use
maplink . The formatting for mapframe is the same.<maplink text="Colorado State Capital with marker icon" latitude="39.73939" longitude="-104.98491" zoom="17">{"type": "Feature", "properties": { "marker-symbol": "", "marker-color": "46ea5f", "marker-size": "medium"}, "geometry": { "type": "Point", "coordinates": [-104.98485267162323, 39.73928364167763] }}</maplink>
Result: Colorado State Capital with marker icon Markers can also contain information such as images and links to articles. <maplink text="Colorado State Capital with a town hall marker, article link and image" latitude="39.73939" longitude="-104.98491" zoom="17">
{
"type": "Feature",
"properties": { "marker-symbol": "town-hall", "marker-color": "46ea5f", "marker-size": "medium", "title": "[[wikipedia:Colorado_State_Capitol|Colorado State Capital]]", "description": "[[File:Coloradocapitolhill2.JPG|150px]]"},
"geometry": { "type": "Point", "coordinates": [-104.98485267162323, 39.73928364167763] }
}
</maplink>
Result (interact with marker to see result): Colorado State Capital with a town hall marker, article link and image Wikidata IDs for OSM data can be used to highlight borders using the geoshape service. <maplink text="State of Colorado, outlined" zoom=7 > { "type": "ExternalData", "service": "geoshape", "ids": "Q1261" } </maplink>
Result: State of Colorado, outlined Wikidata IDs can be used to mask the entire map except a specified region. <maplink text="State of Colorado, highlighted" zoom=7> { "type": "ExternalData", "service": "geoshape", "ids": "Q1261", "service": "geomask" } </maplink>
Result: State of Colorado, highlighted Markers can be numbered. <maplink text="Colorado State Capital with a number marker" latitude="39.73939" longitude="-104.98491" zoom="17">{ "type": "Feature", "properties": { "marker-color": "228b22", "marker-symbol": "-number"}, "geometry": { "type": "Point", "coordinates": [-104.98485267162323, 39.73928364167763] }}</maplink>
Result: Colorado State Capital with a number marker Markers can use letters. <maplink text="Colorado State Capital with a letter marker" latitude="39.73939" longitude="-104.98491" zoom="17">{ "type": "Feature", "properties": { "marker-color": "508e33", "marker-symbol": "-letter"}, "geometry": { "type": "Point", "coordinates": [-104.98485267162323, 39.73928364167763] }}</maplink>
Result: Colorado State Capital with a letter marker Add several map markers in different sizes using a feature collection. <maplink text="Denver Amusements" latitude="39.74956567318853" longitude="-105.01247406005858" zoom="14"> {"type": "FeatureCollection", "features": [{ "type": "Feature", "geometry": { "type": "Point", "coordinates": [-105.00768899917603, 39.74859230437501] }, "properties": { "title": "[[wikipedia:Pepsi_Center|Pepsi Center]]", "marker-color": "420617", "marker-symbol": "-letter-see", "marker-size":"small"} }, { "type": "Feature", "geometry": { "type": "Point", "coordinates": [-105.01238822937012, 39.7526011757416] }, "properties": { "title": "[[wikipedia:Downtown_Aquarium%2C_Denver|Downtown Aquarium Denver]]", "marker-color": "508e33", "marker-symbol": "-letter-see","marker-size":"medium", "description": "[[File:Denver-DTA.jpg|150px]]" } }, { "type": "Feature", "geometry": { "type": "Point", "coordinates": [-105.01247406005858, 39.74956567318853] }, "properties": { "title": "[[wikipedia:Confluence_Park|Confluence Park]]", "marker-color": "0d2751", "marker-symbol": "-letter-see", "marker-size":"large" } }, { "type": "Feature", "geometry": { "type": "Point", "coordinates": [-105.01646518707275, 39.74656303364532] }, "properties": { "title": "South Platte Bike Trail", "marker-color": "61b9e2", "marker-symbol": "-number-see", "marker-size":"medium" } },]}</maplink>
Result: Denver Amusements Add groups of different colored map markers and different counters. <maplink text="Add groups of different colored markers and different counters" width="350" height="350" zoom="13" longitude="-122.39902496337889" latitude="37.80151060070086"> {
"type": "FeatureCollection", "features": [
{ "type": "Feature",
"properties": {
"marker-symbol": "-number",
"marker-color": "302060" },
"geometry": {
"type": "Point",
"coordinates": [ -122.41816520690917, 37.79097260220947 ] }},
{ "type": "Feature",
"properties": {
"marker-symbol": "-number",
"marker-color": "302060"
},
"geometry": {
"type": "Point",
"coordinates": [ -122.40786552429199, 37.799654055191525 ] }},
{
"type": "Feature",
"properties": {
"marker-symbol": "-number",
"marker-color": "302060"
},
"geometry": {
"type": "Point",
"coordinates": [ -122.40185737609865, 37.796262984039544 ] }},
{
"type": "Feature",
"properties": {
"marker-symbol": "-number",
"marker-color": "302060"
},
"geometry": {
"type": "Point",
"coordinates": [ -122.38743782043457, 37.80535070427755 ] }},
{
"type": "Feature",
"properties": {
"marker-symbol": "-number",
"marker-color": "302060"
},
"geometry": {
"type": "Point",
"coordinates": [ -122.38005638122557, 37.795449103799726 ] }},
{
"type": "Feature",
"properties": {
"marker-symbol": "-letter",
"marker-color": "208020"
},
"geometry": {
"type": "Point",
"coordinates": [ -122.40941047668457, 37.81850557172186 ] }},
{
"type": "Feature",
"properties": {
"marker-symbol": "-letter",
"marker-color": "208020"
},
"geometry": {
"type": "Point",
"coordinates": [ -122.40357398986815, 37.81280993744834 ] }},
{
"type": "Feature",
"properties": {
"marker-symbol": "-letter",
"marker-color": "208020"
},
"geometry": {
"type": "Point",
"coordinates": [ -122.39842414855956, 37.8071138637568 ] }},
{
"type": "Feature",
"properties": {
"marker-symbol": "-number-bar",
"marker-color": "f01080"
},
"geometry": {
"type": "Point",
"coordinates": [ -122.41181373596191, 37.78595317184089 ] }},
{
"type": "Feature",
"properties": {
"marker-symbol": "-number-bar",
"marker-color": "f01080"
},
"geometry": {
"type": "Point",
"coordinates": [ -122.39542007446289, 37.787674400057654 ] }},
{
"type": "Feature",
"properties": {
"marker-symbol": "-number-bar",
"marker-color": "f01080"
},
"geometry": {
"type": "Point",
"coordinates": [ -122.38649368286131, 37.78401144262929 ] }}
] }</maplink>
Result: Add groups of different colored markers and different counters
GroupsThe groups feature is only available in Wikivoyage (per VisualEditor team request)
For use on the Wikivoyage project, there is a need to show a map whose data is defined somewhere else on the page. For example, there may be multiple points of interest (POI) defined with The grouping concept allows editors to share data between multiple By default, the data inside the If A tag may also show other groups, regardless if it belongs to a group or not, by specifying the 1 <maplink> -- shows 1
2 <maplink group='food'> -- shows 2 4 8 10
3 <maplink group='bar' show='bar'> -- shows 3 9
4 <maplink group='food' show='bar'> -- shows 2 3 4 8 9 10
5 <maplink show='bar'> -- shows 3 5 9
6 <maplink show='food,bar'> -- shows 2 3 4 6 8 9 10
7 <mapframe> -- shows 7
8 <mapframe group='food'> -- shows 2 4 8 10
9 <mapframe group='bar' show='bar'> -- shows 3 9
10 <mapframe group='food' show='bar'> -- shows 2 3 4 8 9 10
11 <mapframe show='bar'> -- shows 3 9 11
12 <mapframe show='food,bar'> -- shows 2 3 4 8 9 10 12
External dataIn addition to drawing polygons using GeoJSON, you may also get outlines of the well known geographical objects by their Wikidata ID if they are marked as such in the OpenStreetMap database. For example, the Wikidata item for Alaska is Q797, and we can draw it on a map by using the "external data" reference. More than one ID may be specified separated by a comma. To create a mask over the areas of interest, use the "geoshape" service. To invert this and create a mask over everything else, use the "geomask" service. Wikidata IDs are relatively new to the OSM community. There are about 1.3 million features with IDs. To add more, visit https://www.openstreetmap.org/ and add
wikidata tag with the Q value (see Key:wikidata on OSM wiki for an easier way to do it). For detailed instructions, see Help:Extension:Kartographer/OSM . The data normally becomes available to Kartographer within 2 days. However, as of April 2020, no tags added since late January 2020 are recognized by Kartographer due to a pause in updates.<mapframe text="A geoshape of Alaska" width=300 height=300 zoom=3 latitude=64.01 longitude=-152.58>
{
"type": "ExternalData",
"service": "geoshape",
"ids": "Q797"
}
</mapframe>
GeoShapes via Wikidata QueryWhile this helps with the simple use cases when the Wikidata ID is well known, sometimes you may want to get a list of IDs as a result of a Wikidata query. A SPARQL query gets a list of all US states in the ID column of the result, and geoshapes service adds the geometrical outlines for each state. All other columns in the SPARQL query result become values in the "properties" object. The "fill" column changes the color of the state. The "title" column shows state governor's name, and "description" has wiki markup to show the state name and the governor's picture. To edit this query, copy the query parameter after the "#" symbol at https://query.wikidata.org/#...: <mapframe latitude="52" longitude="-110" zoom="3" width="500" height="500" text="Governors of US states with their party affiliation">
{
"type": "ExternalData",
"service": "geoshape",
"query": "SELECT ?id ?head (SAMPLE(?img) as ?img_) (min(?partyId) as ?party) (if(?party = '0', '#800000', if(?party = '1', '#000080', '#008000')) as ?fill) (concat('[[wikipedia:', substr(str(?link),31,500), '{{!}}', ?headLabel, ']]') as ?title) (concat(?stateLabel, '\\n', '[[File:', substr(str(?img_), 52, 500), '{{!}}200px]]') as ?description) WHERE { ?id wdt:P31 wd:Q35657 . ?id wdt:P6 ?head . ?head wdt:P102 ?party . BIND(if(?party = wd:Q29468, '0', if(?party = wd:Q29552, '1', '2')) as ?partyId) SERVICE wikibase:label { bd:serviceParam wikibase:language 'en' . ?head rdfs:label ?headLabel . ?id rdfs:label ?stateLabel . } OPTIONAL { ?head wdt:P18 ?img . } ?link schema:about ?head . ?link schema:isPartOf <https://en.wikipedia.org/> .} GROUP BY ?id ?head ?headLabel ?link ?stateLabel"
}
</mapframe>
Map data from Commons
Map data stored on Commons can be drawn on the map. For example, c:Data:Neighbourhoods/New York City.map: <mapframe>: Title "Neighbourhoods/New York City.map" is not a valid map data page
<mapframe width=300 height=400 zoom=11 latitude=40.7920 longitude=-73.9751>
{
"type": "ExternalData",
"service": "page",
"title": "Neighbourhoods/New York City.map"
}
</mapframe>
Combining multiple data typesYou can combine ExternalData, Feature, and FeatureCollection together in the same <mapframe> or <maplink> element: <mapframe text="Caderousse city wall" width="300" height="300" zoom="15" latitude="44.10200" longitude="4.75600">
[
{
"type": "ExternalData",
"service": "geoshape",
"ids": "Q13518258",
"properties": {
"stroke": "#ffb100",
"stroke-width": 6,
}
},
{
"type": "Feature",
"geometry": { "type": "Point", "coordinates": [4.75566, 44.104498] },
"properties": {
"title": "Porte de Castellan"
}
},
{
"type": "Feature",
"geometry": { "type": "Point", "coordinates": [4.75829, 44.10258] },
"properties": {
"title": "Porte Léon Roche"
}
}
]
</mapframe>
<mapframe>: Title "Neighbourhoods/New York City.map" is not a valid map data page
Map data from Commons can be combined with other types of data: <mapframe width="300" height="300" zoom="12" latitude="40.782222" longitude="-73.965278">
[
{
"type": "ExternalData",
"service": "page",
"title": "Neighbourhoods/New York City.map"
},
{
"type": "ExternalData",
"service": "geoshape",
"ids": "Q160409",
"properties": {
"fill": "#07c63e", "title": "Central Park"
}
},
{
"type": "Feature",
"properties": {"title": "Roosevelt Island", "marker-color": "f01080"},
"geometry": {
"type": "Point",
"coordinates": [
-73.94511222839355,
40.76734665426719
]
}
}
]
</mapframe>
StylingStyling Wikidata ID elementsFor external data, you can also add styles and titles, using the properties keyword: <mapframe text="Interstate Highway I-696" width="300" height="300" latitude="42.4883" longitude="-83.2297" zoom="9">
{
"type": "ExternalData",
"service": "geoline",
"ids": "Q2108",
"properties": {
"title": "Highway I-696",
"description": "[[File:I696-1988.JPG|200px]]",
"stroke": "#ffb100",
"stroke-width": 8
}
}
</mapframe>
The main style keys are: "stroke" (color), "stroke-width", "stroke-opacity", "fill" (color), "fill-opacity".
Overlapping elementsMap elements that overlap are drawn in the order in which they are written in the code. For instance, if a map includes two lines that overlap, the line that is defined first will appear beneath the line that is defined second. The following examples show how this can affect the appearance of the map: <mapframe width="500" height="270" latitude="-24.794" longitude="79.030" zoom="8" align="center">
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {"fill": "#ff0000","fill-opacity": 0.7,"stroke-width": 0},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[77.926025390625, -25.150257104114733],
[80.14251708984374, -25.150257104114733],
[80.14251708984374, -24.43714786161562],
[77.926025390625, -24.43714786161562],
[77.926025390625, -25.150257104114733]
]
]
}
},
{
"type": "Feature",
"properties": {"stroke": "#fffa00","stroke-width": 5},
"geometry": {
"type": "LineString",
"coordinates": [
[77.926025390625, -25.150257104114733],
[80.14251708984374, -24.43714786161562]
]
}
},
{
"type": "Feature",
"properties": {"stroke": "#000000","stroke-width": 5},
"geometry": {
"type": "LineString",
"coordinates": [
[77.926025390625, -24.43714786161562],
[80.14251708984374, -25.150257104114733]
]
}
}
]
}
</mapframe>
The code for the map above includes three elements, all of which use GeoJSON's "feature" functionality. The first feature is a "Polygon" - the red rectangle. This is followed by two "LineString" features. The yellow line is defined first, so it appears beneath the black line. Note that the hierarchy used to draw elements applies regardless of whether the data is raw GeoJSON or comes from a Wikidata ID or Commons data page. The map below changes the order from that of the first example: the black line is defined first and is thus moved to the bottom of the stack: Rendering optionsThe following table shows how a <mapframe> map can be formatted for display on a wiki page. The table contains two columns: the first shows an interactive map via the <mapframe> tag, and the second showing the rendering of an example image with the same options.
Use the width value <mapframe width="full" height="200" zoom="13" latitude="37.81032643553478" longitude="-122.39953994750977" align="left"></mapframe>
Map languagesMap labels will try to use the language of the wiki where the embedded map is displayed. If that language is not available, then the map will use fallback language as described.
You can specify the language to use for labels by adding the <maplink text="Brussels, Belgium" width="250" height="250" zoom=13 latitude=50.85 longitude=4.35 lang="ja"/>
Result: Brussels, Belgium If you wish to use the language local to an area you can use Without the Map language fallbacksInitially these fallbacks follow those found in MediaWiki. The language fallbacks for Maps are stored in fallbacks.json and can be made different than the MediaWiki settings. Individual Wikimedia projects can request a change to this fallback process in Phabricator. More Technical information can be found in T192701. Maps use map data, including map label data for all languages, from the open-source mapping project OpenStreetMap. If the map you want to display doesn’t offer labels in the desired language, you can add labels in that language by adding them to OpenStreetMap. To get you started, there is an OpenStreetMap Beginners’ Guide, and guidance about naming conventions. A community can decide to change its language fallbacksRead all about changing your language's fallbacks on the Map Improvements project page. VisualEditorFile:Mapframe Kartographer demo.webm
See also
|