Template:OSM Location map/doc

< Template:OSM Location map
<graph>

{

 //
 // ATTENTION: This code is maintained at https://www.mediawiki.org/wiki/Template:Graph:Street_map_with_marks
 //            Please do not modify it anywhere else, as it may get copied and override your changes.
 //            Suggestions can be made at https://www.mediawiki.org/wiki/Template_talk:Graph:Street_map_with_marks
 //
 // Template translation is in https://commons.wikimedia.org/wiki/Data:Original/Template:Graphs.tab
 //
 "version": 2, "width":, "height": , "padding": 0,
 "signals":[
   // These signals allow us to quickly move the map within the image, e.g. to leave space for the legend

{"name":"legendWidth", "init": {"expr": "0"} },

   {"name":"legendHeight", "init": {"expr": "height"} },
   {"name":"imgWidth", "init": {"expr": "width-legendWidth"} },
   {"name":"imgHeight", "init": {"expr": "height"} },
   {"name":"imgXC", "init": {"expr": "imgWidth/2"} },
   {"name":"imgYC", "init": {"expr": "imgHeight/2"} },
   {"name":"imgTileSize", "init": {"expr": "256"} },
   {"name":"imgLat", "init": {"expr": "52.6909"} },
   {"name":"imgLon", "init": {"expr": "-1.2163"} },
   {"name":"imgZoom", "init": {"expr": ""} },
   {"name":"picWidth", "init": {"expr": "180"} },
   {"name":"picHeight", "init": {"expr": "picWidth/2"} },
   {"name":"picXC", "init": {"expr": "imgWidth-(picWidth/2)"} },
   {"name":"picYC", "init": {"expr": "imgHeight-(picHeight/2)"} },
   {"name":"showMiniMap", "init": {"expr": "0"} }
 ],
 "data": [
   {
     "name": "data",

// Otherwise use the first unnamed argument for source values

     "values": [  { "lat": 52.6909, 
    "lon": -1.2163, 
    "img": "wikirawupload:https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Mapscaleline.svg/120px-Mapscaleline.svg.png", 
    "width": 50, 
    "height": 8, 
    "offsetX": Expression error: Unexpected / operator., 
    "offsetY": Expression error: Unexpected / operator., 
    "textAlign": "right", 
    "textDx": 22, 
    "textDy": -2, 
    "textColor": "grey", 
    "textFont": "Tahoma", 
    "textFontSize": 9, 
    "text":  "10 000km" }

, { "lat": 52.69632, "lon": -1.22391, Expression error: Unexpected = operator. "text": "Old John Tower", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755"


} , { "lat": 52.688, "lon": -1.1995, "size": "0", "text": "C", "textAngle": -70, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, 

{ "lat": 52.688178566108, "lon": -1.1993878292739, "size": "0", "text": "r", "textAngle": -69.219693161601, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, 

{ "lat": 52.688356211753, "lon": -1.199271559203, "size": "0", "text": "o", "textAngle": -68.439386323202, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, 

{ "lat": 52.688532903986, "lon": -1.1991512113521, "size": "0", "text": "p", "textAngle": -67.659079484803, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, 

{ "lat": 52.688708610036, "lon": -1.1990268080426, "size": "0", "text": "s", "textAngle": -66.878772646404, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, 

{ "lat": 52.688883297315, "lon": -1.1988983723476, "size": "0", "text": "t", "textAngle": -66.098465808005, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, 

{ "lat": 52.689056933422, "lon": -1.1987659280886, "size": "0", "text": "o", "textAngle": -65.318158969606, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, 

{ "lat": 52.689229486153, "lon": -1.1986294998301, "size": "0", "text": "n", "textAngle": -64.537852131207, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, 

{ "lat": 52.689400923505, "lon": -1.198489112876, "size": "0", "text": "", "textAngle": -63.757545292808, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, 

{ "lat": 52.689571213679, "lon": -1.1983447932639, "size": "0", "text": "R", "textAngle": -62.977238454409, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, 

{ "lat": 52.689740325094, "lon": -1.1981965677613, "size": "0", "text": "e", "textAngle": -62.19693161601, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, 

{ "lat": 52.689908226382, "lon": -1.1980444638597, "size": "0", "text": "s", "textAngle": -61.416624777611, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, 

{ "lat": 52.690074886402, "lon": -1.1978885097704, "size": "0", "text": "e", "textAngle": -60.636317939212, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, { "lat": 52.690240274245, "lon": -1.1977287344184, "size": "0", "text": "r", "textAngle": -59.856011100813, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, { "lat": 52.690404359235, "lon": -1.1975651674376, "size": "0", "text": "v", "textAngle": -59.075704262414, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, 

{ "lat": 52.690567110939, "lon": -1.1973978391651, "size": "0", "text": "o", "textAngle": -58.295397424015, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, 

{ "lat": 52.690728499171, "lon": -1.1972267806357, "size": "0", "text": "i", "textAngle": -57.515090585616, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, 

{ "lat": 52.690888493998, "lon": -1.197052023576, "size": "0", "text": "r", "textAngle": -56.734783747216, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, { "lat": 52.691047065746, "lon": -1.1968736003986, "size": "0", "text": "", "textAngle": -55.954476908817, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, { "lat": 52.691204185003, "lon": -1.196691544196, "size": "0", "text": "", "textAngle": -55.174170070418, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, { "lat": 52.691359822629, "lon": -1.1965058887345, "size": "0", "text": "", "textAngle": -54.393863232019, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}


, { "lat": 52.694944, "lon": -1.2254584, Expression error: Unexpected = operator. "text": "War memorial", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755"


} , { "lat": 52.6909, "lon": -1.2163, Expression error: Unexpected = operator. "text": "B R A D G A T E P A R K", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#81AF81"


} , { "lat": 52.686698, "lon": -1.2111676, Expression error: Unexpected = operator. "text": "Bradgate", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755" }, { "lat": 52.686698, "lon": -1.2111676,

"shape": "circle", 
"size": "0", 
"text": "House", 

"textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755"


} , { "lat": 52.6934, "lon": -1.1965, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755"


} , { "lat": 52.70037, "lon": -1.22784, Expression error: Unexpected = operator. "text": "Old John Car Park", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755" }, { "lat": 52.70037, "lon": -1.22784,

"shape": "circle", 
"size": "0", 
"text": "(Hunt's Hill)", 

"textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755"


} , { "lat": 52.69727, "lon": -1.1991620, Expression error: Unexpected = operator. "text": "Hallgates", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755"


} , { "lat": 52.68356, "lon": -1.2277007, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755"


}













     ],
     "transform": [
       {
         "type": "geo",
         "projection": "mercator",
         "scale": {"expr": "imgTileSize/PI/2*pow(2,imgZoom)"},
         "translate": [{"expr": "imgXC"}, {"expr": "imgYC"}],
         "center": [{"expr": "imgLon"}, {"expr": "imgLat"}],
         "lon": "lon", "lat": "lat"
       },
       { "type": "formula", "field":"layout_x", "expr": "datum.layout_x + (datum.offsetX || 0)" },
       { "type": "formula", "field":"layout_y", "expr": "datum.layout_y + (datum.offsetY || 0)" },
       { "type": "formula", "field":"color", "expr": "datum.color || '#c33'" },
       { "type": "formula", "field":"textColor", "expr": "datum.textColor || datum.color" },
       { "type": "formula", "field":"strokeColor", "expr": "datum.strokeColor || '#ffe7e6'" }
     ]
   },
   {
     // Hack: single value data source for drawing/hiding images and other non-series elements
     "name": "dummyData",
     "values": [{}]
   }
 ],

// Legend only works if showLegend and colorScaleField are set

 "marks": [
   {
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "formula", "field":"url", "expr": "'mapsnapshot:///?width='+imgWidth+'&height='+imgHeight+'&zoom='+imgZoom+'&lat='+imgLat+'&lon='+imgLon" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"field": "url"},
         "xc": {"signal": "imgXC"}, "yc": {"signal": "imgYC"},
         "width": {"signal": "imgWidth"}, "height": {"signal": "imgHeight"}
       }
     }
   },
   {
     // Places an image of a given name and size at the [lan,lon] location
     "type": "image",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.img" },
         { "type": "formula", "field":"iconWidth", "expr": "datum.width || 0" },
         { "type": "formula", "field":"iconHeight", "expr": "datum.height || 0" },
         { "type": "formula", "field":"img",
           "expr": "if(!test(/^[a-z]+:\\/\\//, datum.img), 'wikifile:///'+datum.img, datum.img)" },
         // Ensure that either width or height parameter is passed to wikifile:// request
         { "type": "formula", "field":"img",
           "expr": "if((datum.iconWidth || datum.iconHeight) && !test(/[?&](width|height)=\\d/, datum.img),if(datum.iconWidth,datum.img+'?width='+datum.iconWidth,datum.img+'?height='+datum.iconHeight), datum.img)" }
     ]},
     "properties": {
       "enter": {
         "url": {"field": "img"},
         "xc": {"field": "layout_x"}, "yc": {"field": "layout_y"},
         "width": {"field": "iconWidth"}, "height": {"field": "iconHeight"}
       }
     }
   },
   {
     // Draw marks of a given color, shape, and size at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "data",
       "transform": [{ "type": "filter", "test": "!datum.img" }]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"},
         "y": {"field": "layout_y"},
         // If colorScaleField is set, use color scaling, otherwise use the preset color value
         "fill": { "field": "color" },
         "size": {"field": "size"},
         "shape": {"field": "shape"},
         "stroke": {"field": "strokeColor"}
       }
     }
   },
   {
     // Draw text with the given color and size at the [lan,lon] location
     // See https://github.com/vega/vega/wiki/Marks#text for all parameter description (prepend "text" and capitalize them)
     "type": "text",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.text" },
         // Figure out if this is an LTR or RTL page. For LTR, show label to the right of the icon, left-aligned. For RTL, reverse.
         { "type": "formula", "field":"isLTR", "expr": "'‎' == '\\u200E'" },
         // If these values are not defined ("undefined" is not allowed, so test for truthiness and not 0)
         { "type": "formula", "field":"textDx", "expr": "if(!datum.textDx && datum.textDx != 0, if(datum.isLTR,8,-8), datum.textDx)" },
         { "type": "formula", "field":"textAlign", "expr": "if(!datum.textAlign, if(datum.isLTR,'left','right'), datum.textAlign)" },
         { "type": "formula", "field":"textBaseline", "expr": "datum.textBaseline || 'middle'" }
     ]},
     "properties": {
       "enter": {
         "text": {"field": "text"},
         "x": {"field": "layout_x" },
         "y": {"field": "layout_y"},
         "dx": {"field": "textDx" },
         "dy": {"field": "textDy"},
         "fill": {"field": "textColor"},
         "align": {"field": "textAlign"},
         "baseline": {"field": "textBaseline"},
         "radius": {"field": "textRadius"},
         "theta": {"field": "textTheta"},
         "angle": {"field": "textAngle"},
         "font": {"field": "textFont"},
         "fontSize": {"field": "textFontSize"},
         "fontWeight": {"field": "textFontWeight"},
         "fontStyle": {"field": "textFontStyle"}
       }
     }
   },
   {
     // Draw a low-zoom locator map frame
     "type": "rect",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" }
       ]
     },
     "properties": {
       "enter": {
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth", "offset":2}, "height": {"signal": "picHeight"},
         "stroke": {"value":"#fff"},"strokeWidth": {"value":6}
       }
     }
   },
   {
     // Draw a low-zoom locator map by using a premade world map image
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"url", "expr": "1" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"value": "wikirawupload:"},
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth"}, "height": {"signal": "picHeight"}
       }
     }
   },
   {
     // Draw a zoom-out mark at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"lat", "expr": "imgLat" },
         { "type": "formula", "field":"lon", "expr": "imgLon" },
         {
           "type": "geo",
           "projection": "equirectangular",
           "scale": {"expr": "180/2/PI"},
           "translate": [{"expr": "picXC"}, {"expr": "picYC"}],
           "center": [{"expr": "0"}, {"expr": "0"}],
           "lon": "lon", "lat": "lat"
         }
       ]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"}, "y": {"field": "layout_y"},
         "fill": {"value": "#c33"},
         "stroke": {"value": "#ffe7e6"},
         "size": {"value": 40}
       }
     }
   }
 ]

} </graph>

Old John Tower in Bradgate Park, Leicestershire

This template provides a map in a frame, for any location and scale. At its simplest it can simply show the OpenStreetMap image and a scale indicator for a given area of land. Optionally a range of marker, label and annotation tools are available to include location markers, labels, numbered dots, a heading, caption, mini-locator map and overlays. The map also provides a link to a full-screen interactive 'maplink' version.

Purpose

OSM Location map allows an editor to include a map in a frame for anywhere in the world, at any scale from the whole world down to one or two streets. It makes use of the OpenStreetMap mapping data, and enables a place-based page or topic to simply show the area being described, without the need for pre-determined map templates. The underlying map will be updated and improved automatically as the OSM data develops.

The template can also show multiple marks, images and labels (currently limited to ten). The template makes use of {{Graph:Street map with marks}}, which allows unlimited numbers of marks and labels, utilises a different coding mark-up, and is particularly suited to using data directly from a Wikidata source.

The resulting framed map also has a link to a full-screen version, which opens at the same location, above the current page. This has a richer map interface, can be re-scaled and panned by the user, has optional thumbnail images and captions for the marker points, and can also access a wide range of maps, satellite images etc. (The fullscreen option uses the <maplink> mapping provision.)

A rough guide to the scale of the map is provided in the bottom left corner. This is only a guide, as the projection means the scale changes depending on the latitude. Some allowance has been made for this, but only in large 20 degree chunks.

Comparison with {{Maplink}}

From May 2018 it has also been possible to create a map in a frame via {{Maplink}}, which in some respects does a similar job to OSM Location map. In both cases a static map image can be added to an article, for anywhere in the world, pulling in the map from OpenStreetMap data. The differences are in what they can and can't add to the base map. Maplink, in both its framed and fullscreen versions, can only add either points (numbered or icon-style pointy dots), or various lines and areas can be imported from OpenStreetMap via wikidata Q values (such as boundaries, roads, rivers etc). Thus the framed map and fullscreen version will show identical information. The OSM Location map on the other hand, cannot add the Q value lines and areas except to the fullscreen click-through, but can use the framed map to show a much richer selection of dots, shapes, overlays, images and especially text to convey specific details relevant to a particular article.

Usage

Minimal version
an unadorned map centred on a latitude and longitiude coordinates, via a {{coord}} value. Set the zoom to give a scale that fits the subject (0=whole world, 18=a street). With just these options set, all other parameters use the defaults, or are left unused. It gives a link to the full screen version.
<graph>

{

 //
 // ATTENTION: This code is maintained at https://www.mediawiki.org/wiki/Template:Graph:Street_map_with_marks
 //            Please do not modify it anywhere else, as it may get copied and override your changes.
 //            Suggestions can be made at https://www.mediawiki.org/wiki/Template_talk:Graph:Street_map_with_marks
 //
 // Template translation is in https://commons.wikimedia.org/wiki/Data:Original/Template:Graphs.tab
 //
 "version": 2, "width":, "height": , "padding": 0,
 "signals":[
   // These signals allow us to quickly move the map within the image, e.g. to leave space for the legend

{"name":"legendWidth", "init": {"expr": "0"} },

   {"name":"legendHeight", "init": {"expr": "height"} },
   {"name":"imgWidth", "init": {"expr": "width-legendWidth"} },
   {"name":"imgHeight", "init": {"expr": "height"} },
   {"name":"imgXC", "init": {"expr": "imgWidth/2"} },
   {"name":"imgYC", "init": {"expr": "imgHeight/2"} },
   {"name":"imgTileSize", "init": {"expr": "256"} },
   {"name":"imgLat", "init": {"expr": "53.4146"} },
   {"name":"imgLon", "init": {"expr": "-4.3341"} },
   {"name":"imgZoom", "init": {"expr": ""} },
   {"name":"picWidth", "init": {"expr": "180"} },
   {"name":"picHeight", "init": {"expr": "picWidth/2"} },
   {"name":"picXC", "init": {"expr": "imgWidth-(picWidth/2)"} },
   {"name":"picYC", "init": {"expr": "imgHeight-(picHeight/2)"} },
   {"name":"showMiniMap", "init": {"expr": "0"} }
 ],
 "data": [
   {
     "name": "data",

// Otherwise use the first unnamed argument for source values

     "values": [  { "lat": 53.4146, 
    "lon": -4.3341, 
    "img": "wikirawupload:https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Mapscaleline.svg/120px-Mapscaleline.svg.png", 
    "width": 50, 
    "height": 8, 
    "offsetX": Expression error: Unexpected / operator., 
    "offsetY": Expression error: Unexpected / operator., 
    "textAlign": "right", 
    "textDx": 22, 
    "textDy": -2, 
    "textColor": "grey", 
    "textFont": "Tahoma", 
    "textFontSize": 9, 
    "text":  "10 000km" }

, { "lat": 0, "lon": 0, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


}


, { "lat": 0.1, "lon": 0.1, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


}
















     ],
     "transform": [
       {
         "type": "geo",
         "projection": "mercator",
         "scale": {"expr": "imgTileSize/PI/2*pow(2,imgZoom)"},
         "translate": [{"expr": "imgXC"}, {"expr": "imgYC"}],
         "center": [{"expr": "imgLon"}, {"expr": "imgLat"}],
         "lon": "lon", "lat": "lat"
       },
       { "type": "formula", "field":"layout_x", "expr": "datum.layout_x + (datum.offsetX || 0)" },
       { "type": "formula", "field":"layout_y", "expr": "datum.layout_y + (datum.offsetY || 0)" },
       { "type": "formula", "field":"color", "expr": "datum.color || '#c33'" },
       { "type": "formula", "field":"textColor", "expr": "datum.textColor || datum.color" },
       { "type": "formula", "field":"strokeColor", "expr": "datum.strokeColor || '#ffe7e6'" }
     ]
   },
   {
     // Hack: single value data source for drawing/hiding images and other non-series elements
     "name": "dummyData",
     "values": [{}]
   }
 ],

// Legend only works if showLegend and colorScaleField are set

 "marks": [
   {
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "formula", "field":"url", "expr": "'mapsnapshot:///?width='+imgWidth+'&height='+imgHeight+'&zoom='+imgZoom+'&lat='+imgLat+'&lon='+imgLon" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"field": "url"},
         "xc": {"signal": "imgXC"}, "yc": {"signal": "imgYC"},
         "width": {"signal": "imgWidth"}, "height": {"signal": "imgHeight"}
       }
     }
   },
   {
     // Places an image of a given name and size at the [lan,lon] location
     "type": "image",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.img" },
         { "type": "formula", "field":"iconWidth", "expr": "datum.width || 0" },
         { "type": "formula", "field":"iconHeight", "expr": "datum.height || 0" },
         { "type": "formula", "field":"img",
           "expr": "if(!test(/^[a-z]+:\\/\\//, datum.img), 'wikifile:///'+datum.img, datum.img)" },
         // Ensure that either width or height parameter is passed to wikifile:// request
         { "type": "formula", "field":"img",
           "expr": "if((datum.iconWidth || datum.iconHeight) && !test(/[?&](width|height)=\\d/, datum.img),if(datum.iconWidth,datum.img+'?width='+datum.iconWidth,datum.img+'?height='+datum.iconHeight), datum.img)" }
     ]},
     "properties": {
       "enter": {
         "url": {"field": "img"},
         "xc": {"field": "layout_x"}, "yc": {"field": "layout_y"},
         "width": {"field": "iconWidth"}, "height": {"field": "iconHeight"}
       }
     }
   },
   {
     // Draw marks of a given color, shape, and size at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "data",
       "transform": [{ "type": "filter", "test": "!datum.img" }]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"},
         "y": {"field": "layout_y"},
         // If colorScaleField is set, use color scaling, otherwise use the preset color value
         "fill": { "field": "color" },
         "size": {"field": "size"},
         "shape": {"field": "shape"},
         "stroke": {"field": "strokeColor"}
       }
     }
   },
   {
     // Draw text with the given color and size at the [lan,lon] location
     // See https://github.com/vega/vega/wiki/Marks#text for all parameter description (prepend "text" and capitalize them)
     "type": "text",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.text" },
         // Figure out if this is an LTR or RTL page. For LTR, show label to the right of the icon, left-aligned. For RTL, reverse.
         { "type": "formula", "field":"isLTR", "expr": "'‎' == '\\u200E'" },
         // If these values are not defined ("undefined" is not allowed, so test for truthiness and not 0)
         { "type": "formula", "field":"textDx", "expr": "if(!datum.textDx && datum.textDx != 0, if(datum.isLTR,8,-8), datum.textDx)" },
         { "type": "formula", "field":"textAlign", "expr": "if(!datum.textAlign, if(datum.isLTR,'left','right'), datum.textAlign)" },
         { "type": "formula", "field":"textBaseline", "expr": "datum.textBaseline || 'middle'" }
     ]},
     "properties": {
       "enter": {
         "text": {"field": "text"},
         "x": {"field": "layout_x" },
         "y": {"field": "layout_y"},
         "dx": {"field": "textDx" },
         "dy": {"field": "textDy"},
         "fill": {"field": "textColor"},
         "align": {"field": "textAlign"},
         "baseline": {"field": "textBaseline"},
         "radius": {"field": "textRadius"},
         "theta": {"field": "textTheta"},
         "angle": {"field": "textAngle"},
         "font": {"field": "textFont"},
         "fontSize": {"field": "textFontSize"},
         "fontWeight": {"field": "textFontWeight"},
         "fontStyle": {"field": "textFontStyle"}
       }
     }
   },
   {
     // Draw a low-zoom locator map frame
     "type": "rect",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" }
       ]
     },
     "properties": {
       "enter": {
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth", "offset":2}, "height": {"signal": "picHeight"},
         "stroke": {"value":"#fff"},"strokeWidth": {"value":6}
       }
     }
   },
   {
     // Draw a low-zoom locator map by using a premade world map image
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"url", "expr": "1" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"value": "wikirawupload:"},
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth"}, "height": {"signal": "picHeight"}
       }
     }
   },
   {
     // Draw a zoom-out mark at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"lat", "expr": "imgLat" },
         { "type": "formula", "field":"lon", "expr": "imgLon" },
         {
           "type": "geo",
           "projection": "equirectangular",
           "scale": {"expr": "180/2/PI"},
           "translate": [{"expr": "picXC"}, {"expr": "picYC"}],
           "center": [{"expr": "0"}, {"expr": "0"}],
           "lon": "lon", "lat": "lat"
         }
       ]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"}, "y": {"field": "layout_y"},
         "fill": {"value": "#c33"},
         "stroke": {"value": "#ffe7e6"},
         "size": {"value": 40}
       }
     }
   }
 ]

} </graph>

<source lang="html">
<graph>

{

 //
 // ATTENTION: This code is maintained at https://www.mediawiki.org/wiki/Template:Graph:Street_map_with_marks
 //            Please do not modify it anywhere else, as it may get copied and override your changes.
 //            Suggestions can be made at https://www.mediawiki.org/wiki/Template_talk:Graph:Street_map_with_marks
 //
 // Template translation is in https://commons.wikimedia.org/wiki/Data:Original/Template:Graphs.tab
 //
 "version": 2, "width":, "height": , "padding": 0,
 "signals":[
   // These signals allow us to quickly move the map within the image, e.g. to leave space for the legend

{"name":"legendWidth", "init": {"expr": "0"} },

   {"name":"legendHeight", "init": {"expr": "height"} },
   {"name":"imgWidth", "init": {"expr": "width-legendWidth"} },
   {"name":"imgHeight", "init": {"expr": "height"} },
   {"name":"imgXC", "init": {"expr": "imgWidth/2"} },
   {"name":"imgYC", "init": {"expr": "imgHeight/2"} },
   {"name":"imgTileSize", "init": {"expr": "256"} },
   {"name":"imgLat", "init": {"expr": "53.4146"} },
   {"name":"imgLon", "init": {"expr": "-4.3341"} },
   {"name":"imgZoom", "init": {"expr": ""} },
   {"name":"picWidth", "init": {"expr": "180"} },
   {"name":"picHeight", "init": {"expr": "picWidth/2"} },
   {"name":"picXC", "init": {"expr": "imgWidth-(picWidth/2)"} },
   {"name":"picYC", "init": {"expr": "imgHeight-(picHeight/2)"} },
   {"name":"showMiniMap", "init": {"expr": "0"} }
 ],
 "data": [
   {
     "name": "data",

// Otherwise use the first unnamed argument for source values

     "values": [  { "lat": 53.4146, 
    "lon": -4.3341, 
    "img": "wikirawupload:https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Mapscaleline.svg/120px-Mapscaleline.svg.png", 
    "width": 50, 
    "height": 8, 
    "offsetX": Expression error: Unexpected / operator., 
    "offsetY": Expression error: Unexpected / operator., 
    "textAlign": "right", 
    "textDx": 22, 
    "textDy": -2, 
    "textColor": "grey", 
    "textFont": "Tahoma", 
    "textFontSize": 9, 
    "text":  "10 000km" }

, { "lat": 0, "lon": 0, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


}


, { "lat": 0.1, "lon": 0.1, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


}
















     ],
     "transform": [
       {
         "type": "geo",
         "projection": "mercator",
         "scale": {"expr": "imgTileSize/PI/2*pow(2,imgZoom)"},
         "translate": [{"expr": "imgXC"}, {"expr": "imgYC"}],
         "center": [{"expr": "imgLon"}, {"expr": "imgLat"}],
         "lon": "lon", "lat": "lat"
       },
       { "type": "formula", "field":"layout_x", "expr": "datum.layout_x + (datum.offsetX || 0)" },
       { "type": "formula", "field":"layout_y", "expr": "datum.layout_y + (datum.offsetY || 0)" },
       { "type": "formula", "field":"color", "expr": "datum.color || '#c33'" },
       { "type": "formula", "field":"textColor", "expr": "datum.textColor || datum.color" },
       { "type": "formula", "field":"strokeColor", "expr": "datum.strokeColor || '#ffe7e6'" }
     ]
   },
   {
     // Hack: single value data source for drawing/hiding images and other non-series elements
     "name": "dummyData",
     "values": [{}]
   }
 ],

// Legend only works if showLegend and colorScaleField are set

 "marks": [
   {
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "formula", "field":"url", "expr": "'mapsnapshot:///?width='+imgWidth+'&height='+imgHeight+'&zoom='+imgZoom+'&lat='+imgLat+'&lon='+imgLon" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"field": "url"},
         "xc": {"signal": "imgXC"}, "yc": {"signal": "imgYC"},
         "width": {"signal": "imgWidth"}, "height": {"signal": "imgHeight"}
       }
     }
   },
   {
     // Places an image of a given name and size at the [lan,lon] location
     "type": "image",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.img" },
         { "type": "formula", "field":"iconWidth", "expr": "datum.width || 0" },
         { "type": "formula", "field":"iconHeight", "expr": "datum.height || 0" },
         { "type": "formula", "field":"img",
           "expr": "if(!test(/^[a-z]+:\\/\\//, datum.img), 'wikifile:///'+datum.img, datum.img)" },
         // Ensure that either width or height parameter is passed to wikifile:// request
         { "type": "formula", "field":"img",
           "expr": "if((datum.iconWidth || datum.iconHeight) && !test(/[?&](width|height)=\\d/, datum.img),if(datum.iconWidth,datum.img+'?width='+datum.iconWidth,datum.img+'?height='+datum.iconHeight), datum.img)" }
     ]},
     "properties": {
       "enter": {
         "url": {"field": "img"},
         "xc": {"field": "layout_x"}, "yc": {"field": "layout_y"},
         "width": {"field": "iconWidth"}, "height": {"field": "iconHeight"}
       }
     }
   },
   {
     // Draw marks of a given color, shape, and size at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "data",
       "transform": [{ "type": "filter", "test": "!datum.img" }]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"},
         "y": {"field": "layout_y"},
         // If colorScaleField is set, use color scaling, otherwise use the preset color value
         "fill": { "field": "color" },
         "size": {"field": "size"},
         "shape": {"field": "shape"},
         "stroke": {"field": "strokeColor"}
       }
     }
   },
   {
     // Draw text with the given color and size at the [lan,lon] location
     // See https://github.com/vega/vega/wiki/Marks#text for all parameter description (prepend "text" and capitalize them)
     "type": "text",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.text" },
         // Figure out if this is an LTR or RTL page. For LTR, show label to the right of the icon, left-aligned. For RTL, reverse.
         { "type": "formula", "field":"isLTR", "expr": "'‎' == '\\u200E'" },
         // If these values are not defined ("undefined" is not allowed, so test for truthiness and not 0)
         { "type": "formula", "field":"textDx", "expr": "if(!datum.textDx && datum.textDx != 0, if(datum.isLTR,8,-8), datum.textDx)" },
         { "type": "formula", "field":"textAlign", "expr": "if(!datum.textAlign, if(datum.isLTR,'left','right'), datum.textAlign)" },
         { "type": "formula", "field":"textBaseline", "expr": "datum.textBaseline || 'middle'" }
     ]},
     "properties": {
       "enter": {
         "text": {"field": "text"},
         "x": {"field": "layout_x" },
         "y": {"field": "layout_y"},
         "dx": {"field": "textDx" },
         "dy": {"field": "textDy"},
         "fill": {"field": "textColor"},
         "align": {"field": "textAlign"},
         "baseline": {"field": "textBaseline"},
         "radius": {"field": "textRadius"},
         "theta": {"field": "textTheta"},
         "angle": {"field": "textAngle"},
         "font": {"field": "textFont"},
         "fontSize": {"field": "textFontSize"},
         "fontWeight": {"field": "textFontWeight"},
         "fontStyle": {"field": "textFontStyle"}
       }
     }
   },
   {
     // Draw a low-zoom locator map frame
     "type": "rect",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" }
       ]
     },
     "properties": {
       "enter": {
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth", "offset":2}, "height": {"signal": "picHeight"},
         "stroke": {"value":"#fff"},"strokeWidth": {"value":6}
       }
     }
   },
   {
     // Draw a low-zoom locator map by using a premade world map image
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"url", "expr": "1" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"value": "wikirawupload:"},
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth"}, "height": {"signal": "picHeight"}
       }
     }
   },
   {
     // Draw a zoom-out mark at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"lat", "expr": "imgLat" },
         { "type": "formula", "field":"lon", "expr": "imgLon" },
         {
           "type": "geo",
           "projection": "equirectangular",
           "scale": {"expr": "180/2/PI"},
           "translate": [{"expr": "picXC"}, {"expr": "picYC"}],
           "center": [{"expr": "0"}, {"expr": "0"}],
           "lon": "lon", "lat": "lat"
         }
       ]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"}, "y": {"field": "layout_y"},
         "fill": {"value": "#c33"},
         "stroke": {"value": "#ffe7e6"},
         "size": {"value": 40}
       }
     }
   }
 ]

} </graph>

</source>
Single marker
Using mostly default settings, with a Red pog marker and label, and some additional info for use on the full screen version.
<graph>

{

 //
 // ATTENTION: This code is maintained at https://www.mediawiki.org/wiki/Template:Graph:Street_map_with_marks
 //            Please do not modify it anywhere else, as it may get copied and override your changes.
 //            Suggestions can be made at https://www.mediawiki.org/wiki/Template_talk:Graph:Street_map_with_marks
 //
 // Template translation is in https://commons.wikimedia.org/wiki/Data:Original/Template:Graphs.tab
 //
 "version": 2, "width":, "height": , "padding": 0,
 "signals":[
   // These signals allow us to quickly move the map within the image, e.g. to leave space for the legend

{"name":"legendWidth", "init": {"expr": "0"} },

   {"name":"legendHeight", "init": {"expr": "height"} },
   {"name":"imgWidth", "init": {"expr": "width-legendWidth"} },
   {"name":"imgHeight", "init": {"expr": "height"} },
   {"name":"imgXC", "init": {"expr": "imgWidth/2"} },
   {"name":"imgYC", "init": {"expr": "imgHeight/2"} },
   {"name":"imgTileSize", "init": {"expr": "256"} },
   {"name":"imgLat", "init": {"expr": "53.394"} },
   {"name":"imgLon", "init": {"expr": "-4.450"} },
   {"name":"imgZoom", "init": {"expr": ""} },
   {"name":"picWidth", "init": {"expr": "180"} },
   {"name":"picHeight", "init": {"expr": "picWidth/2"} },
   {"name":"picXC", "init": {"expr": "imgWidth-(picWidth/2)"} },
   {"name":"picYC", "init": {"expr": "imgHeight-(picHeight/2)"} },
   {"name":"showMiniMap", "init": {"expr": "0"} }
 ],
 "data": [
   {
     "name": "data",

// Otherwise use the first unnamed argument for source values

     "values": [  { "lat": 53.394, 
    "lon": -4.450, 
    "img": "wikirawupload:https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Mapscaleline.svg/120px-Mapscaleline.svg.png", 
    "width": 50, 
    "height": 8, 
    "offsetX": Expression error: Unexpected / operator., 
    "offsetY": Expression error: Unexpected / operator., 
    "textAlign": "right", 
    "textDx": 22, 
    "textDy": -2, 
    "textColor": "grey", 
    "textFont": "Tahoma", 
    "textFontSize": 9, 
    "text":  "10 000km" }

, { "lat": 53.3966, "lon": -4.46204, Expression error: Unexpected = operator. "text": "Llanfechell Triangle", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


}


, { "lat": 0.1, "lon": 0.1, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


}
















     ],
     "transform": [
       {
         "type": "geo",
         "projection": "mercator",
         "scale": {"expr": "imgTileSize/PI/2*pow(2,imgZoom)"},
         "translate": [{"expr": "imgXC"}, {"expr": "imgYC"}],
         "center": [{"expr": "imgLon"}, {"expr": "imgLat"}],
         "lon": "lon", "lat": "lat"
       },
       { "type": "formula", "field":"layout_x", "expr": "datum.layout_x + (datum.offsetX || 0)" },
       { "type": "formula", "field":"layout_y", "expr": "datum.layout_y + (datum.offsetY || 0)" },
       { "type": "formula", "field":"color", "expr": "datum.color || '#c33'" },
       { "type": "formula", "field":"textColor", "expr": "datum.textColor || datum.color" },
       { "type": "formula", "field":"strokeColor", "expr": "datum.strokeColor || '#ffe7e6'" }
     ]
   },
   {
     // Hack: single value data source for drawing/hiding images and other non-series elements
     "name": "dummyData",
     "values": [{}]
   }
 ],

// Legend only works if showLegend and colorScaleField are set

 "marks": [
   {
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "formula", "field":"url", "expr": "'mapsnapshot:///?width='+imgWidth+'&height='+imgHeight+'&zoom='+imgZoom+'&lat='+imgLat+'&lon='+imgLon" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"field": "url"},
         "xc": {"signal": "imgXC"}, "yc": {"signal": "imgYC"},
         "width": {"signal": "imgWidth"}, "height": {"signal": "imgHeight"}
       }
     }
   },
   {
     // Places an image of a given name and size at the [lan,lon] location
     "type": "image",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.img" },
         { "type": "formula", "field":"iconWidth", "expr": "datum.width || 0" },
         { "type": "formula", "field":"iconHeight", "expr": "datum.height || 0" },
         { "type": "formula", "field":"img",
           "expr": "if(!test(/^[a-z]+:\\/\\//, datum.img), 'wikifile:///'+datum.img, datum.img)" },
         // Ensure that either width or height parameter is passed to wikifile:// request
         { "type": "formula", "field":"img",
           "expr": "if((datum.iconWidth || datum.iconHeight) && !test(/[?&](width|height)=\\d/, datum.img),if(datum.iconWidth,datum.img+'?width='+datum.iconWidth,datum.img+'?height='+datum.iconHeight), datum.img)" }
     ]},
     "properties": {
       "enter": {
         "url": {"field": "img"},
         "xc": {"field": "layout_x"}, "yc": {"field": "layout_y"},
         "width": {"field": "iconWidth"}, "height": {"field": "iconHeight"}
       }
     }
   },
   {
     // Draw marks of a given color, shape, and size at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "data",
       "transform": [{ "type": "filter", "test": "!datum.img" }]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"},
         "y": {"field": "layout_y"},
         // If colorScaleField is set, use color scaling, otherwise use the preset color value
         "fill": { "field": "color" },
         "size": {"field": "size"},
         "shape": {"field": "shape"},
         "stroke": {"field": "strokeColor"}
       }
     }
   },
   {
     // Draw text with the given color and size at the [lan,lon] location
     // See https://github.com/vega/vega/wiki/Marks#text for all parameter description (prepend "text" and capitalize them)
     "type": "text",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.text" },
         // Figure out if this is an LTR or RTL page. For LTR, show label to the right of the icon, left-aligned. For RTL, reverse.
         { "type": "formula", "field":"isLTR", "expr": "'‎' == '\\u200E'" },
         // If these values are not defined ("undefined" is not allowed, so test for truthiness and not 0)
         { "type": "formula", "field":"textDx", "expr": "if(!datum.textDx && datum.textDx != 0, if(datum.isLTR,8,-8), datum.textDx)" },
         { "type": "formula", "field":"textAlign", "expr": "if(!datum.textAlign, if(datum.isLTR,'left','right'), datum.textAlign)" },
         { "type": "formula", "field":"textBaseline", "expr": "datum.textBaseline || 'middle'" }
     ]},
     "properties": {
       "enter": {
         "text": {"field": "text"},
         "x": {"field": "layout_x" },
         "y": {"field": "layout_y"},
         "dx": {"field": "textDx" },
         "dy": {"field": "textDy"},
         "fill": {"field": "textColor"},
         "align": {"field": "textAlign"},
         "baseline": {"field": "textBaseline"},
         "radius": {"field": "textRadius"},
         "theta": {"field": "textTheta"},
         "angle": {"field": "textAngle"},
         "font": {"field": "textFont"},
         "fontSize": {"field": "textFontSize"},
         "fontWeight": {"field": "textFontWeight"},
         "fontStyle": {"field": "textFontStyle"}
       }
     }
   },
   {
     // Draw a low-zoom locator map frame
     "type": "rect",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" }
       ]
     },
     "properties": {
       "enter": {
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth", "offset":2}, "height": {"signal": "picHeight"},
         "stroke": {"value":"#fff"},"strokeWidth": {"value":6}
       }
     }
   },
   {
     // Draw a low-zoom locator map by using a premade world map image
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"url", "expr": "1" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"value": "wikirawupload:"},
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth"}, "height": {"signal": "picHeight"}
       }
     }
   },
   {
     // Draw a zoom-out mark at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"lat", "expr": "imgLat" },
         { "type": "formula", "field":"lon", "expr": "imgLon" },
         {
           "type": "geo",
           "projection": "equirectangular",
           "scale": {"expr": "180/2/PI"},
           "translate": [{"expr": "picXC"}, {"expr": "picYC"}],
           "center": [{"expr": "0"}, {"expr": "0"}],
           "lon": "lon", "lat": "lat"
         }
       ]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"}, "y": {"field": "layout_y"},
         "fill": {"value": "#c33"},
         "stroke": {"value": "#ffe7e6"},
         "size": {"value": 40}
       }
     }
   }
 ]

} </graph>

The 'Llanfechell Triangle' standing stones are north-west of Llanfechell.
<source lang="html">
<graph>

{

 //
 // ATTENTION: This code is maintained at https://www.mediawiki.org/wiki/Template:Graph:Street_map_with_marks
 //            Please do not modify it anywhere else, as it may get copied and override your changes.
 //            Suggestions can be made at https://www.mediawiki.org/wiki/Template_talk:Graph:Street_map_with_marks
 //
 // Template translation is in https://commons.wikimedia.org/wiki/Data:Original/Template:Graphs.tab
 //
 "version": 2, "width":, "height": , "padding": 0,
 "signals":[
   // These signals allow us to quickly move the map within the image, e.g. to leave space for the legend

{"name":"legendWidth", "init": {"expr": "0"} },

   {"name":"legendHeight", "init": {"expr": "height"} },
   {"name":"imgWidth", "init": {"expr": "width-legendWidth"} },
   {"name":"imgHeight", "init": {"expr": "height"} },
   {"name":"imgXC", "init": {"expr": "imgWidth/2"} },
   {"name":"imgYC", "init": {"expr": "imgHeight/2"} },
   {"name":"imgTileSize", "init": {"expr": "256"} },
   {"name":"imgLat", "init": {"expr": "53.394"} },
   {"name":"imgLon", "init": {"expr": "-4.450"} },
   {"name":"imgZoom", "init": {"expr": ""} },
   {"name":"picWidth", "init": {"expr": "180"} },
   {"name":"picHeight", "init": {"expr": "picWidth/2"} },
   {"name":"picXC", "init": {"expr": "imgWidth-(picWidth/2)"} },
   {"name":"picYC", "init": {"expr": "imgHeight-(picHeight/2)"} },
   {"name":"showMiniMap", "init": {"expr": "0"} }
 ],
 "data": [
   {
     "name": "data",

// Otherwise use the first unnamed argument for source values

     "values": [  { "lat": 53.394, 
    "lon": -4.450, 
    "img": "wikirawupload:https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Mapscaleline.svg/120px-Mapscaleline.svg.png", 
    "width": 50, 
    "height": 8, 
    "offsetX": Expression error: Unexpected / operator., 
    "offsetY": Expression error: Unexpected / operator., 
    "textAlign": "right", 
    "textDx": 22, 
    "textDy": -2, 
    "textColor": "grey", 
    "textFont": "Tahoma", 
    "textFontSize": 9, 
    "text":  "10 000km" }

, { "lat": 53.3966, "lon": -4.46204, Expression error: Unexpected = operator. "text": "Llanfechell Triangle", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


}


, { "lat": 0.1, "lon": 0.1, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


}
















     ],
     "transform": [
       {
         "type": "geo",
         "projection": "mercator",
         "scale": {"expr": "imgTileSize/PI/2*pow(2,imgZoom)"},
         "translate": [{"expr": "imgXC"}, {"expr": "imgYC"}],
         "center": [{"expr": "imgLon"}, {"expr": "imgLat"}],
         "lon": "lon", "lat": "lat"
       },
       { "type": "formula", "field":"layout_x", "expr": "datum.layout_x + (datum.offsetX || 0)" },
       { "type": "formula", "field":"layout_y", "expr": "datum.layout_y + (datum.offsetY || 0)" },
       { "type": "formula", "field":"color", "expr": "datum.color || '#c33'" },
       { "type": "formula", "field":"textColor", "expr": "datum.textColor || datum.color" },
       { "type": "formula", "field":"strokeColor", "expr": "datum.strokeColor || '#ffe7e6'" }
     ]
   },
   {
     // Hack: single value data source for drawing/hiding images and other non-series elements
     "name": "dummyData",
     "values": [{}]
   }
 ],

// Legend only works if showLegend and colorScaleField are set

 "marks": [
   {
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "formula", "field":"url", "expr": "'mapsnapshot:///?width='+imgWidth+'&height='+imgHeight+'&zoom='+imgZoom+'&lat='+imgLat+'&lon='+imgLon" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"field": "url"},
         "xc": {"signal": "imgXC"}, "yc": {"signal": "imgYC"},
         "width": {"signal": "imgWidth"}, "height": {"signal": "imgHeight"}
       }
     }
   },
   {
     // Places an image of a given name and size at the [lan,lon] location
     "type": "image",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.img" },
         { "type": "formula", "field":"iconWidth", "expr": "datum.width || 0" },
         { "type": "formula", "field":"iconHeight", "expr": "datum.height || 0" },
         { "type": "formula", "field":"img",
           "expr": "if(!test(/^[a-z]+:\\/\\//, datum.img), 'wikifile:///'+datum.img, datum.img)" },
         // Ensure that either width or height parameter is passed to wikifile:// request
         { "type": "formula", "field":"img",
           "expr": "if((datum.iconWidth || datum.iconHeight) && !test(/[?&](width|height)=\\d/, datum.img),if(datum.iconWidth,datum.img+'?width='+datum.iconWidth,datum.img+'?height='+datum.iconHeight), datum.img)" }
     ]},
     "properties": {
       "enter": {
         "url": {"field": "img"},
         "xc": {"field": "layout_x"}, "yc": {"field": "layout_y"},
         "width": {"field": "iconWidth"}, "height": {"field": "iconHeight"}
       }
     }
   },
   {
     // Draw marks of a given color, shape, and size at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "data",
       "transform": [{ "type": "filter", "test": "!datum.img" }]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"},
         "y": {"field": "layout_y"},
         // If colorScaleField is set, use color scaling, otherwise use the preset color value
         "fill": { "field": "color" },
         "size": {"field": "size"},
         "shape": {"field": "shape"},
         "stroke": {"field": "strokeColor"}
       }
     }
   },
   {
     // Draw text with the given color and size at the [lan,lon] location
     // See https://github.com/vega/vega/wiki/Marks#text for all parameter description (prepend "text" and capitalize them)
     "type": "text",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.text" },
         // Figure out if this is an LTR or RTL page. For LTR, show label to the right of the icon, left-aligned. For RTL, reverse.
         { "type": "formula", "field":"isLTR", "expr": "'‎' == '\\u200E'" },
         // If these values are not defined ("undefined" is not allowed, so test for truthiness and not 0)
         { "type": "formula", "field":"textDx", "expr": "if(!datum.textDx && datum.textDx != 0, if(datum.isLTR,8,-8), datum.textDx)" },
         { "type": "formula", "field":"textAlign", "expr": "if(!datum.textAlign, if(datum.isLTR,'left','right'), datum.textAlign)" },
         { "type": "formula", "field":"textBaseline", "expr": "datum.textBaseline || 'middle'" }
     ]},
     "properties": {
       "enter": {
         "text": {"field": "text"},
         "x": {"field": "layout_x" },
         "y": {"field": "layout_y"},
         "dx": {"field": "textDx" },
         "dy": {"field": "textDy"},
         "fill": {"field": "textColor"},
         "align": {"field": "textAlign"},
         "baseline": {"field": "textBaseline"},
         "radius": {"field": "textRadius"},
         "theta": {"field": "textTheta"},
         "angle": {"field": "textAngle"},
         "font": {"field": "textFont"},
         "fontSize": {"field": "textFontSize"},
         "fontWeight": {"field": "textFontWeight"},
         "fontStyle": {"field": "textFontStyle"}
       }
     }
   },
   {
     // Draw a low-zoom locator map frame
     "type": "rect",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" }
       ]
     },
     "properties": {
       "enter": {
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth", "offset":2}, "height": {"signal": "picHeight"},
         "stroke": {"value":"#fff"},"strokeWidth": {"value":6}
       }
     }
   },
   {
     // Draw a low-zoom locator map by using a premade world map image
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"url", "expr": "1" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"value": "wikirawupload:"},
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth"}, "height": {"signal": "picHeight"}
       }
     }
   },
   {
     // Draw a zoom-out mark at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"lat", "expr": "imgLat" },
         { "type": "formula", "field":"lon", "expr": "imgLon" },
         {
           "type": "geo",
           "projection": "equirectangular",
           "scale": {"expr": "180/2/PI"},
           "translate": [{"expr": "picXC"}, {"expr": "picYC"}],
           "center": [{"expr": "0"}, {"expr": "0"}],
           "lon": "lon", "lat": "lat"
         }
       ]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"}, "y": {"field": "layout_y"},
         "fill": {"value": "#c33"},
         "stroke": {"value": "#ffe7e6"},
         "size": {"value": 40}
       }
     }
   }
 ]

} </graph>

The 'Llanfechell Triangle' standing stones are north-west of Llanfechell.
</source>
Code blank
Blank code for a single marker map Blank code with comments
<source lang="html">
<graph>

{

 //
 // ATTENTION: This code is maintained at https://www.mediawiki.org/wiki/Template:Graph:Street_map_with_marks
 //            Please do not modify it anywhere else, as it may get copied and override your changes.
 //            Suggestions can be made at https://www.mediawiki.org/wiki/Template_talk:Graph:Street_map_with_marks
 //
 // Template translation is in https://commons.wikimedia.org/wiki/Data:Original/Template:Graphs.tab
 //
 "version": 2, "width":, "height": , "padding": 0,
 "signals":[
   // These signals allow us to quickly move the map within the image, e.g. to leave space for the legend

{"name":"legendWidth", "init": {"expr": "0"} },

   {"name":"legendHeight", "init": {"expr": "height"} },
   {"name":"imgWidth", "init": {"expr": "width-legendWidth"} },
   {"name":"imgHeight", "init": {"expr": "height"} },
   {"name":"imgXC", "init": {"expr": "imgWidth/2"} },
   {"name":"imgYC", "init": {"expr": "imgHeight/2"} },
   {"name":"imgTileSize", "init": {"expr": "256"} },
   {"name":"imgLat", "init": {"expr": ""} },
   {"name":"imgLon", "init": {"expr": "Lua error: bad argument #1 to 'len' (string expected, got nil)."} },
   {"name":"imgZoom", "init": {"expr": ""} },
   {"name":"picWidth", "init": {"expr": "180"} },
   {"name":"picHeight", "init": {"expr": "picWidth/2"} },
   {"name":"picXC", "init": {"expr": "imgWidth-(picWidth/2)"} },
   {"name":"picYC", "init": {"expr": "imgHeight-(picHeight/2)"} },
   {"name":"showMiniMap", "init": {"expr": "0"} }
 ],
 "data": [
   {
     "name": "data",

// Otherwise use the first unnamed argument for source values

     "values": [  { "lat": , 
    "lon": Lua error: bad argument #1 to 'len' (string expected, got nil)., 
    "img": "wikirawupload:https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Mapscaleline.svg/120px-Mapscaleline.svg.png", 
    "width": 50, 
    "height": 8, 
    "offsetX": Expression error: Unexpected / operator., 
    "offsetY": Expression error: Unexpected / operator., 
    "textAlign": "right", 
    "textDx": 22, 
    "textDy": -2, 
    "textColor": "grey", 
    "textFont": "Tahoma", 
    "textFontSize": 9, 
    "text":  "Expression error: Unexpected < operator." }


, { "lat": 0.1, "lon": 0.1, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


}
















     ],
     "transform": [
       {
         "type": "geo",
         "projection": "mercator",
         "scale": {"expr": "imgTileSize/PI/2*pow(2,imgZoom)"},
         "translate": [{"expr": "imgXC"}, {"expr": "imgYC"}],
         "center": [{"expr": "imgLon"}, {"expr": "imgLat"}],
         "lon": "lon", "lat": "lat"
       },
       { "type": "formula", "field":"layout_x", "expr": "datum.layout_x + (datum.offsetX || 0)" },
       { "type": "formula", "field":"layout_y", "expr": "datum.layout_y + (datum.offsetY || 0)" },
       { "type": "formula", "field":"color", "expr": "datum.color || '#c33'" },
       { "type": "formula", "field":"textColor", "expr": "datum.textColor || datum.color" },
       { "type": "formula", "field":"strokeColor", "expr": "datum.strokeColor || '#ffe7e6'" }
     ]
   },
   {
     // Hack: single value data source for drawing/hiding images and other non-series elements
     "name": "dummyData",
     "values": [{}]
   }
 ],

// Legend only works if showLegend and colorScaleField are set

 "marks": [
   {
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "formula", "field":"url", "expr": "'mapsnapshot:///?width='+imgWidth+'&height='+imgHeight+'&zoom='+imgZoom+'&lat='+imgLat+'&lon='+imgLon" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"field": "url"},
         "xc": {"signal": "imgXC"}, "yc": {"signal": "imgYC"},
         "width": {"signal": "imgWidth"}, "height": {"signal": "imgHeight"}
       }
     }
   },
   {
     // Places an image of a given name and size at the [lan,lon] location
     "type": "image",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.img" },
         { "type": "formula", "field":"iconWidth", "expr": "datum.width || 0" },
         { "type": "formula", "field":"iconHeight", "expr": "datum.height || 0" },
         { "type": "formula", "field":"img",
           "expr": "if(!test(/^[a-z]+:\\/\\//, datum.img), 'wikifile:///'+datum.img, datum.img)" },
         // Ensure that either width or height parameter is passed to wikifile:// request
         { "type": "formula", "field":"img",
           "expr": "if((datum.iconWidth || datum.iconHeight) && !test(/[?&](width|height)=\\d/, datum.img),if(datum.iconWidth,datum.img+'?width='+datum.iconWidth,datum.img+'?height='+datum.iconHeight), datum.img)" }
     ]},
     "properties": {
       "enter": {
         "url": {"field": "img"},
         "xc": {"field": "layout_x"}, "yc": {"field": "layout_y"},
         "width": {"field": "iconWidth"}, "height": {"field": "iconHeight"}
       }
     }
   },
   {
     // Draw marks of a given color, shape, and size at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "data",
       "transform": [{ "type": "filter", "test": "!datum.img" }]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"},
         "y": {"field": "layout_y"},
         // If colorScaleField is set, use color scaling, otherwise use the preset color value
         "fill": { "field": "color" },
         "size": {"field": "size"},
         "shape": {"field": "shape"},
         "stroke": {"field": "strokeColor"}
       }
     }
   },
   {
     // Draw text with the given color and size at the [lan,lon] location
     // See https://github.com/vega/vega/wiki/Marks#text for all parameter description (prepend "text" and capitalize them)
     "type": "text",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.text" },
         // Figure out if this is an LTR or RTL page. For LTR, show label to the right of the icon, left-aligned. For RTL, reverse.
         { "type": "formula", "field":"isLTR", "expr": "'‎' == '\\u200E'" },
         // If these values are not defined ("undefined" is not allowed, so test for truthiness and not 0)
         { "type": "formula", "field":"textDx", "expr": "if(!datum.textDx && datum.textDx != 0, if(datum.isLTR,8,-8), datum.textDx)" },
         { "type": "formula", "field":"textAlign", "expr": "if(!datum.textAlign, if(datum.isLTR,'left','right'), datum.textAlign)" },
         { "type": "formula", "field":"textBaseline", "expr": "datum.textBaseline || 'middle'" }
     ]},
     "properties": {
       "enter": {
         "text": {"field": "text"},
         "x": {"field": "layout_x" },
         "y": {"field": "layout_y"},
         "dx": {"field": "textDx" },
         "dy": {"field": "textDy"},
         "fill": {"field": "textColor"},
         "align": {"field": "textAlign"},
         "baseline": {"field": "textBaseline"},
         "radius": {"field": "textRadius"},
         "theta": {"field": "textTheta"},
         "angle": {"field": "textAngle"},
         "font": {"field": "textFont"},
         "fontSize": {"field": "textFontSize"},
         "fontWeight": {"field": "textFontWeight"},
         "fontStyle": {"field": "textFontStyle"}
       }
     }
   },
   {
     // Draw a low-zoom locator map frame
     "type": "rect",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" }
       ]
     },
     "properties": {
       "enter": {
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth", "offset":2}, "height": {"signal": "picHeight"},
         "stroke": {"value":"#fff"},"strokeWidth": {"value":6}
       }
     }
   },
   {
     // Draw a low-zoom locator map by using a premade world map image
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"url", "expr": "1" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"value": "wikirawupload:"},
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth"}, "height": {"signal": "picHeight"}
       }
     }
   },
   {
     // Draw a zoom-out mark at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"lat", "expr": "imgLat" },
         { "type": "formula", "field":"lon", "expr": "imgLon" },
         {
           "type": "geo",
           "projection": "equirectangular",
           "scale": {"expr": "180/2/PI"},
           "translate": [{"expr": "picXC"}, {"expr": "picYC"}],
           "center": [{"expr": "0"}, {"expr": "0"}],
           "lon": "lon", "lat": "lat"
         }
       ]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"}, "y": {"field": "layout_y"},
         "fill": {"value": "#c33"},
         "stroke": {"value": "#ffe7e6"},
         "size": {"value": 40}
       }
     }
   }
 ]

} </graph>

<maplink> problems:

  • Couldn't parse JSON: Syntax error
  • Attribute "latitude" has an invalid value
  • Attribute "longitude" has an invalid value
</source>
<source lang="html">
<graph>

{

 //
 // ATTENTION: This code is maintained at https://www.mediawiki.org/wiki/Template:Graph:Street_map_with_marks
 //            Please do not modify it anywhere else, as it may get copied and override your changes.
 //            Suggestions can be made at https://www.mediawiki.org/wiki/Template_talk:Graph:Street_map_with_marks
 //
 // Template translation is in https://commons.wikimedia.org/wiki/Data:Original/Template:Graphs.tab
 //
 "version": 2, "width":, "height": , "padding": 0,
 "signals":[
   // These signals allow us to quickly move the map within the image, e.g. to leave space for the legend

{"name":"legendWidth", "init": {"expr": "0"} },

   {"name":"legendHeight", "init": {"expr": "height"} },
   {"name":"imgWidth", "init": {"expr": "width-legendWidth"} },
   {"name":"imgHeight", "init": {"expr": "height"} },
   {"name":"imgXC", "init": {"expr": "imgWidth/2"} },
   {"name":"imgYC", "init": {"expr": "imgHeight/2"} },
   {"name":"imgTileSize", "init": {"expr": "256"} },
   {"name":"imgLat", "init": {"expr": ""} },
   {"name":"imgLon", "init": {"expr": "Lua error: bad argument #1 to 'len' (string expected, got nil)."} },
   {"name":"imgZoom", "init": {"expr": ""} },
   {"name":"picWidth", "init": {"expr": "180"} },
   {"name":"picHeight", "init": {"expr": "picWidth/2"} },
   {"name":"picXC", "init": {"expr": "imgWidth-(picWidth/2)"} },
   {"name":"picYC", "init": {"expr": "imgHeight-(picHeight/2)"} },
   {"name":"showMiniMap", "init": {"expr": "0"} }
 ],
 "data": [
   {
     "name": "data",

// Otherwise use the first unnamed argument for source values

     "values": [  { "lat": , 
    "lon": Lua error: bad argument #1 to 'len' (string expected, got nil)., 
    "img": "wikirawupload:https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Mapscaleline.svg/120px-Mapscaleline.svg.png", 
    "width": 50, 
    "height": 8, 
    "offsetX": Expression error: Unexpected / operator., 
    "offsetY": Expression error: Unexpected / operator., 
    "textAlign": "right", 
    "textDx": 22, 
    "textDy": -2, 
    "textColor": "grey", 
    "textFont": "Tahoma", 
    "textFontSize": 9, 
    "text":  "Expression error: Unexpected < operator." }

, { "lat": 0, "lon": 0, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


}


, { "lat": 0.1, "lon": 0.1, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


}
















     ],
     "transform": [
       {
         "type": "geo",
         "projection": "mercator",
         "scale": {"expr": "imgTileSize/PI/2*pow(2,imgZoom)"},
         "translate": [{"expr": "imgXC"}, {"expr": "imgYC"}],
         "center": [{"expr": "imgLon"}, {"expr": "imgLat"}],
         "lon": "lon", "lat": "lat"
       },
       { "type": "formula", "field":"layout_x", "expr": "datum.layout_x + (datum.offsetX || 0)" },
       { "type": "formula", "field":"layout_y", "expr": "datum.layout_y + (datum.offsetY || 0)" },
       { "type": "formula", "field":"color", "expr": "datum.color || '#c33'" },
       { "type": "formula", "field":"textColor", "expr": "datum.textColor || datum.color" },
       { "type": "formula", "field":"strokeColor", "expr": "datum.strokeColor || '#ffe7e6'" }
     ]
   },
   {
     // Hack: single value data source for drawing/hiding images and other non-series elements
     "name": "dummyData",
     "values": [{}]
   }
 ],

// Legend only works if showLegend and colorScaleField are set

 "marks": [
   {
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "formula", "field":"url", "expr": "'mapsnapshot:///?width='+imgWidth+'&height='+imgHeight+'&zoom='+imgZoom+'&lat='+imgLat+'&lon='+imgLon" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"field": "url"},
         "xc": {"signal": "imgXC"}, "yc": {"signal": "imgYC"},
         "width": {"signal": "imgWidth"}, "height": {"signal": "imgHeight"}
       }
     }
   },
   {
     // Places an image of a given name and size at the [lan,lon] location
     "type": "image",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.img" },
         { "type": "formula", "field":"iconWidth", "expr": "datum.width || 0" },
         { "type": "formula", "field":"iconHeight", "expr": "datum.height || 0" },
         { "type": "formula", "field":"img",
           "expr": "if(!test(/^[a-z]+:\\/\\//, datum.img), 'wikifile:///'+datum.img, datum.img)" },
         // Ensure that either width or height parameter is passed to wikifile:// request
         { "type": "formula", "field":"img",
           "expr": "if((datum.iconWidth || datum.iconHeight) && !test(/[?&](width|height)=\\d/, datum.img),if(datum.iconWidth,datum.img+'?width='+datum.iconWidth,datum.img+'?height='+datum.iconHeight), datum.img)" }
     ]},
     "properties": {
       "enter": {
         "url": {"field": "img"},
         "xc": {"field": "layout_x"}, "yc": {"field": "layout_y"},
         "width": {"field": "iconWidth"}, "height": {"field": "iconHeight"}
       }
     }
   },
   {
     // Draw marks of a given color, shape, and size at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "data",
       "transform": [{ "type": "filter", "test": "!datum.img" }]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"},
         "y": {"field": "layout_y"},
         // If colorScaleField is set, use color scaling, otherwise use the preset color value
         "fill": { "field": "color" },
         "size": {"field": "size"},
         "shape": {"field": "shape"},
         "stroke": {"field": "strokeColor"}
       }
     }
   },
   {
     // Draw text with the given color and size at the [lan,lon] location
     // See https://github.com/vega/vega/wiki/Marks#text for all parameter description (prepend "text" and capitalize them)
     "type": "text",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.text" },
         // Figure out if this is an LTR or RTL page. For LTR, show label to the right of the icon, left-aligned. For RTL, reverse.
         { "type": "formula", "field":"isLTR", "expr": "'‎' == '\\u200E'" },
         // If these values are not defined ("undefined" is not allowed, so test for truthiness and not 0)
         { "type": "formula", "field":"textDx", "expr": "if(!datum.textDx && datum.textDx != 0, if(datum.isLTR,8,-8), datum.textDx)" },
         { "type": "formula", "field":"textAlign", "expr": "if(!datum.textAlign, if(datum.isLTR,'left','right'), datum.textAlign)" },
         { "type": "formula", "field":"textBaseline", "expr": "datum.textBaseline || 'middle'" }
     ]},
     "properties": {
       "enter": {
         "text": {"field": "text"},
         "x": {"field": "layout_x" },
         "y": {"field": "layout_y"},
         "dx": {"field": "textDx" },
         "dy": {"field": "textDy"},
         "fill": {"field": "textColor"},
         "align": {"field": "textAlign"},
         "baseline": {"field": "textBaseline"},
         "radius": {"field": "textRadius"},
         "theta": {"field": "textTheta"},
         "angle": {"field": "textAngle"},
         "font": {"field": "textFont"},
         "fontSize": {"field": "textFontSize"},
         "fontWeight": {"field": "textFontWeight"},
         "fontStyle": {"field": "textFontStyle"}
       }
     }
   },
   {
     // Draw a low-zoom locator map frame
     "type": "rect",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" }
       ]
     },
     "properties": {
       "enter": {
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth", "offset":2}, "height": {"signal": "picHeight"},
         "stroke": {"value":"#fff"},"strokeWidth": {"value":6}
       }
     }
   },
   {
     // Draw a low-zoom locator map by using a premade world map image
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"url", "expr": "1" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"value": "wikirawupload:"},
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth"}, "height": {"signal": "picHeight"}
       }
     }
   },
   {
     // Draw a zoom-out mark at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"lat", "expr": "imgLat" },
         { "type": "formula", "field":"lon", "expr": "imgLon" },
         {
           "type": "geo",
           "projection": "equirectangular",
           "scale": {"expr": "180/2/PI"},
           "translate": [{"expr": "picXC"}, {"expr": "picYC"}],
           "center": [{"expr": "0"}, {"expr": "0"}],
           "lon": "lon", "lat": "lat"
         }
       ]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"}, "y": {"field": "layout_y"},
         "fill": {"value": "#c33"},
         "stroke": {"value": "#ffe7e6"},
         "size": {"value": 40}
       }
     }
   }
 ]

} </graph>

<maplink> problems:

  • Attribute "latitude" has an invalid value
  • Attribute "longitude" has an invalid value
</source>

Multiple markers, labels and images

In addition to the un-numbered mark parameter set, there are 30 numbered ones. These are otherwise identical to the one above, but the name terminates in a number (1-30). Each mark and label has its own set of parameters (|mark1=, |mark-coord1=, |label1=, |label-pos1= etc...|mark2=, |mark-coord2=, |label2=, |label-pos2= etc.) Values can be inherited either from the 'mark1 master parameter set', or from a special 'markD' Default set that provides overide defaults. When set, these values are inherited by the other numbered sets to avoid having to repeat for each, whilst they can still be set individually where required.

Multiple markers

Example title
<graph>

{

 //
 // ATTENTION: This code is maintained at https://www.mediawiki.org/wiki/Template:Graph:Street_map_with_marks
 //            Please do not modify it anywhere else, as it may get copied and override your changes.
 //            Suggestions can be made at https://www.mediawiki.org/wiki/Template_talk:Graph:Street_map_with_marks
 //
 // Template translation is in https://commons.wikimedia.org/wiki/Data:Original/Template:Graphs.tab
 //
 "version": 2, "width":, "height": , "padding": 0,
 "signals":[
   // These signals allow us to quickly move the map within the image, e.g. to leave space for the legend

{"name":"legendWidth", "init": {"expr": "0"} },

   {"name":"legendHeight", "init": {"expr": "height"} },
   {"name":"imgWidth", "init": {"expr": "width-legendWidth"} },
   {"name":"imgHeight", "init": {"expr": "height"} },
   {"name":"imgXC", "init": {"expr": "imgWidth/2"} },
   {"name":"imgYC", "init": {"expr": "imgHeight/2"} },
   {"name":"imgTileSize", "init": {"expr": "256"} },
   {"name":"imgLat", "init": {"expr": "53.395"} },
   {"name":"imgLon", "init": {"expr": "-4.452"} },
   {"name":"imgZoom", "init": {"expr": ""} },
   {"name":"picWidth", "init": {"expr": "180"} },
   {"name":"picHeight", "init": {"expr": "picWidth/2"} },
   {"name":"picXC", "init": {"expr": "imgWidth-(picWidth/2)"} },
   {"name":"picYC", "init": {"expr": "imgHeight-(picHeight/2)"} },
   {"name":"showMiniMap", "init": {"expr": "0"} }
 ],
 "data": [
   {
     "name": "data",

// Otherwise use the first unnamed argument for source values

     "values": [  { "lat": 53.395, 
    "lon": -4.452, 
    "img": "wikirawupload:https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Mapscaleline.svg/120px-Mapscaleline.svg.png", 
    "width": 50, 
    "height": 8, 
    "offsetX": Expression error: Unexpected / operator., 
    "offsetY": Expression error: Unexpected / operator., 
    "textAlign": "right", 
    "textDx": 22, 
    "textDy": -2, 
    "textColor": "grey", 
    "textFont": "Tahoma", 
    "textFontSize": 9, 
    "text":  "10 000km" }

, { "lat": 0, "lon": 0, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


}


, { "lat": 53.3964, "lon": -4.4531, Expression error: Unexpected = operator. "text": "Baron Hill Maen Hir", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755"


} , { "lat": 53.3966, "lon": -4.46204, Expression error: Unexpected = operator. "text": "Llanfechell Triangle", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755"


}
















     ],
     "transform": [
       {
         "type": "geo",
         "projection": "mercator",
         "scale": {"expr": "imgTileSize/PI/2*pow(2,imgZoom)"},
         "translate": [{"expr": "imgXC"}, {"expr": "imgYC"}],
         "center": [{"expr": "imgLon"}, {"expr": "imgLat"}],
         "lon": "lon", "lat": "lat"
       },
       { "type": "formula", "field":"layout_x", "expr": "datum.layout_x + (datum.offsetX || 0)" },
       { "type": "formula", "field":"layout_y", "expr": "datum.layout_y + (datum.offsetY || 0)" },
       { "type": "formula", "field":"color", "expr": "datum.color || '#c33'" },
       { "type": "formula", "field":"textColor", "expr": "datum.textColor || datum.color" },
       { "type": "formula", "field":"strokeColor", "expr": "datum.strokeColor || '#ffe7e6'" }
     ]
   },
   {
     // Hack: single value data source for drawing/hiding images and other non-series elements
     "name": "dummyData",
     "values": [{}]
   }
 ],

// Legend only works if showLegend and colorScaleField are set

 "marks": [
   {
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "formula", "field":"url", "expr": "'mapsnapshot:///?width='+imgWidth+'&height='+imgHeight+'&zoom='+imgZoom+'&lat='+imgLat+'&lon='+imgLon" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"field": "url"},
         "xc": {"signal": "imgXC"}, "yc": {"signal": "imgYC"},
         "width": {"signal": "imgWidth"}, "height": {"signal": "imgHeight"}
       }
     }
   },
   {
     // Places an image of a given name and size at the [lan,lon] location
     "type": "image",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.img" },
         { "type": "formula", "field":"iconWidth", "expr": "datum.width || 0" },
         { "type": "formula", "field":"iconHeight", "expr": "datum.height || 0" },
         { "type": "formula", "field":"img",
           "expr": "if(!test(/^[a-z]+:\\/\\//, datum.img), 'wikifile:///'+datum.img, datum.img)" },
         // Ensure that either width or height parameter is passed to wikifile:// request
         { "type": "formula", "field":"img",
           "expr": "if((datum.iconWidth || datum.iconHeight) && !test(/[?&](width|height)=\\d/, datum.img),if(datum.iconWidth,datum.img+'?width='+datum.iconWidth,datum.img+'?height='+datum.iconHeight), datum.img)" }
     ]},
     "properties": {
       "enter": {
         "url": {"field": "img"},
         "xc": {"field": "layout_x"}, "yc": {"field": "layout_y"},
         "width": {"field": "iconWidth"}, "height": {"field": "iconHeight"}
       }
     }
   },
   {
     // Draw marks of a given color, shape, and size at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "data",
       "transform": [{ "type": "filter", "test": "!datum.img" }]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"},
         "y": {"field": "layout_y"},
         // If colorScaleField is set, use color scaling, otherwise use the preset color value
         "fill": { "field": "color" },
         "size": {"field": "size"},
         "shape": {"field": "shape"},
         "stroke": {"field": "strokeColor"}
       }
     }
   },
   {
     // Draw text with the given color and size at the [lan,lon] location
     // See https://github.com/vega/vega/wiki/Marks#text for all parameter description (prepend "text" and capitalize them)
     "type": "text",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.text" },
         // Figure out if this is an LTR or RTL page. For LTR, show label to the right of the icon, left-aligned. For RTL, reverse.
         { "type": "formula", "field":"isLTR", "expr": "'‎' == '\\u200E'" },
         // If these values are not defined ("undefined" is not allowed, so test for truthiness and not 0)
         { "type": "formula", "field":"textDx", "expr": "if(!datum.textDx && datum.textDx != 0, if(datum.isLTR,8,-8), datum.textDx)" },
         { "type": "formula", "field":"textAlign", "expr": "if(!datum.textAlign, if(datum.isLTR,'left','right'), datum.textAlign)" },
         { "type": "formula", "field":"textBaseline", "expr": "datum.textBaseline || 'middle'" }
     ]},
     "properties": {
       "enter": {
         "text": {"field": "text"},
         "x": {"field": "layout_x" },
         "y": {"field": "layout_y"},
         "dx": {"field": "textDx" },
         "dy": {"field": "textDy"},
         "fill": {"field": "textColor"},
         "align": {"field": "textAlign"},
         "baseline": {"field": "textBaseline"},
         "radius": {"field": "textRadius"},
         "theta": {"field": "textTheta"},
         "angle": {"field": "textAngle"},
         "font": {"field": "textFont"},
         "fontSize": {"field": "textFontSize"},
         "fontWeight": {"field": "textFontWeight"},
         "fontStyle": {"field": "textFontStyle"}
       }
     }
   },
   {
     // Draw a low-zoom locator map frame
     "type": "rect",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" }
       ]
     },
     "properties": {
       "enter": {
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth", "offset":2}, "height": {"signal": "picHeight"},
         "stroke": {"value":"#fff"},"strokeWidth": {"value":6}
       }
     }
   },
   {
     // Draw a low-zoom locator map by using a premade world map image
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"url", "expr": "1" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"value": "wikirawupload:"},
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth"}, "height": {"signal": "picHeight"}
       }
     }
   },
   {
     // Draw a zoom-out mark at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"lat", "expr": "imgLat" },
         { "type": "formula", "field":"lon", "expr": "imgLon" },
         {
           "type": "geo",
           "projection": "equirectangular",
           "scale": {"expr": "180/2/PI"},
           "translate": [{"expr": "picXC"}, {"expr": "picYC"}],
           "center": [{"expr": "0"}, {"expr": "0"}],
           "lon": "lon", "lat": "lat"
         }
       ]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"}, "y": {"field": "layout_y"},
         "fill": {"value": "#c33"},
         "stroke": {"value": "#ffe7e6"},
         "size": {"value": 40}
       }
     }
   }
 ]

} </graph>

Scheduled monuments around Llanfechell, Anglesey
Example code for the two-marker map one the right:
<source lang="html">
Example title
<graph>

{

 //
 // ATTENTION: This code is maintained at https://www.mediawiki.org/wiki/Template:Graph:Street_map_with_marks
 //            Please do not modify it anywhere else, as it may get copied and override your changes.
 //            Suggestions can be made at https://www.mediawiki.org/wiki/Template_talk:Graph:Street_map_with_marks
 //
 // Template translation is in https://commons.wikimedia.org/wiki/Data:Original/Template:Graphs.tab
 //
 "version": 2, "width":, "height": , "padding": 0,
 "signals":[
   // These signals allow us to quickly move the map within the image, e.g. to leave space for the legend

{"name":"legendWidth", "init": {"expr": "0"} },

   {"name":"legendHeight", "init": {"expr": "height"} },
   {"name":"imgWidth", "init": {"expr": "width-legendWidth"} },
   {"name":"imgHeight", "init": {"expr": "height"} },
   {"name":"imgXC", "init": {"expr": "imgWidth/2"} },
   {"name":"imgYC", "init": {"expr": "imgHeight/2"} },
   {"name":"imgTileSize", "init": {"expr": "256"} },
   {"name":"imgLat", "init": {"expr": "53.395"} },
   {"name":"imgLon", "init": {"expr": "-4.452"} },
   {"name":"imgZoom", "init": {"expr": ""} },
   {"name":"picWidth", "init": {"expr": "180"} },
   {"name":"picHeight", "init": {"expr": "picWidth/2"} },
   {"name":"picXC", "init": {"expr": "imgWidth-(picWidth/2)"} },
   {"name":"picYC", "init": {"expr": "imgHeight-(picHeight/2)"} },
   {"name":"showMiniMap", "init": {"expr": "0"} }
 ],
 "data": [
   {
     "name": "data",

// Otherwise use the first unnamed argument for source values

     "values": [  { "lat": 53.395, 
    "lon": -4.452, 
    "img": "wikirawupload:https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Mapscaleline.svg/120px-Mapscaleline.svg.png", 
    "width": 50, 
    "height": 8, 
    "offsetX": Expression error: Unexpected / operator., 
    "offsetY": Expression error: Unexpected / operator., 
    "textAlign": "right", 
    "textDx": 22, 
    "textDy": -2, 
    "textColor": "grey", 
    "textFont": "Tahoma", 
    "textFontSize": 9, 
    "text":  "10 000km" }

, { "lat": 0, "lon": 0, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


}


, { "lat": 53.3964, "lon": -4.4531, Expression error: Unexpected = operator. "text": "Baron Hill Maen Hir", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755"


} , { "lat": 53.3966, "lon": -4.46204, Expression error: Unexpected = operator. "text": "Llanfechell Triangle", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755"


}
















     ],
     "transform": [
       {
         "type": "geo",
         "projection": "mercator",
         "scale": {"expr": "imgTileSize/PI/2*pow(2,imgZoom)"},
         "translate": [{"expr": "imgXC"}, {"expr": "imgYC"}],
         "center": [{"expr": "imgLon"}, {"expr": "imgLat"}],
         "lon": "lon", "lat": "lat"
       },
       { "type": "formula", "field":"layout_x", "expr": "datum.layout_x + (datum.offsetX || 0)" },
       { "type": "formula", "field":"layout_y", "expr": "datum.layout_y + (datum.offsetY || 0)" },
       { "type": "formula", "field":"color", "expr": "datum.color || '#c33'" },
       { "type": "formula", "field":"textColor", "expr": "datum.textColor || datum.color" },
       { "type": "formula", "field":"strokeColor", "expr": "datum.strokeColor || '#ffe7e6'" }
     ]
   },
   {
     // Hack: single value data source for drawing/hiding images and other non-series elements
     "name": "dummyData",
     "values": [{}]
   }
 ],

// Legend only works if showLegend and colorScaleField are set

 "marks": [
   {
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "formula", "field":"url", "expr": "'mapsnapshot:///?width='+imgWidth+'&height='+imgHeight+'&zoom='+imgZoom+'&lat='+imgLat+'&lon='+imgLon" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"field": "url"},
         "xc": {"signal": "imgXC"}, "yc": {"signal": "imgYC"},
         "width": {"signal": "imgWidth"}, "height": {"signal": "imgHeight"}
       }
     }
   },
   {
     // Places an image of a given name and size at the [lan,lon] location
     "type": "image",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.img" },
         { "type": "formula", "field":"iconWidth", "expr": "datum.width || 0" },
         { "type": "formula", "field":"iconHeight", "expr": "datum.height || 0" },
         { "type": "formula", "field":"img",
           "expr": "if(!test(/^[a-z]+:\\/\\//, datum.img), 'wikifile:///'+datum.img, datum.img)" },
         // Ensure that either width or height parameter is passed to wikifile:// request
         { "type": "formula", "field":"img",
           "expr": "if((datum.iconWidth || datum.iconHeight) && !test(/[?&](width|height)=\\d/, datum.img),if(datum.iconWidth,datum.img+'?width='+datum.iconWidth,datum.img+'?height='+datum.iconHeight), datum.img)" }
     ]},
     "properties": {
       "enter": {
         "url": {"field": "img"},
         "xc": {"field": "layout_x"}, "yc": {"field": "layout_y"},
         "width": {"field": "iconWidth"}, "height": {"field": "iconHeight"}
       }
     }
   },
   {
     // Draw marks of a given color, shape, and size at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "data",
       "transform": [{ "type": "filter", "test": "!datum.img" }]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"},
         "y": {"field": "layout_y"},
         // If colorScaleField is set, use color scaling, otherwise use the preset color value
         "fill": { "field": "color" },
         "size": {"field": "size"},
         "shape": {"field": "shape"},
         "stroke": {"field": "strokeColor"}
       }
     }
   },
   {
     // Draw text with the given color and size at the [lan,lon] location
     // See https://github.com/vega/vega/wiki/Marks#text for all parameter description (prepend "text" and capitalize them)
     "type": "text",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.text" },
         // Figure out if this is an LTR or RTL page. For LTR, show label to the right of the icon, left-aligned. For RTL, reverse.
         { "type": "formula", "field":"isLTR", "expr": "'‎' == '\\u200E'" },
         // If these values are not defined ("undefined" is not allowed, so test for truthiness and not 0)
         { "type": "formula", "field":"textDx", "expr": "if(!datum.textDx && datum.textDx != 0, if(datum.isLTR,8,-8), datum.textDx)" },
         { "type": "formula", "field":"textAlign", "expr": "if(!datum.textAlign, if(datum.isLTR,'left','right'), datum.textAlign)" },
         { "type": "formula", "field":"textBaseline", "expr": "datum.textBaseline || 'middle'" }
     ]},
     "properties": {
       "enter": {
         "text": {"field": "text"},
         "x": {"field": "layout_x" },
         "y": {"field": "layout_y"},
         "dx": {"field": "textDx" },
         "dy": {"field": "textDy"},
         "fill": {"field": "textColor"},
         "align": {"field": "textAlign"},
         "baseline": {"field": "textBaseline"},
         "radius": {"field": "textRadius"},
         "theta": {"field": "textTheta"},
         "angle": {"field": "textAngle"},
         "font": {"field": "textFont"},
         "fontSize": {"field": "textFontSize"},
         "fontWeight": {"field": "textFontWeight"},
         "fontStyle": {"field": "textFontStyle"}
       }
     }
   },
   {
     // Draw a low-zoom locator map frame
     "type": "rect",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" }
       ]
     },
     "properties": {
       "enter": {
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth", "offset":2}, "height": {"signal": "picHeight"},
         "stroke": {"value":"#fff"},"strokeWidth": {"value":6}
       }
     }
   },
   {
     // Draw a low-zoom locator map by using a premade world map image
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"url", "expr": "1" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"value": "wikirawupload:"},
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth"}, "height": {"signal": "picHeight"}
       }
     }
   },
   {
     // Draw a zoom-out mark at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"lat", "expr": "imgLat" },
         { "type": "formula", "field":"lon", "expr": "imgLon" },
         {
           "type": "geo",
           "projection": "equirectangular",
           "scale": {"expr": "180/2/PI"},
           "translate": [{"expr": "picXC"}, {"expr": "picYC"}],
           "center": [{"expr": "0"}, {"expr": "0"}],
           "lon": "lon", "lat": "lat"
         }
       ]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"}, "y": {"field": "layout_y"},
         "fill": {"value": "#c33"},
         "stroke": {"value": "#ffe7e6"},
         "size": {"value": 40}
       }
     }
   }
 ]

} </graph>

Scheduled monuments around Llanfechell, Anglesey
</source>

Inherited values

To minimise repetion of code, there is a sliding scale of inheritance that applies to each value in each parameter set. For example, if label-size4=16 is set, that will always take precedence. If label-size4 has not been set, it will inherit the value from the special Default setting (defined using label-sizeD= ). If no Default has been set, it will inherit the value set by the 'master parameter set', label-size1=. If that is also undefined it will fall back to the underlying default, which in the case of label-size is 12. The same is true of all the variables relating to marks and labels, (although not to the coordinates, labels themselves, or mark-titles, which are always unique to the particular mark they relate to.)

Adding a Minimap in the corner

Many pages with info-boxes already include a locator map to give readers a proper sense of where the topic or place is located within a broader area. The underling 'Graph' module that OSM Location map uses offers a built-in map of the world option, which will act as a mini locator map and automatically adds a red locator dot (minimap = on). Unfortunately it is too general for most purposes, so an alternative is to make use of an existing 'Location map' file. This can be seen in the Llanfechell map example, however it is not very automated. The width and height of the Location map both have to be decided upon, specified (and calculated so as to not distort the map dimensions). Some location maps may already highlight the feature, but if not, an optional locator 'pog' can be placed by specifying the minipog-x and -y values, using the same scale values as mini-width and -height. With an origin in the top left of the minimap, the minipog can be placed over the relevant point on the minimap.

<source lang="html">
minimap = file mini-file = Wales relief location map.jpg mini-width = 70 mini-height = 90 minipog-x = 25 minipog-y = 4 scalemark = 66

</source>

If the area of the actual map is a large portion of the mini-map, an open red box can be included instead of a dot, so as to show the bounds of the main map. To use this feature, simply specify the width of the required box: minimap-boxwidth=xx where xx = the pixel width of the box. In general anything much below xx=15 will be better served by a dot. The required width will require some trial and error to pin down. The box height is then matched in proportion to the actual map.


Text on an arc

Text for broader geographic features can be placed around an arc, to convey a sense of a broader area, or to follow the curve of a river, mountain range, coastline, etc. This works entirely separately from the other labels. It does not attach itself to any mark or dot, and does not create any fullscreen markers. It requires coordinates for the first letter, parameters for the starting angle, radius of arc and gap between letters. Text size and color can also be specified, or inherited from Default settings.

Blank starter-code for text on an arcs, with starter-examples for different arc-patterns.
arc-coordA=Coordinates: Unable to parse latitude as a number:xxx
{{#coordinates:}}: invalid latitude
arc-textA= arc-angleA= arc-gapA= arc-radiusA= arc-text-sizeA = arc-text-colorA= ellipse-factorA=1.0

</source>

Details about using artc-text, with starter-examples for different arc-patterns.
The nature of the earth's coordinate system means that there will be some variation in an arc at different latitudes and at different zoom levels. The program makes corrections for this, but there will still be residual variation. Similarly, changes in radius will also have some effect on the gap size, with a larger radius opening out the gap somewhat. There will therefore need to be considerable trial and correction to get the shape and effect desired. As a general rule, identify the coordinates of the required start-point, then choose a starter-pattern from the selection below, and then adjust parameters to fit the requirement of the map.
Shallow smile:
<graph>

{

 //
 // ATTENTION: This code is maintained at https://www.mediawiki.org/wiki/Template:Graph:Street_map_with_marks
 //            Please do not modify it anywhere else, as it may get copied and override your changes.
 //            Suggestions can be made at https://www.mediawiki.org/wiki/Template_talk:Graph:Street_map_with_marks
 //
 // Template translation is in https://commons.wikimedia.org/wiki/Data:Original/Template:Graphs.tab
 //
 "version": 2, "width":, "height": , "padding": 0,
 "signals":[
   // These signals allow us to quickly move the map within the image, e.g. to leave space for the legend

{"name":"legendWidth", "init": {"expr": "0"} },

   {"name":"legendHeight", "init": {"expr": "height"} },
   {"name":"imgWidth", "init": {"expr": "width-legendWidth"} },
   {"name":"imgHeight", "init": {"expr": "height"} },
   {"name":"imgXC", "init": {"expr": "imgWidth/2"} },
   {"name":"imgYC", "init": {"expr": "imgHeight/2"} },
   {"name":"imgTileSize", "init": {"expr": "256"} },
   {"name":"imgLat", "init": {"expr": "53.6146"} },
   {"name":"imgLon", "init": {"expr": "-4.3341"} },
   {"name":"imgZoom", "init": {"expr": ""} },
   {"name":"picWidth", "init": {"expr": "180"} },
   {"name":"picHeight", "init": {"expr": "picWidth/2"} },
   {"name":"picXC", "init": {"expr": "imgWidth-(picWidth/2)"} },
   {"name":"picYC", "init": {"expr": "imgHeight-(picHeight/2)"} },
   {"name":"showMiniMap", "init": {"expr": "0"} }
 ],
 "data": [
   {
     "name": "data",

// Otherwise use the first unnamed argument for source values

     "values": [  { "lat": 53.6146, 
    "lon": -4.3341, 
    "img": "wikirawupload:https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Mapscaleline.svg/120px-Mapscaleline.svg.png", 
    "width": 50, 
    "height": 8, 
    "offsetX": Expression error: Unexpected / operator., 
    "offsetY": Expression error: Unexpected / operator., 
    "textAlign": "right", 
    "textDx": 22, 
    "textDy": -2, 
    "textColor": "grey", 
    "textFont": "Tahoma", 
    "textFontSize": 9, 
    "text":  "10 000km" }

, { "lat": 0, "lon": 0, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


} , { "lat": 53.6146, "lon": -4.33821, "size": "0", "text": "S", "textAngle": -350, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614578530263, "lon": -4.3379969582577, "size": "0", "text": "h", "textAngle": -350.66901072399, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.61455853389, "lon": -4.3377835073815, "size": "0", "text": "a", "textAngle": -351.33802144799, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614540013608, "lon": -4.3375696764729, "size": "0", "text": "l", "textAngle": -352.00703217198, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614522971941, "lon": -4.3373554946852, "size": "0", "text": "l", "textAngle": -352.67604289597, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614507411214, "lon": -4.3371409912192, "size": "0", "text": "o", "textAngle": -353.34505361996, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614493333548, "lon": -4.33692619532, "size": "0", "text": "w", "textAngle": -354.01406434396, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614480740861, "lon": -4.3367111362723, "size": "0", "text": "", "textAngle": -354.68307506795, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614469634871, "lon": -4.3364958433968, "size": "0", "text": "S", "textAngle": -355.35208579194, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614460017093, "lon": -4.3362803460461, "size": "0", "text": "m", "textAngle": -356.02109651593, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614451888837, "lon": -4.3360646736004, "size": "0", "text": "i", "textAngle": -356.69010723993, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614445251211, "lon": -4.3358488554642, "size": "0", "text": "l", "textAngle": -357.35911796392, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614440105121, "lon": -4.3356329210616, "size": "0", "text": "e", "textAngle": -358.02812868791, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.614436451267, "lon": -4.3354168998325, "size": "0", "text": "", "textAngle": -358.6971394119, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.614434290149, "lon": -4.3352008212288, "size": "0", "text": "", "textAngle": -359.3661501359, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614433622061, "lon": -4.3349847147101, "size": "0", "text": "", "textAngle": -360.03516085989, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614434447094, "lon": -4.33476860974, "size": "0", "text": "", "textAngle": -360.70417158388, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614436765135, "lon": -4.3345525357817, "size": "0", "text": "", "textAngle": -361.37318230787, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.614440575869, "lon": -4.3343365222942, "size": "0", "text": "", "textAngle": -362.04219303187, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.614445878776, "lon": -4.3341205987282, "size": "0", "text": "", "textAngle": -362.71120375586, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.614452673132, "lon": -4.3339047945224, "size": "0", "text": "", "textAngle": -363.38021447985, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}


, { "lat": 0.1, "lon": 0.1, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


}
















     ],
     "transform": [
       {
         "type": "geo",
         "projection": "mercator",
         "scale": {"expr": "imgTileSize/PI/2*pow(2,imgZoom)"},
         "translate": [{"expr": "imgXC"}, {"expr": "imgYC"}],
         "center": [{"expr": "imgLon"}, {"expr": "imgLat"}],
         "lon": "lon", "lat": "lat"
       },
       { "type": "formula", "field":"layout_x", "expr": "datum.layout_x + (datum.offsetX || 0)" },
       { "type": "formula", "field":"layout_y", "expr": "datum.layout_y + (datum.offsetY || 0)" },
       { "type": "formula", "field":"color", "expr": "datum.color || '#c33'" },
       { "type": "formula", "field":"textColor", "expr": "datum.textColor || datum.color" },
       { "type": "formula", "field":"strokeColor", "expr": "datum.strokeColor || '#ffe7e6'" }
     ]
   },
   {
     // Hack: single value data source for drawing/hiding images and other non-series elements
     "name": "dummyData",
     "values": [{}]
   }
 ],

// Legend only works if showLegend and colorScaleField are set

 "marks": [
   {
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "formula", "field":"url", "expr": "'mapsnapshot:///?width='+imgWidth+'&height='+imgHeight+'&zoom='+imgZoom+'&lat='+imgLat+'&lon='+imgLon" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"field": "url"},
         "xc": {"signal": "imgXC"}, "yc": {"signal": "imgYC"},
         "width": {"signal": "imgWidth"}, "height": {"signal": "imgHeight"}
       }
     }
   },
   {
     // Places an image of a given name and size at the [lan,lon] location
     "type": "image",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.img" },
         { "type": "formula", "field":"iconWidth", "expr": "datum.width || 0" },
         { "type": "formula", "field":"iconHeight", "expr": "datum.height || 0" },
         { "type": "formula", "field":"img",
           "expr": "if(!test(/^[a-z]+:\\/\\//, datum.img), 'wikifile:///'+datum.img, datum.img)" },
         // Ensure that either width or height parameter is passed to wikifile:// request
         { "type": "formula", "field":"img",
           "expr": "if((datum.iconWidth || datum.iconHeight) && !test(/[?&](width|height)=\\d/, datum.img),if(datum.iconWidth,datum.img+'?width='+datum.iconWidth,datum.img+'?height='+datum.iconHeight), datum.img)" }
     ]},
     "properties": {
       "enter": {
         "url": {"field": "img"},
         "xc": {"field": "layout_x"}, "yc": {"field": "layout_y"},
         "width": {"field": "iconWidth"}, "height": {"field": "iconHeight"}
       }
     }
   },
   {
     // Draw marks of a given color, shape, and size at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "data",
       "transform": [{ "type": "filter", "test": "!datum.img" }]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"},
         "y": {"field": "layout_y"},
         // If colorScaleField is set, use color scaling, otherwise use the preset color value
         "fill": { "field": "color" },
         "size": {"field": "size"},
         "shape": {"field": "shape"},
         "stroke": {"field": "strokeColor"}
       }
     }
   },
   {
     // Draw text with the given color and size at the [lan,lon] location
     // See https://github.com/vega/vega/wiki/Marks#text for all parameter description (prepend "text" and capitalize them)
     "type": "text",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.text" },
         // Figure out if this is an LTR or RTL page. For LTR, show label to the right of the icon, left-aligned. For RTL, reverse.
         { "type": "formula", "field":"isLTR", "expr": "'‎' == '\\u200E'" },
         // If these values are not defined ("undefined" is not allowed, so test for truthiness and not 0)
         { "type": "formula", "field":"textDx", "expr": "if(!datum.textDx && datum.textDx != 0, if(datum.isLTR,8,-8), datum.textDx)" },
         { "type": "formula", "field":"textAlign", "expr": "if(!datum.textAlign, if(datum.isLTR,'left','right'), datum.textAlign)" },
         { "type": "formula", "field":"textBaseline", "expr": "datum.textBaseline || 'middle'" }
     ]},
     "properties": {
       "enter": {
         "text": {"field": "text"},
         "x": {"field": "layout_x" },
         "y": {"field": "layout_y"},
         "dx": {"field": "textDx" },
         "dy": {"field": "textDy"},
         "fill": {"field": "textColor"},
         "align": {"field": "textAlign"},
         "baseline": {"field": "textBaseline"},
         "radius": {"field": "textRadius"},
         "theta": {"field": "textTheta"},
         "angle": {"field": "textAngle"},
         "font": {"field": "textFont"},
         "fontSize": {"field": "textFontSize"},
         "fontWeight": {"field": "textFontWeight"},
         "fontStyle": {"field": "textFontStyle"}
       }
     }
   },
   {
     // Draw a low-zoom locator map frame
     "type": "rect",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" }
       ]
     },
     "properties": {
       "enter": {
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth", "offset":2}, "height": {"signal": "picHeight"},
         "stroke": {"value":"#fff"},"strokeWidth": {"value":6}
       }
     }
   },
   {
     // Draw a low-zoom locator map by using a premade world map image
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"url", "expr": "1" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"value": "wikirawupload:"},
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth"}, "height": {"signal": "picHeight"}
       }
     }
   },
   {
     // Draw a zoom-out mark at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"lat", "expr": "imgLat" },
         { "type": "formula", "field":"lon", "expr": "imgLon" },
         {
           "type": "geo",
           "projection": "equirectangular",
           "scale": {"expr": "180/2/PI"},
           "translate": [{"expr": "picXC"}, {"expr": "picYC"}],
           "center": [{"expr": "0"}, {"expr": "0"}],
           "lon": "lon", "lat": "lat"
         }
       ]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"}, "y": {"field": "layout_y"},
         "fill": {"value": "#c33"},
         "stroke": {"value": "#ffe7e6"},
         "size": {"value": 40}
       }
     }
   }
 ]

} </graph>

arc-angleA=-170
arc-gapA=-1.2
arc-radiusA=1.6
Deeper smile:
<graph>

{

 //
 // ATTENTION: This code is maintained at https://www.mediawiki.org/wiki/Template:Graph:Street_map_with_marks
 //            Please do not modify it anywhere else, as it may get copied and override your changes.
 //            Suggestions can be made at https://www.mediawiki.org/wiki/Template_talk:Graph:Street_map_with_marks
 //
 // Template translation is in https://commons.wikimedia.org/wiki/Data:Original/Template:Graphs.tab
 //
 "version": 2, "width":, "height": , "padding": 0,
 "signals":[
   // These signals allow us to quickly move the map within the image, e.g. to leave space for the legend

{"name":"legendWidth", "init": {"expr": "0"} },

   {"name":"legendHeight", "init": {"expr": "height"} },
   {"name":"imgWidth", "init": {"expr": "width-legendWidth"} },
   {"name":"imgHeight", "init": {"expr": "height"} },
   {"name":"imgXC", "init": {"expr": "imgWidth/2"} },
   {"name":"imgYC", "init": {"expr": "imgHeight/2"} },
   {"name":"imgTileSize", "init": {"expr": "256"} },
   {"name":"imgLat", "init": {"expr": "53.6146"} },
   {"name":"imgLon", "init": {"expr": "-4.3341"} },
   {"name":"imgZoom", "init": {"expr": ""} },
   {"name":"picWidth", "init": {"expr": "180"} },
   {"name":"picHeight", "init": {"expr": "picWidth/2"} },
   {"name":"picXC", "init": {"expr": "imgWidth-(picWidth/2)"} },
   {"name":"picYC", "init": {"expr": "imgHeight-(picHeight/2)"} },
   {"name":"showMiniMap", "init": {"expr": "0"} }
 ],
 "data": [
   {
     "name": "data",

// Otherwise use the first unnamed argument for source values

     "values": [  { "lat": 53.6146, 
    "lon": -4.3341, 
    "img": "wikirawupload:https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Mapscaleline.svg/120px-Mapscaleline.svg.png", 
    "width": 50, 
    "height": 8, 
    "offsetX": Expression error: Unexpected / operator., 
    "offsetY": Expression error: Unexpected / operator., 
    "textAlign": "right", 
    "textDx": 22, 
    "textDy": -2, 
    "textColor": "grey", 
    "textFont": "Tahoma", 
    "textFontSize": 9, 
    "text":  "10 000km" }

, { "lat": 0, "lon": 0, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


} , { "lat": 53.6146, "lon": -4.33821, "size": "0", "text": "D", "textAngle": -330, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614531807909, "lon": -4.3380034831911, "size": "0", "text": "e", "textAngle": -331.67347265025, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614467213544, "lon": -4.3377936889225, "size": "0", "text": "e", "textAngle": -333.3469453005, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614406272005, "lon": -4.3375807961538, "size": "0", "text": "p", "textAngle": -335.02041795074, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614349035279, "lon": -4.3373649864875, "size": "0", "text": "e", "textAngle": -336.69389060099, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614295552188, "lon": -4.3371464440143, "size": "0", "text": "r", "textAngle": -338.36736325124, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614245868355, "lon": -4.3369253551563, "size": "0", "text": "", "textAngle": -340.04083590149, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614200026162, "lon": -4.3367019085074, "size": "0", "text": "S", "textAngle": -341.71430855173, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614158064713, "lon": -4.3364762946729, "size": "0", "text": "m", "textAngle": -343.38778120198, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614120019802, "lon": -4.3362487061067, "size": "0", "text": "i", "textAngle": -345.06125385223, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614085923882, "lon": -4.3360193369474, "size": "0", "text": "l", "textAngle": -346.73472650247, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614055806038, "lon": -4.3357883828522, "size": "0", "text": "e", "textAngle": -348.40819915272, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614029691962, "lon": -4.3355560408304, "size": "0", "text": "", "textAngle": -350.08167180297, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.614007603929, "lon": -4.3353225090754, "size": "0", "text": "", "textAngle": -351.75514445322, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.61398956078, "lon": -4.3350879867952, "size": "0", "text": "", "textAngle": -353.42861710347, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.613975577908, "lon": -4.3348526740428, "size": "0", "text": "", "textAngle": -355.10208975371, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.613965667239, "lon": -4.3346167715457, "size": "0", "text": "", "textAngle": -356.77556240396, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.613959837229, "lon": -4.3343804805343, "size": "0", "text": "", "textAngle": -358.44903505421, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.613958092849, "lon": -4.3341440025704, "size": "0", "text": "", "textAngle": -360.12250770445, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.613960435588, "lon": -4.3339075393753, "size": "0", "text": "", "textAngle": -361.7959803547, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.613966863447, "lon": -4.3336712926577, "size": "0", "text": "", "textAngle": -363.46945300495, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}


, { "lat": 0.1, "lon": 0.1, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


}
















     ],
     "transform": [
       {
         "type": "geo",
         "projection": "mercator",
         "scale": {"expr": "imgTileSize/PI/2*pow(2,imgZoom)"},
         "translate": [{"expr": "imgXC"}, {"expr": "imgYC"}],
         "center": [{"expr": "imgLon"}, {"expr": "imgLat"}],
         "lon": "lon", "lat": "lat"
       },
       { "type": "formula", "field":"layout_x", "expr": "datum.layout_x + (datum.offsetX || 0)" },
       { "type": "formula", "field":"layout_y", "expr": "datum.layout_y + (datum.offsetY || 0)" },
       { "type": "formula", "field":"color", "expr": "datum.color || '#c33'" },
       { "type": "formula", "field":"textColor", "expr": "datum.textColor || datum.color" },
       { "type": "formula", "field":"strokeColor", "expr": "datum.strokeColor || '#ffe7e6'" }
     ]
   },
   {
     // Hack: single value data source for drawing/hiding images and other non-series elements
     "name": "dummyData",
     "values": [{}]
   }
 ],

// Legend only works if showLegend and colorScaleField are set

 "marks": [
   {
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "formula", "field":"url", "expr": "'mapsnapshot:///?width='+imgWidth+'&height='+imgHeight+'&zoom='+imgZoom+'&lat='+imgLat+'&lon='+imgLon" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"field": "url"},
         "xc": {"signal": "imgXC"}, "yc": {"signal": "imgYC"},
         "width": {"signal": "imgWidth"}, "height": {"signal": "imgHeight"}
       }
     }
   },
   {
     // Places an image of a given name and size at the [lan,lon] location
     "type": "image",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.img" },
         { "type": "formula", "field":"iconWidth", "expr": "datum.width || 0" },
         { "type": "formula", "field":"iconHeight", "expr": "datum.height || 0" },
         { "type": "formula", "field":"img",
           "expr": "if(!test(/^[a-z]+:\\/\\//, datum.img), 'wikifile:///'+datum.img, datum.img)" },
         // Ensure that either width or height parameter is passed to wikifile:// request
         { "type": "formula", "field":"img",
           "expr": "if((datum.iconWidth || datum.iconHeight) && !test(/[?&](width|height)=\\d/, datum.img),if(datum.iconWidth,datum.img+'?width='+datum.iconWidth,datum.img+'?height='+datum.iconHeight), datum.img)" }
     ]},
     "properties": {
       "enter": {
         "url": {"field": "img"},
         "xc": {"field": "layout_x"}, "yc": {"field": "layout_y"},
         "width": {"field": "iconWidth"}, "height": {"field": "iconHeight"}
       }
     }
   },
   {
     // Draw marks of a given color, shape, and size at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "data",
       "transform": [{ "type": "filter", "test": "!datum.img" }]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"},
         "y": {"field": "layout_y"},
         // If colorScaleField is set, use color scaling, otherwise use the preset color value
         "fill": { "field": "color" },
         "size": {"field": "size"},
         "shape": {"field": "shape"},
         "stroke": {"field": "strokeColor"}
       }
     }
   },
   {
     // Draw text with the given color and size at the [lan,lon] location
     // See https://github.com/vega/vega/wiki/Marks#text for all parameter description (prepend "text" and capitalize them)
     "type": "text",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.text" },
         // Figure out if this is an LTR or RTL page. For LTR, show label to the right of the icon, left-aligned. For RTL, reverse.
         { "type": "formula", "field":"isLTR", "expr": "'‎' == '\\u200E'" },
         // If these values are not defined ("undefined" is not allowed, so test for truthiness and not 0)
         { "type": "formula", "field":"textDx", "expr": "if(!datum.textDx && datum.textDx != 0, if(datum.isLTR,8,-8), datum.textDx)" },
         { "type": "formula", "field":"textAlign", "expr": "if(!datum.textAlign, if(datum.isLTR,'left','right'), datum.textAlign)" },
         { "type": "formula", "field":"textBaseline", "expr": "datum.textBaseline || 'middle'" }
     ]},
     "properties": {
       "enter": {
         "text": {"field": "text"},
         "x": {"field": "layout_x" },
         "y": {"field": "layout_y"},
         "dx": {"field": "textDx" },
         "dy": {"field": "textDy"},
         "fill": {"field": "textColor"},
         "align": {"field": "textAlign"},
         "baseline": {"field": "textBaseline"},
         "radius": {"field": "textRadius"},
         "theta": {"field": "textTheta"},
         "angle": {"field": "textAngle"},
         "font": {"field": "textFont"},
         "fontSize": {"field": "textFontSize"},
         "fontWeight": {"field": "textFontWeight"},
         "fontStyle": {"field": "textFontStyle"}
       }
     }
   },
   {
     // Draw a low-zoom locator map frame
     "type": "rect",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" }
       ]
     },
     "properties": {
       "enter": {
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth", "offset":2}, "height": {"signal": "picHeight"},
         "stroke": {"value":"#fff"},"strokeWidth": {"value":6}
       }
     }
   },
   {
     // Draw a low-zoom locator map by using a premade world map image
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"url", "expr": "1" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"value": "wikirawupload:"},
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth"}, "height": {"signal": "picHeight"}
       }
     }
   },
   {
     // Draw a zoom-out mark at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"lat", "expr": "imgLat" },
         { "type": "formula", "field":"lon", "expr": "imgLon" },
         {
           "type": "geo",
           "projection": "equirectangular",
           "scale": {"expr": "180/2/PI"},
           "translate": [{"expr": "picXC"}, {"expr": "picYC"}],
           "center": [{"expr": "0"}, {"expr": "0"}],
           "lon": "lon", "lat": "lat"
         }
       ]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"}, "y": {"field": "layout_y"},
         "fill": {"value": "#c33"},
         "stroke": {"value": "#ffe7e6"},
         "size": {"value": 40}
       }
     }
   }
 ]

} </graph>

arc-angleA=-150
arc-gapA=-3
arc-radiusA=0.7
wide eyebrow:
<graph>

{

 //
 // ATTENTION: This code is maintained at https://www.mediawiki.org/wiki/Template:Graph:Street_map_with_marks
 //            Please do not modify it anywhere else, as it may get copied and override your changes.
 //            Suggestions can be made at https://www.mediawiki.org/wiki/Template_talk:Graph:Street_map_with_marks
 //
 // Template translation is in https://commons.wikimedia.org/wiki/Data:Original/Template:Graphs.tab
 //
 "version": 2, "width":, "height": , "padding": 0,
 "signals":[
   // These signals allow us to quickly move the map within the image, e.g. to leave space for the legend

{"name":"legendWidth", "init": {"expr": "0"} },

   {"name":"legendHeight", "init": {"expr": "height"} },
   {"name":"imgWidth", "init": {"expr": "width-legendWidth"} },
   {"name":"imgHeight", "init": {"expr": "height"} },
   {"name":"imgXC", "init": {"expr": "imgWidth/2"} },
   {"name":"imgYC", "init": {"expr": "imgHeight/2"} },
   {"name":"imgTileSize", "init": {"expr": "256"} },
   {"name":"imgLat", "init": {"expr": "53.6146"} },
   {"name":"imgLon", "init": {"expr": "-4.3341"} },
   {"name":"imgZoom", "init": {"expr": ""} },
   {"name":"picWidth", "init": {"expr": "180"} },
   {"name":"picHeight", "init": {"expr": "picWidth/2"} },
   {"name":"picXC", "init": {"expr": "imgWidth-(picWidth/2)"} },
   {"name":"picYC", "init": {"expr": "imgHeight-(picHeight/2)"} },
   {"name":"showMiniMap", "init": {"expr": "0"} }
 ],
 "data": [
   {
     "name": "data",

// Otherwise use the first unnamed argument for source values

     "values": [  { "lat": 53.6146, 
    "lon": -4.3341, 
    "img": "wikirawupload:https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Mapscaleline.svg/120px-Mapscaleline.svg.png", 
    "width": 50, 
    "height": 8, 
    "offsetX": Expression error: Unexpected / operator., 
    "offsetY": Expression error: Unexpected / operator., 
    "textAlign": "right", 
    "textDx": 22, 
    "textDy": -2, 
    "textColor": "grey", 
    "textFont": "Tahoma", 
    "textFontSize": 9, 
    "text":  "10 000km" }

, { "lat": 0, "lon": 0, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


} , { "lat": 53.6146, "lon": -4.33721, "size": "0", "text": "E", "textAngle": -20, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614652495696, "lon": -4.3369547112037, "size": "0", "text": "y", "textAngle": -18.326629308605, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614700557845, "lon": -4.3366969405715, "size": "0", "text": "e", "textAngle": -16.65325861721, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614744145454, "lon": -4.336436907961, "size": "0", "text": "b", "textAngle": -14.979887925816, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614783221344, "lon": -4.3361748351592, "size": "0", "text": "r", "textAngle": -13.306517234421, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614817752189, "lon": -4.3359109456932, "size": "0", "text": "o", "textAngle": -11.633146543026, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614847708536, "lon": -4.3356454646396, "size": "0", "text": "w", "textAngle": -9.9597758516312, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614873064834, "lon": -4.3353786184322, "size": "0", "text": "", "textAngle": -8.2864051602364, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614893799457, "lon": -4.3351106346697, "size": "0", "text": "", "textAngle": -6.6130344688416, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.61490989472, "lon": -4.3348417419205, "size": "0", "text": "", "textAngle": -4.9396637774468, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614921336894, "lon": -4.3345721695287, "size": "0", "text": "", "textAngle": -3.266293086052, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614928116221, "lon": -4.3343021474179, "size": "0", "text": "", "textAngle": -1.5929223946572, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614930226918, "lon": -4.3340319058953, "size": "0", "text": "", "textAngle": 0.0804482967376, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.614927667185, "lon": -4.3337616754551, "size": "0", "text": "", "textAngle": 1.7538189881324, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.614920439205, "lon": -4.3334916865824, "size": "0", "text": "", "textAngle": 3.4271896795272, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614908549144, "lon": -4.3332221695559, "size": "0", "text": "", "textAngle": 5.100560370922, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614892007142, "lon": -4.332953354252, "size": "0", "text": "", "textAngle": 6.7739310623168, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614870827308, "lon": -4.3326854699487, "size": "0", "text": "", "textAngle": 8.4473017537116, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.614845027708, "lon": -4.3324187451297, "size": "0", "text": "", "textAngle": 10.120672445106, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.614814630345, "lon": -4.3321534072899, "size": "0", "text": "", "textAngle": 11.794043136501, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.614779661147, "lon": -4.3318896827412, "size": "0", "text": "", "textAngle": 13.467413827896, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}


, { "lat": 0.1, "lon": 0.1, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


}
















     ],
     "transform": [
       {
         "type": "geo",
         "projection": "mercator",
         "scale": {"expr": "imgTileSize/PI/2*pow(2,imgZoom)"},
         "translate": [{"expr": "imgXC"}, {"expr": "imgYC"}],
         "center": [{"expr": "imgLon"}, {"expr": "imgLat"}],
         "lon": "lon", "lat": "lat"
       },
       { "type": "formula", "field":"layout_x", "expr": "datum.layout_x + (datum.offsetX || 0)" },
       { "type": "formula", "field":"layout_y", "expr": "datum.layout_y + (datum.offsetY || 0)" },
       { "type": "formula", "field":"color", "expr": "datum.color || '#c33'" },
       { "type": "formula", "field":"textColor", "expr": "datum.textColor || datum.color" },
       { "type": "formula", "field":"strokeColor", "expr": "datum.strokeColor || '#ffe7e6'" }
     ]
   },
   {
     // Hack: single value data source for drawing/hiding images and other non-series elements
     "name": "dummyData",
     "values": [{}]
   }
 ],

// Legend only works if showLegend and colorScaleField are set

 "marks": [
   {
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "formula", "field":"url", "expr": "'mapsnapshot:///?width='+imgWidth+'&height='+imgHeight+'&zoom='+imgZoom+'&lat='+imgLat+'&lon='+imgLon" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"field": "url"},
         "xc": {"signal": "imgXC"}, "yc": {"signal": "imgYC"},
         "width": {"signal": "imgWidth"}, "height": {"signal": "imgHeight"}
       }
     }
   },
   {
     // Places an image of a given name and size at the [lan,lon] location
     "type": "image",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.img" },
         { "type": "formula", "field":"iconWidth", "expr": "datum.width || 0" },
         { "type": "formula", "field":"iconHeight", "expr": "datum.height || 0" },
         { "type": "formula", "field":"img",
           "expr": "if(!test(/^[a-z]+:\\/\\//, datum.img), 'wikifile:///'+datum.img, datum.img)" },
         // Ensure that either width or height parameter is passed to wikifile:// request
         { "type": "formula", "field":"img",
           "expr": "if((datum.iconWidth || datum.iconHeight) && !test(/[?&](width|height)=\\d/, datum.img),if(datum.iconWidth,datum.img+'?width='+datum.iconWidth,datum.img+'?height='+datum.iconHeight), datum.img)" }
     ]},
     "properties": {
       "enter": {
         "url": {"field": "img"},
         "xc": {"field": "layout_x"}, "yc": {"field": "layout_y"},
         "width": {"field": "iconWidth"}, "height": {"field": "iconHeight"}
       }
     }
   },
   {
     // Draw marks of a given color, shape, and size at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "data",
       "transform": [{ "type": "filter", "test": "!datum.img" }]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"},
         "y": {"field": "layout_y"},
         // If colorScaleField is set, use color scaling, otherwise use the preset color value
         "fill": { "field": "color" },
         "size": {"field": "size"},
         "shape": {"field": "shape"},
         "stroke": {"field": "strokeColor"}
       }
     }
   },
   {
     // Draw text with the given color and size at the [lan,lon] location
     // See https://github.com/vega/vega/wiki/Marks#text for all parameter description (prepend "text" and capitalize them)
     "type": "text",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.text" },
         // Figure out if this is an LTR or RTL page. For LTR, show label to the right of the icon, left-aligned. For RTL, reverse.
         { "type": "formula", "field":"isLTR", "expr": "'‎' == '\\u200E'" },
         // If these values are not defined ("undefined" is not allowed, so test for truthiness and not 0)
         { "type": "formula", "field":"textDx", "expr": "if(!datum.textDx && datum.textDx != 0, if(datum.isLTR,8,-8), datum.textDx)" },
         { "type": "formula", "field":"textAlign", "expr": "if(!datum.textAlign, if(datum.isLTR,'left','right'), datum.textAlign)" },
         { "type": "formula", "field":"textBaseline", "expr": "datum.textBaseline || 'middle'" }
     ]},
     "properties": {
       "enter": {
         "text": {"field": "text"},
         "x": {"field": "layout_x" },
         "y": {"field": "layout_y"},
         "dx": {"field": "textDx" },
         "dy": {"field": "textDy"},
         "fill": {"field": "textColor"},
         "align": {"field": "textAlign"},
         "baseline": {"field": "textBaseline"},
         "radius": {"field": "textRadius"},
         "theta": {"field": "textTheta"},
         "angle": {"field": "textAngle"},
         "font": {"field": "textFont"},
         "fontSize": {"field": "textFontSize"},
         "fontWeight": {"field": "textFontWeight"},
         "fontStyle": {"field": "textFontStyle"}
       }
     }
   },
   {
     // Draw a low-zoom locator map frame
     "type": "rect",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" }
       ]
     },
     "properties": {
       "enter": {
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth", "offset":2}, "height": {"signal": "picHeight"},
         "stroke": {"value":"#fff"},"strokeWidth": {"value":6}
       }
     }
   },
   {
     // Draw a low-zoom locator map by using a premade world map image
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"url", "expr": "1" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"value": "wikirawupload:"},
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth"}, "height": {"signal": "picHeight"}
       }
     }
   },
   {
     // Draw a zoom-out mark at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"lat", "expr": "imgLat" },
         { "type": "formula", "field":"lon", "expr": "imgLon" },
         {
           "type": "geo",
           "projection": "equirectangular",
           "scale": {"expr": "180/2/PI"},
           "translate": [{"expr": "picXC"}, {"expr": "picYC"}],
           "center": [{"expr": "0"}, {"expr": "0"}],
           "lon": "lon", "lat": "lat"
         }
       ]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"}, "y": {"field": "layout_y"},
         "fill": {"value": "#c33"},
         "stroke": {"value": "#ffe7e6"},
         "size": {"value": 40}
       }
     }
   }
 ]

} </graph>

arc-angleA=-20
arc-gapA=3
arc-radiusA=0.8
opening bracket (reading up):
<graph>

{

 //
 // ATTENTION: This code is maintained at https://www.mediawiki.org/wiki/Template:Graph:Street_map_with_marks
 //            Please do not modify it anywhere else, as it may get copied and override your changes.
 //            Suggestions can be made at https://www.mediawiki.org/wiki/Template_talk:Graph:Street_map_with_marks
 //
 // Template translation is in https://commons.wikimedia.org/wiki/Data:Original/Template:Graphs.tab
 //
 "version": 2, "width":, "height": , "padding": 0,
 "signals":[
   // These signals allow us to quickly move the map within the image, e.g. to leave space for the legend

{"name":"legendWidth", "init": {"expr": "0"} },

   {"name":"legendHeight", "init": {"expr": "height"} },
   {"name":"imgWidth", "init": {"expr": "width-legendWidth"} },
   {"name":"imgHeight", "init": {"expr": "height"} },
   {"name":"imgXC", "init": {"expr": "imgWidth/2"} },
   {"name":"imgYC", "init": {"expr": "imgHeight/2"} },
   {"name":"imgTileSize", "init": {"expr": "256"} },
   {"name":"imgLat", "init": {"expr": "53.6146"} },
   {"name":"imgLon", "init": {"expr": "-4.3341"} },
   {"name":"imgZoom", "init": {"expr": ""} },
   {"name":"picWidth", "init": {"expr": "180"} },
   {"name":"picHeight", "init": {"expr": "picWidth/2"} },
   {"name":"picXC", "init": {"expr": "imgWidth-(picWidth/2)"} },
   {"name":"picYC", "init": {"expr": "imgHeight-(picHeight/2)"} },
   {"name":"showMiniMap", "init": {"expr": "0"} }
 ],
 "data": [
   {
     "name": "data",

// Otherwise use the first unnamed argument for source values

     "values": [  { "lat": 53.6146, 
    "lon": -4.3341, 
    "img": "wikirawupload:https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Mapscaleline.svg/120px-Mapscaleline.svg.png", 
    "width": 50, 
    "height": 8, 
    "offsetX": Expression error: Unexpected / operator., 
    "offsetY": Expression error: Unexpected / operator., 
    "textAlign": "right", 
    "textDx": 22, 
    "textDy": -2, 
    "textColor": "grey", 
    "textFont": "Tahoma", 
    "textFontSize": 9, 
    "text":  "10 000km" }

, { "lat": 0, "lon": 0, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


} , { "lat": 53.6132, "lon": -4.33521, "size": "0", "text": "o", "textAngle": -110, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.613256511935, "lon": -4.3352439733179, "size": "0", "text": "p", "textAngle": -109.16321308758, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.613313311424, "lon": -4.3352765482391, "size": "0", "text": "e", "textAngle": -108.32642617515, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.613370386352, "lon": -4.3353077178157, "size": "0", "text": "n", "textAngle": -107.48963926273, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.613427724546, "lon": -4.3353374753994, "size": "0", "text": "i", "textAngle": -106.65285235031, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.613485313775, "lon": -4.3353658146432, "size": "0", "text": "n", "textAngle": -105.81606543789, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.613543141758, "lon": -4.3353927295023, "size": "0", "text": "g", "textAngle": -104.97927852546, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.613601196158, "lon": -4.3354182142362, "size": "0", "text": "", "textAngle": -104.14249161304, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.613659464594, "lon": -4.3354422634091, "size": "0", "text": "b", "textAngle": -103.30570470062, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.613717934637, "lon": -4.3354648718914, "size": "0", "text": "r", "textAngle": -102.46891778819, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.613776593816, "lon": -4.3354860348609, "size": "0", "text": "a", "textAngle": -101.63213087577, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.613835429619, "lon": -4.3355057478037, "size": "0", "text": "c", "textAngle": -100.79534396335, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.613894429498, "lon": -4.3355240065153, "size": "0", "text": "k", "textAngle": -99.958557050925, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.613953580867, "lon": -4.335540807101, "size": "0", "text": "e", "textAngle": -99.121770138502, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.614012871111, "lon": -4.3355561459775, "size": "0", "text": "t", "textAngle": -98.284983226079, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614072287583, "lon": -4.3355700198731, "size": "0", "text": "", "textAngle": -97.448196313656, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.61413181761, "lon": -4.3355824258286, "size": "0", "text": "(", "textAngle": -96.611409401233, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.614191448494, "lon": -4.3355933611979, "size": "0", "text": "u", "textAngle": -95.77462248881, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.614251167517, "lon": -4.3356028236485, "size": "0", "text": "p", "textAngle": -94.937835576387, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.614310961942, "lon": -4.3356108111622, "size": "0", "text": ")", "textAngle": -94.101048663964, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.614370819013, "lon": -4.3356173220353, "size": "0", "text": "", "textAngle": -93.264261751541, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}


, { "lat": 0.1, "lon": 0.1, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


}
















     ],
     "transform": [
       {
         "type": "geo",
         "projection": "mercator",
         "scale": {"expr": "imgTileSize/PI/2*pow(2,imgZoom)"},
         "translate": [{"expr": "imgXC"}, {"expr": "imgYC"}],
         "center": [{"expr": "imgLon"}, {"expr": "imgLat"}],
         "lon": "lon", "lat": "lat"
       },
       { "type": "formula", "field":"layout_x", "expr": "datum.layout_x + (datum.offsetX || 0)" },
       { "type": "formula", "field":"layout_y", "expr": "datum.layout_y + (datum.offsetY || 0)" },
       { "type": "formula", "field":"color", "expr": "datum.color || '#c33'" },
       { "type": "formula", "field":"textColor", "expr": "datum.textColor || datum.color" },
       { "type": "formula", "field":"strokeColor", "expr": "datum.strokeColor || '#ffe7e6'" }
     ]
   },
   {
     // Hack: single value data source for drawing/hiding images and other non-series elements
     "name": "dummyData",
     "values": [{}]
   }
 ],

// Legend only works if showLegend and colorScaleField are set

 "marks": [
   {
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "formula", "field":"url", "expr": "'mapsnapshot:///?width='+imgWidth+'&height='+imgHeight+'&zoom='+imgZoom+'&lat='+imgLat+'&lon='+imgLon" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"field": "url"},
         "xc": {"signal": "imgXC"}, "yc": {"signal": "imgYC"},
         "width": {"signal": "imgWidth"}, "height": {"signal": "imgHeight"}
       }
     }
   },
   {
     // Places an image of a given name and size at the [lan,lon] location
     "type": "image",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.img" },
         { "type": "formula", "field":"iconWidth", "expr": "datum.width || 0" },
         { "type": "formula", "field":"iconHeight", "expr": "datum.height || 0" },
         { "type": "formula", "field":"img",
           "expr": "if(!test(/^[a-z]+:\\/\\//, datum.img), 'wikifile:///'+datum.img, datum.img)" },
         // Ensure that either width or height parameter is passed to wikifile:// request
         { "type": "formula", "field":"img",
           "expr": "if((datum.iconWidth || datum.iconHeight) && !test(/[?&](width|height)=\\d/, datum.img),if(datum.iconWidth,datum.img+'?width='+datum.iconWidth,datum.img+'?height='+datum.iconHeight), datum.img)" }
     ]},
     "properties": {
       "enter": {
         "url": {"field": "img"},
         "xc": {"field": "layout_x"}, "yc": {"field": "layout_y"},
         "width": {"field": "iconWidth"}, "height": {"field": "iconHeight"}
       }
     }
   },
   {
     // Draw marks of a given color, shape, and size at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "data",
       "transform": [{ "type": "filter", "test": "!datum.img" }]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"},
         "y": {"field": "layout_y"},
         // If colorScaleField is set, use color scaling, otherwise use the preset color value
         "fill": { "field": "color" },
         "size": {"field": "size"},
         "shape": {"field": "shape"},
         "stroke": {"field": "strokeColor"}
       }
     }
   },
   {
     // Draw text with the given color and size at the [lan,lon] location
     // See https://github.com/vega/vega/wiki/Marks#text for all parameter description (prepend "text" and capitalize them)
     "type": "text",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.text" },
         // Figure out if this is an LTR or RTL page. For LTR, show label to the right of the icon, left-aligned. For RTL, reverse.
         { "type": "formula", "field":"isLTR", "expr": "'‎' == '\\u200E'" },
         // If these values are not defined ("undefined" is not allowed, so test for truthiness and not 0)
         { "type": "formula", "field":"textDx", "expr": "if(!datum.textDx && datum.textDx != 0, if(datum.isLTR,8,-8), datum.textDx)" },
         { "type": "formula", "field":"textAlign", "expr": "if(!datum.textAlign, if(datum.isLTR,'left','right'), datum.textAlign)" },
         { "type": "formula", "field":"textBaseline", "expr": "datum.textBaseline || 'middle'" }
     ]},
     "properties": {
       "enter": {
         "text": {"field": "text"},
         "x": {"field": "layout_x" },
         "y": {"field": "layout_y"},
         "dx": {"field": "textDx" },
         "dy": {"field": "textDy"},
         "fill": {"field": "textColor"},
         "align": {"field": "textAlign"},
         "baseline": {"field": "textBaseline"},
         "radius": {"field": "textRadius"},
         "theta": {"field": "textTheta"},
         "angle": {"field": "textAngle"},
         "font": {"field": "textFont"},
         "fontSize": {"field": "textFontSize"},
         "fontWeight": {"field": "textFontWeight"},
         "fontStyle": {"field": "textFontStyle"}
       }
     }
   },
   {
     // Draw a low-zoom locator map frame
     "type": "rect",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" }
       ]
     },
     "properties": {
       "enter": {
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth", "offset":2}, "height": {"signal": "picHeight"},
         "stroke": {"value":"#fff"},"strokeWidth": {"value":6}
       }
     }
   },
   {
     // Draw a low-zoom locator map by using a premade world map image
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"url", "expr": "1" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"value": "wikirawupload:"},
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth"}, "height": {"signal": "picHeight"}
       }
     }
   },
   {
     // Draw a zoom-out mark at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"lat", "expr": "imgLat" },
         { "type": "formula", "field":"lon", "expr": "imgLon" },
         {
           "type": "geo",
           "projection": "equirectangular",
           "scale": {"expr": "180/2/PI"},
           "translate": [{"expr": "picXC"}, {"expr": "picYC"}],
           "center": [{"expr": "0"}, {"expr": "0"}],
           "lon": "lon", "lat": "lat"
         }
       ]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"}, "y": {"field": "layout_y"},
         "fill": {"value": "#c33"},
         "stroke": {"value": "#ffe7e6"},
         "size": {"value": 40}
       }
     }
   }
 ]

} </graph>

arc-angleA=-110
arc-gapA=1.5
arc-radiusA=0.6
opening bracket (reading down):
<graph>

{

 //
 // ATTENTION: This code is maintained at https://www.mediawiki.org/wiki/Template:Graph:Street_map_with_marks
 //            Please do not modify it anywhere else, as it may get copied and override your changes.
 //            Suggestions can be made at https://www.mediawiki.org/wiki/Template_talk:Graph:Street_map_with_marks
 //
 // Template translation is in https://commons.wikimedia.org/wiki/Data:Original/Template:Graphs.tab
 //
 "version": 2, "width":, "height": , "padding": 0,
 "signals":[
   // These signals allow us to quickly move the map within the image, e.g. to leave space for the legend

{"name":"legendWidth", "init": {"expr": "0"} },

   {"name":"legendHeight", "init": {"expr": "height"} },
   {"name":"imgWidth", "init": {"expr": "width-legendWidth"} },
   {"name":"imgHeight", "init": {"expr": "height"} },
   {"name":"imgXC", "init": {"expr": "imgWidth/2"} },
   {"name":"imgYC", "init": {"expr": "imgHeight/2"} },
   {"name":"imgTileSize", "init": {"expr": "256"} },
   {"name":"imgLat", "init": {"expr": "53.6146"} },
   {"name":"imgLon", "init": {"expr": "-4.3341"} },
   {"name":"imgZoom", "init": {"expr": ""} },
   {"name":"picWidth", "init": {"expr": "180"} },
   {"name":"picHeight", "init": {"expr": "picWidth/2"} },
   {"name":"picXC", "init": {"expr": "imgWidth-(picWidth/2)"} },
   {"name":"picYC", "init": {"expr": "imgHeight-(picHeight/2)"} },
   {"name":"showMiniMap", "init": {"expr": "0"} }
 ],
 "data": [
   {
     "name": "data",

// Otherwise use the first unnamed argument for source values

     "values": [  { "lat": 53.6146, 
    "lon": -4.3341, 
    "img": "wikirawupload:https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Mapscaleline.svg/120px-Mapscaleline.svg.png", 
    "width": 50, 
    "height": 8, 
    "offsetX": Expression error: Unexpected / operator., 
    "offsetY": Expression error: Unexpected / operator., 
    "textAlign": "right", 
    "textDx": 22, 
    "textDy": -2, 
    "textColor": "grey", 
    "textFont": "Tahoma", 
    "textFontSize": 9, 
    "text":  "10 000km" }

, { "lat": 0, "lon": 0, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


} , { "lat": 53.6168, "lon": -4.33521, "size": "0", "text": "o", "textAngle": -240, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.616741963472, "lon": -4.335265361225, "size": "0", "text": "p", "textAngle": -241.11578281, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.616683300055, "lon": -4.3353188020217, "size": "0", "text": "e", "textAngle": -242.23156562001, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.616624031995, "lon": -4.3353703021237, "size": "0", "text": "n", "textAngle": -243.34734843001, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.616564181768, "lon": -4.3354198420008, "size": "0", "text": "i", "textAngle": -244.46313124002, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.616503772072, "lon": -4.3354674028661, "size": "0", "text": "n", "textAngle": -245.57891405002, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.616442825815, "lon": -4.3355129666831, "size": "0", "text": "g", "textAngle": -246.69469686002, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.61638136611, "lon": -4.3355565161728, "size": "0", "text": "", "textAngle": -247.81047967003, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.616319416263, "lon": -4.33559803482, "size": "0", "text": "b", "textAngle": -248.92626248003, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.616256999769, "lon": -4.3356375068797, "size": "0", "text": "r", "textAngle": -250.04204529004, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.616194140298, "lon": -4.3356749173829, "size": "0", "text": "a", "textAngle": -251.15782810004, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.616130861686, "lon": -4.3357102521427, "size": "0", "text": "c", "textAngle": -252.27361091004, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.616067187932, "lon": -4.3357434977589, "size": "0", "text": "k", "textAngle": -253.38939372005, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.616003143182, "lon": -4.335774641624, "size": "0", "text": "e", "textAngle": -254.50517653005, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.615938751724, "lon": -4.3358036719273, "size": "0", "text": "t", "textAngle": -255.62095934005, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.615874037976, "lon": -4.3358305776598, "size": "0", "text": "", "textAngle": -256.73674215006, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.615809026481, "lon": -4.335855348618, "size": "0", "text": "(", "textAngle": -257.85252496006, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.615743741892, "lon": -4.3358779754081, "size": "0", "text": "d", "textAngle": -258.96830777007, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.615678208967, "lon": -4.3358984494494, "size": "0", "text": "o", "textAngle": -260.08409058007, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.615612452558, "lon": -4.3359167629775, "size": "0", "text": "w", "textAngle": -261.19987339007, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.615546497601, "lon": -4.3359329090475, "size": "0", "text": "n", "textAngle": -262.31565620008, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}


, { "lat": 0.1, "lon": 0.1, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


}
















     ],
     "transform": [
       {
         "type": "geo",
         "projection": "mercator",
         "scale": {"expr": "imgTileSize/PI/2*pow(2,imgZoom)"},
         "translate": [{"expr": "imgXC"}, {"expr": "imgYC"}],
         "center": [{"expr": "imgLon"}, {"expr": "imgLat"}],
         "lon": "lon", "lat": "lat"
       },
       { "type": "formula", "field":"layout_x", "expr": "datum.layout_x + (datum.offsetX || 0)" },
       { "type": "formula", "field":"layout_y", "expr": "datum.layout_y + (datum.offsetY || 0)" },
       { "type": "formula", "field":"color", "expr": "datum.color || '#c33'" },
       { "type": "formula", "field":"textColor", "expr": "datum.textColor || datum.color" },
       { "type": "formula", "field":"strokeColor", "expr": "datum.strokeColor || '#ffe7e6'" }
     ]
   },
   {
     // Hack: single value data source for drawing/hiding images and other non-series elements
     "name": "dummyData",
     "values": [{}]
   }
 ],

// Legend only works if showLegend and colorScaleField are set

 "marks": [
   {
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "formula", "field":"url", "expr": "'mapsnapshot:///?width='+imgWidth+'&height='+imgHeight+'&zoom='+imgZoom+'&lat='+imgLat+'&lon='+imgLon" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"field": "url"},
         "xc": {"signal": "imgXC"}, "yc": {"signal": "imgYC"},
         "width": {"signal": "imgWidth"}, "height": {"signal": "imgHeight"}
       }
     }
   },
   {
     // Places an image of a given name and size at the [lan,lon] location
     "type": "image",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.img" },
         { "type": "formula", "field":"iconWidth", "expr": "datum.width || 0" },
         { "type": "formula", "field":"iconHeight", "expr": "datum.height || 0" },
         { "type": "formula", "field":"img",
           "expr": "if(!test(/^[a-z]+:\\/\\//, datum.img), 'wikifile:///'+datum.img, datum.img)" },
         // Ensure that either width or height parameter is passed to wikifile:// request
         { "type": "formula", "field":"img",
           "expr": "if((datum.iconWidth || datum.iconHeight) && !test(/[?&](width|height)=\\d/, datum.img),if(datum.iconWidth,datum.img+'?width='+datum.iconWidth,datum.img+'?height='+datum.iconHeight), datum.img)" }
     ]},
     "properties": {
       "enter": {
         "url": {"field": "img"},
         "xc": {"field": "layout_x"}, "yc": {"field": "layout_y"},
         "width": {"field": "iconWidth"}, "height": {"field": "iconHeight"}
       }
     }
   },
   {
     // Draw marks of a given color, shape, and size at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "data",
       "transform": [{ "type": "filter", "test": "!datum.img" }]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"},
         "y": {"field": "layout_y"},
         // If colorScaleField is set, use color scaling, otherwise use the preset color value
         "fill": { "field": "color" },
         "size": {"field": "size"},
         "shape": {"field": "shape"},
         "stroke": {"field": "strokeColor"}
       }
     }
   },
   {
     // Draw text with the given color and size at the [lan,lon] location
     // See https://github.com/vega/vega/wiki/Marks#text for all parameter description (prepend "text" and capitalize them)
     "type": "text",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.text" },
         // Figure out if this is an LTR or RTL page. For LTR, show label to the right of the icon, left-aligned. For RTL, reverse.
         { "type": "formula", "field":"isLTR", "expr": "'‎' == '\\u200E'" },
         // If these values are not defined ("undefined" is not allowed, so test for truthiness and not 0)
         { "type": "formula", "field":"textDx", "expr": "if(!datum.textDx && datum.textDx != 0, if(datum.isLTR,8,-8), datum.textDx)" },
         { "type": "formula", "field":"textAlign", "expr": "if(!datum.textAlign, if(datum.isLTR,'left','right'), datum.textAlign)" },
         { "type": "formula", "field":"textBaseline", "expr": "datum.textBaseline || 'middle'" }
     ]},
     "properties": {
       "enter": {
         "text": {"field": "text"},
         "x": {"field": "layout_x" },
         "y": {"field": "layout_y"},
         "dx": {"field": "textDx" },
         "dy": {"field": "textDy"},
         "fill": {"field": "textColor"},
         "align": {"field": "textAlign"},
         "baseline": {"field": "textBaseline"},
         "radius": {"field": "textRadius"},
         "theta": {"field": "textTheta"},
         "angle": {"field": "textAngle"},
         "font": {"field": "textFont"},
         "fontSize": {"field": "textFontSize"},
         "fontWeight": {"field": "textFontWeight"},
         "fontStyle": {"field": "textFontStyle"}
       }
     }
   },
   {
     // Draw a low-zoom locator map frame
     "type": "rect",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" }
       ]
     },
     "properties": {
       "enter": {
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth", "offset":2}, "height": {"signal": "picHeight"},
         "stroke": {"value":"#fff"},"strokeWidth": {"value":6}
       }
     }
   },
   {
     // Draw a low-zoom locator map by using a premade world map image
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"url", "expr": "1" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"value": "wikirawupload:"},
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth"}, "height": {"signal": "picHeight"}
       }
     }
   },
   {
     // Draw a zoom-out mark at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"lat", "expr": "imgLat" },
         { "type": "formula", "field":"lon", "expr": "imgLon" },
         {
           "type": "geo",
           "projection": "equirectangular",
           "scale": {"expr": "180/2/PI"},
           "translate": [{"expr": "picXC"}, {"expr": "picYC"}],
           "center": [{"expr": "0"}, {"expr": "0"}],
           "lon": "lon", "lat": "lat"
         }
       ]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"}, "y": {"field": "layout_y"},
         "fill": {"value": "#c33"},
         "stroke": {"value": "#ffe7e6"},
         "size": {"value": 40}
       }
     }
   }
 ]

} </graph>

arc-angleA=-60
arc-gapA=-2
arc-radiusA=0.5
closing bracket (reading up):
<graph>

{

 //
 // ATTENTION: This code is maintained at https://www.mediawiki.org/wiki/Template:Graph:Street_map_with_marks
 //            Please do not modify it anywhere else, as it may get copied and override your changes.
 //            Suggestions can be made at https://www.mediawiki.org/wiki/Template_talk:Graph:Street_map_with_marks
 //
 // Template translation is in https://commons.wikimedia.org/wiki/Data:Original/Template:Graphs.tab
 //
 "version": 2, "width":, "height": , "padding": 0,
 "signals":[
   // These signals allow us to quickly move the map within the image, e.g. to leave space for the legend

{"name":"legendWidth", "init": {"expr": "0"} },

   {"name":"legendHeight", "init": {"expr": "height"} },
   {"name":"imgWidth", "init": {"expr": "width-legendWidth"} },
   {"name":"imgHeight", "init": {"expr": "height"} },
   {"name":"imgXC", "init": {"expr": "imgWidth/2"} },
   {"name":"imgYC", "init": {"expr": "imgHeight/2"} },
   {"name":"imgTileSize", "init": {"expr": "256"} },
   {"name":"imgLat", "init": {"expr": "53.6146"} },
   {"name":"imgLon", "init": {"expr": "-4.3341"} },
   {"name":"imgZoom", "init": {"expr": ""} },
   {"name":"picWidth", "init": {"expr": "180"} },
   {"name":"picHeight", "init": {"expr": "picWidth/2"} },
   {"name":"picXC", "init": {"expr": "imgWidth-(picWidth/2)"} },
   {"name":"picYC", "init": {"expr": "imgHeight-(picHeight/2)"} },
   {"name":"showMiniMap", "init": {"expr": "0"} }
 ],
 "data": [
   {
     "name": "data",

// Otherwise use the first unnamed argument for source values

     "values": [  { "lat": 53.6146, 
    "lon": -4.3341, 
    "img": "wikirawupload:https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Mapscaleline.svg/120px-Mapscaleline.svg.png", 
    "width": 50, 
    "height": 8, 
    "offsetX": Expression error: Unexpected / operator., 
    "offsetY": Expression error: Unexpected / operator., 
    "textAlign": "right", 
    "textDx": 22, 
    "textDy": -2, 
    "textColor": "grey", 
    "textFont": "Tahoma", 
    "textFontSize": 9, 
    "text":  "10 000km" }

, { "lat": 0, "lon": 0, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


} , { "lat": 53.6122, "lon": -4.33521, "size": "0", "text": "c", "textAngle": -60, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.61226954333, "lon": -4.3351432844335, "size": "0", "text": "l", "textAngle": -60.836685345697, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.612339655698, "lon": -4.3350782921738, "size": "0", "text": "o", "textAngle": -61.673370691395, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.612410322155, "lon": -4.33501503708, "size": "0", "text": "s", "textAngle": -62.510056037092, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.612481527631, "lon": -4.3349535326408, "size": "0", "text": "i", "textAngle": -63.34674138279, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.612553256943, "lon": -4.3348937919713, "size": "0", "text": "n", "textAngle": -64.183426728487, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.612625494794, "lon": -4.3348358278108, "size": "0", "text": "g", "textAngle": -65.020112074184, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.612698225781, "lon": -4.3347796525195, "size": "0", "text": "", "textAngle": -65.856797419882, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.612771434394, "lon": -4.3347252780765, "size": "0", "text": "b", "textAngle": -66.693482765579, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.612845105022, "lon": -4.3346727160766, "size": "0", "text": "r", "textAngle": -67.530168111277, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.612919221956, "lon": -4.3346219777281, "size": "0", "text": "a", "textAngle": -68.366853456974, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.61299376939, "lon": -4.3345730738507, "size": "0", "text": "c", "textAngle": -69.203538802671, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.613068731429, "lon": -4.3345260148725, "size": "0", "text": "k", "textAngle": -70.040224148369, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.613144092087, "lon": -4.3344808108286, "size": "0", "text": "e", "textAngle": -70.876909494066, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.613219835295, "lon": -4.3344374713583, "size": "0", "text": "t", "textAngle": -71.713594839763, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.6132959449, "lon": -4.3343960057033, "size": "0", "text": "", "textAngle": -72.550280185461, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.613372404672, "lon": -4.3343564227059, "size": "0", "text": "(", "textAngle": -73.386965531158, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.613449198309, "lon": -4.3343187308068, "size": "0", "text": "u", "textAngle": -74.223650876856, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.613526309433, "lon": -4.3342829380434, "size": "0", "text": "p", "textAngle": -75.060336222553, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.613603721602, "lon": -4.3342490520483, "size": "0", "text": ")", "textAngle": -75.89702156825, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.613681418308, "lon": -4.3342170800474, "size": "0", "text": "", "textAngle": -76.733706913948, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}


, { "lat": 0.1, "lon": 0.1, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


}
















     ],
     "transform": [
       {
         "type": "geo",
         "projection": "mercator",
         "scale": {"expr": "imgTileSize/PI/2*pow(2,imgZoom)"},
         "translate": [{"expr": "imgXC"}, {"expr": "imgYC"}],
         "center": [{"expr": "imgLon"}, {"expr": "imgLat"}],
         "lon": "lon", "lat": "lat"
       },
       { "type": "formula", "field":"layout_x", "expr": "datum.layout_x + (datum.offsetX || 0)" },
       { "type": "formula", "field":"layout_y", "expr": "datum.layout_y + (datum.offsetY || 0)" },
       { "type": "formula", "field":"color", "expr": "datum.color || '#c33'" },
       { "type": "formula", "field":"textColor", "expr": "datum.textColor || datum.color" },
       { "type": "formula", "field":"strokeColor", "expr": "datum.strokeColor || '#ffe7e6'" }
     ]
   },
   {
     // Hack: single value data source for drawing/hiding images and other non-series elements
     "name": "dummyData",
     "values": [{}]
   }
 ],

// Legend only works if showLegend and colorScaleField are set

 "marks": [
   {
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "formula", "field":"url", "expr": "'mapsnapshot:///?width='+imgWidth+'&height='+imgHeight+'&zoom='+imgZoom+'&lat='+imgLat+'&lon='+imgLon" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"field": "url"},
         "xc": {"signal": "imgXC"}, "yc": {"signal": "imgYC"},
         "width": {"signal": "imgWidth"}, "height": {"signal": "imgHeight"}
       }
     }
   },
   {
     // Places an image of a given name and size at the [lan,lon] location
     "type": "image",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.img" },
         { "type": "formula", "field":"iconWidth", "expr": "datum.width || 0" },
         { "type": "formula", "field":"iconHeight", "expr": "datum.height || 0" },
         { "type": "formula", "field":"img",
           "expr": "if(!test(/^[a-z]+:\\/\\//, datum.img), 'wikifile:///'+datum.img, datum.img)" },
         // Ensure that either width or height parameter is passed to wikifile:// request
         { "type": "formula", "field":"img",
           "expr": "if((datum.iconWidth || datum.iconHeight) && !test(/[?&](width|height)=\\d/, datum.img),if(datum.iconWidth,datum.img+'?width='+datum.iconWidth,datum.img+'?height='+datum.iconHeight), datum.img)" }
     ]},
     "properties": {
       "enter": {
         "url": {"field": "img"},
         "xc": {"field": "layout_x"}, "yc": {"field": "layout_y"},
         "width": {"field": "iconWidth"}, "height": {"field": "iconHeight"}
       }
     }
   },
   {
     // Draw marks of a given color, shape, and size at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "data",
       "transform": [{ "type": "filter", "test": "!datum.img" }]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"},
         "y": {"field": "layout_y"},
         // If colorScaleField is set, use color scaling, otherwise use the preset color value
         "fill": { "field": "color" },
         "size": {"field": "size"},
         "shape": {"field": "shape"},
         "stroke": {"field": "strokeColor"}
       }
     }
   },
   {
     // Draw text with the given color and size at the [lan,lon] location
     // See https://github.com/vega/vega/wiki/Marks#text for all parameter description (prepend "text" and capitalize them)
     "type": "text",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.text" },
         // Figure out if this is an LTR or RTL page. For LTR, show label to the right of the icon, left-aligned. For RTL, reverse.
         { "type": "formula", "field":"isLTR", "expr": "'‎' == '\\u200E'" },
         // If these values are not defined ("undefined" is not allowed, so test for truthiness and not 0)
         { "type": "formula", "field":"textDx", "expr": "if(!datum.textDx && datum.textDx != 0, if(datum.isLTR,8,-8), datum.textDx)" },
         { "type": "formula", "field":"textAlign", "expr": "if(!datum.textAlign, if(datum.isLTR,'left','right'), datum.textAlign)" },
         { "type": "formula", "field":"textBaseline", "expr": "datum.textBaseline || 'middle'" }
     ]},
     "properties": {
       "enter": {
         "text": {"field": "text"},
         "x": {"field": "layout_x" },
         "y": {"field": "layout_y"},
         "dx": {"field": "textDx" },
         "dy": {"field": "textDy"},
         "fill": {"field": "textColor"},
         "align": {"field": "textAlign"},
         "baseline": {"field": "textBaseline"},
         "radius": {"field": "textRadius"},
         "theta": {"field": "textTheta"},
         "angle": {"field": "textAngle"},
         "font": {"field": "textFont"},
         "fontSize": {"field": "textFontSize"},
         "fontWeight": {"field": "textFontWeight"},
         "fontStyle": {"field": "textFontStyle"}
       }
     }
   },
   {
     // Draw a low-zoom locator map frame
     "type": "rect",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" }
       ]
     },
     "properties": {
       "enter": {
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth", "offset":2}, "height": {"signal": "picHeight"},
         "stroke": {"value":"#fff"},"strokeWidth": {"value":6}
       }
     }
   },
   {
     // Draw a low-zoom locator map by using a premade world map image
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"url", "expr": "1" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"value": "wikirawupload:"},
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth"}, "height": {"signal": "picHeight"}
       }
     }
   },
   {
     // Draw a zoom-out mark at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"lat", "expr": "imgLat" },
         { "type": "formula", "field":"lon", "expr": "imgLon" },
         {
           "type": "geo",
           "projection": "equirectangular",
           "scale": {"expr": "180/2/PI"},
           "translate": [{"expr": "picXC"}, {"expr": "picYC"}],
           "center": [{"expr": "0"}, {"expr": "0"}],
           "lon": "lon", "lat": "lat"
         }
       ]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"}, "y": {"field": "layout_y"},
         "fill": {"value": "#c33"},
         "stroke": {"value": "#ffe7e6"},
         "size": {"value": 40}
       }
     }
   }
 ]

} </graph>

arc-angleA=120
arc-gapA=-1.5
arc-radiusA=0.8
closing bracket (reading down):
<graph>

{

 //
 // ATTENTION: This code is maintained at https://www.mediawiki.org/wiki/Template:Graph:Street_map_with_marks
 //            Please do not modify it anywhere else, as it may get copied and override your changes.
 //            Suggestions can be made at https://www.mediawiki.org/wiki/Template_talk:Graph:Street_map_with_marks
 //
 // Template translation is in https://commons.wikimedia.org/wiki/Data:Original/Template:Graphs.tab
 //
 "version": 2, "width":, "height": , "padding": 0,
 "signals":[
   // These signals allow us to quickly move the map within the image, e.g. to leave space for the legend

{"name":"legendWidth", "init": {"expr": "0"} },

   {"name":"legendHeight", "init": {"expr": "height"} },
   {"name":"imgWidth", "init": {"expr": "width-legendWidth"} },
   {"name":"imgHeight", "init": {"expr": "height"} },
   {"name":"imgXC", "init": {"expr": "imgWidth/2"} },
   {"name":"imgYC", "init": {"expr": "imgHeight/2"} },
   {"name":"imgTileSize", "init": {"expr": "256"} },
   {"name":"imgLat", "init": {"expr": "53.6146"} },
   {"name":"imgLon", "init": {"expr": "-4.3341"} },
   {"name":"imgZoom", "init": {"expr": ""} },
   {"name":"picWidth", "init": {"expr": "180"} },
   {"name":"picHeight", "init": {"expr": "picWidth/2"} },
   {"name":"picXC", "init": {"expr": "imgWidth-(picWidth/2)"} },
   {"name":"picYC", "init": {"expr": "imgHeight-(picHeight/2)"} },
   {"name":"showMiniMap", "init": {"expr": "0"} }
 ],
 "data": [
   {
     "name": "data",

// Otherwise use the first unnamed argument for source values

     "values": [  { "lat": 53.6146, 
    "lon": -4.3341, 
    "img": "wikirawupload:https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Mapscaleline.svg/120px-Mapscaleline.svg.png", 
    "width": 50, 
    "height": 8, 
    "offsetX": Expression error: Unexpected / operator., 
    "offsetY": Expression error: Unexpected / operator., 
    "textAlign": "right", 
    "textDx": 22, 
    "textDy": -2, 
    "textColor": "grey", 
    "textFont": "Tahoma", 
    "textFontSize": 9, 
    "text":  "10 000km" }

, { "lat": 0, "lon": 0, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


} , { "lat": 53.6168, "lon": -4.33521, "size": "0", "text": "c", "textAngle": 60, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.616741880937, "lon": -4.335154874976, "size": "0", "text": "l", "textAngle": 61.394811517121, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.61668298511, "lon": -4.335102157152, "size": "0", "text": "o", "textAngle": 62.789623034241, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.616623347421, "lon": -4.3350518777689, "size": "0", "text": "s", "textAngle": 64.184434551362, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.616563003212, "lon": -4.3350040666223, "size": "0", "text": "i", "textAngle": 65.579246068483, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.616501988243, "lon": -4.3349587520452, "size": "0", "text": "n", "textAngle": 66.974057585604, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.616440338671, "lon": -4.3349159608914, "size": "0", "text": "g", "textAngle": 68.368869102724, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.61637809103, "lon": -4.3348757185189, "size": "0", "text": "", "textAngle": 69.763680619845, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.616315282209, "lon": -4.3348380487757, "size": "0", "text": "b", "textAngle": 71.158492136966, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.616251949427, "lon": -4.3348029739848, "size": "0", "text": "r", "textAngle": 72.553303654086, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.616188130218, "lon": -4.3347705149317, "size": "0", "text": "a", "textAngle": 73.948115171207, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.616123862399, "lon": -4.3347406908518, "size": "0", "text": "c", "textAngle": 75.342926688328, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.616059184056, "lon": -4.334713519419, "size": "0", "text": "k", "textAngle": 76.737738205448, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.615994133518, "lon": -4.3346890167352, "size": "0", "text": "e", "textAngle": 78.132549722569, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.615928749334, "lon": -4.3346671973206, "size": "0", "text": "t", "textAngle": 79.52736123969, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.615863070252, "lon": -4.3346480741057, "size": "0", "text": "", "textAngle": 80.92217275681, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.615797135191, "lon": -4.3346316584228, "size": "0", "text": "(", "textAngle": 82.316984273931, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, 

{ "lat": 53.615730983227, "lon": -4.33461796, "size": "0", "text": "d", "textAngle": 83.711795791052, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.615664653561, "lon": -4.334606986955, "size": "0", "text": "o", "textAngle": 85.106607308173, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.6155981855, "lon": -4.3345987457904, "size": "0", "text": "w", "textAngle": 86.501418825293, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}, { "lat": 53.615531618433, "lon": -4.3345932413901, "size": "0", "text": "n", "textAngle": 87.896230342414, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#AA1205"


}


, { "lat": 0.1, "lon": 0.1, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


}
















     ],
     "transform": [
       {
         "type": "geo",
         "projection": "mercator",
         "scale": {"expr": "imgTileSize/PI/2*pow(2,imgZoom)"},
         "translate": [{"expr": "imgXC"}, {"expr": "imgYC"}],
         "center": [{"expr": "imgLon"}, {"expr": "imgLat"}],
         "lon": "lon", "lat": "lat"
       },
       { "type": "formula", "field":"layout_x", "expr": "datum.layout_x + (datum.offsetX || 0)" },
       { "type": "formula", "field":"layout_y", "expr": "datum.layout_y + (datum.offsetY || 0)" },
       { "type": "formula", "field":"color", "expr": "datum.color || '#c33'" },
       { "type": "formula", "field":"textColor", "expr": "datum.textColor || datum.color" },
       { "type": "formula", "field":"strokeColor", "expr": "datum.strokeColor || '#ffe7e6'" }
     ]
   },
   {
     // Hack: single value data source for drawing/hiding images and other non-series elements
     "name": "dummyData",
     "values": [{}]
   }
 ],

// Legend only works if showLegend and colorScaleField are set

 "marks": [
   {
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "formula", "field":"url", "expr": "'mapsnapshot:///?width='+imgWidth+'&height='+imgHeight+'&zoom='+imgZoom+'&lat='+imgLat+'&lon='+imgLon" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"field": "url"},
         "xc": {"signal": "imgXC"}, "yc": {"signal": "imgYC"},
         "width": {"signal": "imgWidth"}, "height": {"signal": "imgHeight"}
       }
     }
   },
   {
     // Places an image of a given name and size at the [lan,lon] location
     "type": "image",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.img" },
         { "type": "formula", "field":"iconWidth", "expr": "datum.width || 0" },
         { "type": "formula", "field":"iconHeight", "expr": "datum.height || 0" },
         { "type": "formula", "field":"img",
           "expr": "if(!test(/^[a-z]+:\\/\\//, datum.img), 'wikifile:///'+datum.img, datum.img)" },
         // Ensure that either width or height parameter is passed to wikifile:// request
         { "type": "formula", "field":"img",
           "expr": "if((datum.iconWidth || datum.iconHeight) && !test(/[?&](width|height)=\\d/, datum.img),if(datum.iconWidth,datum.img+'?width='+datum.iconWidth,datum.img+'?height='+datum.iconHeight), datum.img)" }
     ]},
     "properties": {
       "enter": {
         "url": {"field": "img"},
         "xc": {"field": "layout_x"}, "yc": {"field": "layout_y"},
         "width": {"field": "iconWidth"}, "height": {"field": "iconHeight"}
       }
     }
   },
   {
     // Draw marks of a given color, shape, and size at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "data",
       "transform": [{ "type": "filter", "test": "!datum.img" }]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"},
         "y": {"field": "layout_y"},
         // If colorScaleField is set, use color scaling, otherwise use the preset color value
         "fill": { "field": "color" },
         "size": {"field": "size"},
         "shape": {"field": "shape"},
         "stroke": {"field": "strokeColor"}
       }
     }
   },
   {
     // Draw text with the given color and size at the [lan,lon] location
     // See https://github.com/vega/vega/wiki/Marks#text for all parameter description (prepend "text" and capitalize them)
     "type": "text",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.text" },
         // Figure out if this is an LTR or RTL page. For LTR, show label to the right of the icon, left-aligned. For RTL, reverse.
         { "type": "formula", "field":"isLTR", "expr": "'‎' == '\\u200E'" },
         // If these values are not defined ("undefined" is not allowed, so test for truthiness and not 0)
         { "type": "formula", "field":"textDx", "expr": "if(!datum.textDx && datum.textDx != 0, if(datum.isLTR,8,-8), datum.textDx)" },
         { "type": "formula", "field":"textAlign", "expr": "if(!datum.textAlign, if(datum.isLTR,'left','right'), datum.textAlign)" },
         { "type": "formula", "field":"textBaseline", "expr": "datum.textBaseline || 'middle'" }
     ]},
     "properties": {
       "enter": {
         "text": {"field": "text"},
         "x": {"field": "layout_x" },
         "y": {"field": "layout_y"},
         "dx": {"field": "textDx" },
         "dy": {"field": "textDy"},
         "fill": {"field": "textColor"},
         "align": {"field": "textAlign"},
         "baseline": {"field": "textBaseline"},
         "radius": {"field": "textRadius"},
         "theta": {"field": "textTheta"},
         "angle": {"field": "textAngle"},
         "font": {"field": "textFont"},
         "fontSize": {"field": "textFontSize"},
         "fontWeight": {"field": "textFontWeight"},
         "fontStyle": {"field": "textFontStyle"}
       }
     }
   },
   {
     // Draw a low-zoom locator map frame
     "type": "rect",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" }
       ]
     },
     "properties": {
       "enter": {
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth", "offset":2}, "height": {"signal": "picHeight"},
         "stroke": {"value":"#fff"},"strokeWidth": {"value":6}
       }
     }
   },
   {
     // Draw a low-zoom locator map by using a premade world map image
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"url", "expr": "1" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"value": "wikirawupload:"},
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth"}, "height": {"signal": "picHeight"}
       }
     }
   },
   {
     // Draw a zoom-out mark at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"lat", "expr": "imgLat" },
         { "type": "formula", "field":"lon", "expr": "imgLon" },
         {
           "type": "geo",
           "projection": "equirectangular",
           "scale": {"expr": "180/2/PI"},
           "translate": [{"expr": "picXC"}, {"expr": "picYC"}],
           "center": [{"expr": "0"}, {"expr": "0"}],
           "lon": "lon", "lat": "lat"
         }
       ]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"}, "y": {"field": "layout_y"},
         "fill": {"value": "#c33"},
         "stroke": {"value": "#ffe7e6"},
         "size": {"value": 40}
       }
     }
   }
 ]

} </graph>

arc-angleA=60
arc-gapA=2.5
arc-radiusA=0.4

Multi marker example

<graph>

{

 //
 // ATTENTION: This code is maintained at https://www.mediawiki.org/wiki/Template:Graph:Street_map_with_marks
 //            Please do not modify it anywhere else, as it may get copied and override your changes.
 //            Suggestions can be made at https://www.mediawiki.org/wiki/Template_talk:Graph:Street_map_with_marks
 //
 // Template translation is in https://commons.wikimedia.org/wiki/Data:Original/Template:Graphs.tab
 //
 "version": 2, "width":, "height": , "padding": 0,
 "signals":[
   // These signals allow us to quickly move the map within the image, e.g. to leave space for the legend

{"name":"legendWidth", "init": {"expr": "0"} },

   {"name":"legendHeight", "init": {"expr": "height"} },
   {"name":"imgWidth", "init": {"expr": "width-legendWidth"} },
   {"name":"imgHeight", "init": {"expr": "height"} },
   {"name":"imgXC", "init": {"expr": "imgWidth/2"} },
   {"name":"imgYC", "init": {"expr": "imgHeight/2"} },
   {"name":"imgTileSize", "init": {"expr": "256"} },
   {"name":"imgLat", "init": {"expr": "52.0"} },
   {"name":"imgLon", "init": {"expr": "-4.810"} },
   {"name":"imgZoom", "init": {"expr": ""} },
   {"name":"picWidth", "init": {"expr": "180"} },
   {"name":"picHeight", "init": {"expr": "picWidth/2"} },
   {"name":"picXC", "init": {"expr": "imgWidth-(picWidth/2)"} },
   {"name":"picYC", "init": {"expr": "imgHeight-(picHeight/2)"} },
   {"name":"showMiniMap", "init": {"expr": "0"} }
 ],
 "data": [
   {
     "name": "data",

// Otherwise use the first unnamed argument for source values

     "values": [  { "lat": 52.0, 
    "lon": -4.810, 
    "img": "wikirawupload:https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Mapscaleline.svg/120px-Mapscaleline.svg.png", 
    "width": 50, 
    "height": 8, 
    "offsetX": Expression error: Unexpected / operator., 
    "offsetY": Expression error: Unexpected / operator., 
    "textAlign": "right", 
    "textDx": 22, 
    "textDy": -2, 
    "textColor": "grey", 
    "textFont": "Tahoma", 
    "textFontSize": 9, 
    "text":  "10 000km" }

, { "lat": 51.9990, "lon": -4.7700, Expression error: Unexpected = operator. "text": "Pentre Ifan", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#333322"


} , { "lat": 52.045, "lon": -4.897, "size": "0", "text": "C", "textAngle": -370, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, 

{ "lat": 52.04532042143, "lon": -4.8940929419853, "size": "0", "text": "a", "textAngle": -371.10367270817, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, 

{ "lat": 52.045673916189, "lon": -4.891196853644, "size": "0", "text": "r", "textAngle": -372.20734541633, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, 

{ "lat": 52.046060353118, "lon": -4.8883128095436, "size": "0", "text": "d", "textAngle": -373.3110181245, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, 

{ "lat": 52.046479588831, "lon": -4.8854418797829, "size": "0", "text": "i", "textAngle": -374.41469083266, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, 

{ "lat": 52.046931467776, "lon": -4.8825851295944, "size": "0", "text": "g", "textAngle": -375.51836354083, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, 

{ "lat": 52.047415822286, "lon": -4.8797436189497, "size": "0", "text": "a", "textAngle": -376.622036249, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, 

{ "lat": 52.047932472647, "lon": -4.8769184021657, "size": "0", "text": "n", "textAngle": -377.72570895716, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, 

{ "lat": 52.04848122716, "lon": -4.8741105275137, "size": "0", "text": "", "textAngle": -378.82938166533, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, 

{ "lat": 52.049061882214, "lon": -4.8713210368304, "size": "0", "text": "B", "textAngle": -379.93305437349, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, 

{ "lat": 52.049674222362, "lon": -4.8685509651312, "size": "0", "text": "a", "textAngle": -381.03672708166, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, 

{ "lat": 52.050318020402, "lon": -4.8658013402263, "size": "0", "text": "y", "textAngle": -382.14039978983, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, 

{ "lat": 52.050993037457, "lon": -4.8630731823393, "size": "0", "text": "", "textAngle": -383.24407249799, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, { "lat": 52.05169902307, "lon": -4.8603675037287, "size": "0", "text": "", "textAngle": -384.34774520616, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, { "lat": 52.052435715289, "lon": -4.8576853083121, "size": "0", "text": "", "textAngle": -385.45141791433, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, 

{ "lat": 52.053202840773, "lon": -4.8550275912942, "size": "0", "text": "", "textAngle": -386.55509062249, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, 

{ "lat": 52.054000114885, "lon": -4.8523953387968, "size": "0", "text": "", "textAngle": -387.65876333066, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, 

{ "lat": 52.054827241806, "lon": -4.8497895274936, "size": "0", "text": "", "textAngle": -388.76243603882, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, { "lat": 52.055683914636, "lon": -4.8472111242475, "size": "0", "text": "", "textAngle": -389.86610874699, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, { "lat": 52.056569815515, "lon": -4.8446610857518, "size": "0", "text": "", "textAngle": -390.96978145516, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


}, { "lat": 52.057484615737, "lon": -4.8421403581753, "size": "0", "text": "", "textAngle": -392.07345416332, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#77A1CB"


} , { "lat": 51.998, "lon": -4.88, "size": "0", "text": "P", "textAngle": -290, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, 

{ "lat": 51.99481598661, "lon": -4.8779201867004, "size": "0", "text": "R", "textAngle": -292.26421092198, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, 

{ "lat": 51.991683079518, "lon": -4.8756294071954, "size": "0", "text": "E", "textAngle": -294.52842184397, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, 

{ "lat": 51.988606170645, "lon": -4.8731312384548, "size": "0", "text": "S", "textAngle": -296.79263276595, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, 

{ "lat": 51.985590064474, "lon": -4.8704295812792, "size": "0", "text": "E", "textAngle": -299.05684368793, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, 

{ "lat": 51.982639470545, "lon": -4.867528654209, "size": "0", "text": "L", "textAngle": -301.32105460992, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, 

{ "lat": 51.979758996105, "lon": -4.8644329869375, "size": "0", "text": "I", "textAngle": -303.5852655319, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, 

{ "lat": 51.976953138912, "lon": -4.8611474132375, "size": "0", "text": "", "textAngle": -305.84947645388, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, 

{ "lat": 51.97422628021, "lon": -4.8576770634143, "size": "0", "text": "H", "textAngle": -308.11368737587, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, 

{ "lat": 51.97158267789, "lon": -4.8540273562941, "size": "0", "text": "I", "textAngle": -310.37789829785, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, 

{ "lat": 51.969026459844, "lon": -4.8502039907633, "size": "0", "text": "L", "textAngle": -312.64210921983, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, 

{ "lat": 51.966561617513, "lon": -4.8462129368695, "size": "0", "text": "L", "textAngle": -314.90632014182, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, 

{ "lat": 51.964191999659, "lon": -4.8420604264997, "size": "0", "text": "S", "textAngle": -317.1705310638, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, { "lat": 51.961921306357, "lon": -4.8377529436495, "size": "0", "text": "", "textAngle": -319.43474198578, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, { "lat": 51.959753083211, "lon": -4.8332972142981, "size": "0", "text": "", "textAngle": -321.69895290777, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, 

{ "lat": 51.957690715824, "lon": -4.8287001959067, "size": "0", "text": "", "textAngle": -323.96316382975, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, 

{ "lat": 51.955737424509, "lon": -4.823969066554, "size": "0", "text": "", "textAngle": -326.22737475173, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, 

{ "lat": 51.953896259259, "lon": -4.8191112137282, "size": "0", "text": "", "textAngle": -328.49158567372, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, { "lat": 51.952170094989, "lon": -4.8141342227916, "size": "0", "text": "", "textAngle": -330.7557965957, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, { "lat": 51.95056162704, "lon": -4.8090458651364, "size": "0", "text": "", "textAngle": -333.02000751768, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, { "lat": 51.949073366979, "lon": -4.8038540860501, "size": "0", "text": "", "textAngle": -335.28421843967, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}

, { "lat": 52.0545, "lon": -4.7717, Expression error: Unexpected = operator. "text": "Llech-y-Tribedd dolmen", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755"


} , { "lat": 52.0186, "lon": -4.8282, Expression error: Unexpected = operator. "text": "Carreg Coetan", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755" }, { "lat": 52.0186, "lon": -4.8282,

"shape": "circle", 
"size": "0", 
"text": "Arthur dolmen", 

"textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755"


} , { "lat": 51.9409, "lon": -4.823, Expression error: Unexpected = operator. "text": "Banc Du", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755" }, { "lat": 51.9409, "lon": -4.823,

"shape": "circle", 
"size": "0", 
"text": "Neolithic enclosure", 

"textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755"


} , { "lat": 51.9775, "lon": -4.7563, Expression error: Unexpected = operator. "text": "Bedd yr Afanc", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755" }, { "lat": 51.9775, "lon": -4.7563,

"shape": "circle", 
"size": "0", 
"text": "Burial Chamber", 

"textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755"


} , { "lat": 51.9685, "lon": -4.7945, Expression error: Unexpected = operator. "text": "Standing Stones", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755"


} , { "lat": 52.0478, "lon": -4.7982, Expression error: Unexpected = operator. "text": "Trellyffaint dolmen", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755"


} , { "lat": 52.0137, "lon": -4.8627, Expression error: Unexpected = operator. "text": "Cerig-y-Gof", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755" }, { "lat": 52.0137, "lon": -4.8627,

"shape": "circle", 
"size": "0", 
"text": "chambered tomb", 

"textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755"


} , { "lat": 51.9597, "lon": -4.7223, Expression error: Unexpected = operator. "text": "Bedd Arthur stone circle", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755"


}













     ],
     "transform": [
       {
         "type": "geo",
         "projection": "mercator",
         "scale": {"expr": "imgTileSize/PI/2*pow(2,imgZoom)"},
         "translate": [{"expr": "imgXC"}, {"expr": "imgYC"}],
         "center": [{"expr": "imgLon"}, {"expr": "imgLat"}],
         "lon": "lon", "lat": "lat"
       },
       { "type": "formula", "field":"layout_x", "expr": "datum.layout_x + (datum.offsetX || 0)" },
       { "type": "formula", "field":"layout_y", "expr": "datum.layout_y + (datum.offsetY || 0)" },
       { "type": "formula", "field":"color", "expr": "datum.color || '#c33'" },
       { "type": "formula", "field":"textColor", "expr": "datum.textColor || datum.color" },
       { "type": "formula", "field":"strokeColor", "expr": "datum.strokeColor || '#ffe7e6'" }
     ]
   },
   {
     // Hack: single value data source for drawing/hiding images and other non-series elements
     "name": "dummyData",
     "values": [{}]
   }
 ],

// Legend only works if showLegend and colorScaleField are set

 "marks": [
   {
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "formula", "field":"url", "expr": "'mapsnapshot:///?width='+imgWidth+'&height='+imgHeight+'&zoom='+imgZoom+'&lat='+imgLat+'&lon='+imgLon" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"field": "url"},
         "xc": {"signal": "imgXC"}, "yc": {"signal": "imgYC"},
         "width": {"signal": "imgWidth"}, "height": {"signal": "imgHeight"}
       }
     }
   },
   {
     // Places an image of a given name and size at the [lan,lon] location
     "type": "image",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.img" },
         { "type": "formula", "field":"iconWidth", "expr": "datum.width || 0" },
         { "type": "formula", "field":"iconHeight", "expr": "datum.height || 0" },
         { "type": "formula", "field":"img",
           "expr": "if(!test(/^[a-z]+:\\/\\//, datum.img), 'wikifile:///'+datum.img, datum.img)" },
         // Ensure that either width or height parameter is passed to wikifile:// request
         { "type": "formula", "field":"img",
           "expr": "if((datum.iconWidth || datum.iconHeight) && !test(/[?&](width|height)=\\d/, datum.img),if(datum.iconWidth,datum.img+'?width='+datum.iconWidth,datum.img+'?height='+datum.iconHeight), datum.img)" }
     ]},
     "properties": {
       "enter": {
         "url": {"field": "img"},
         "xc": {"field": "layout_x"}, "yc": {"field": "layout_y"},
         "width": {"field": "iconWidth"}, "height": {"field": "iconHeight"}
       }
     }
   },
   {
     // Draw marks of a given color, shape, and size at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "data",
       "transform": [{ "type": "filter", "test": "!datum.img" }]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"},
         "y": {"field": "layout_y"},
         // If colorScaleField is set, use color scaling, otherwise use the preset color value
         "fill": { "field": "color" },
         "size": {"field": "size"},
         "shape": {"field": "shape"},
         "stroke": {"field": "strokeColor"}
       }
     }
   },
   {
     // Draw text with the given color and size at the [lan,lon] location
     // See https://github.com/vega/vega/wiki/Marks#text for all parameter description (prepend "text" and capitalize them)
     "type": "text",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.text" },
         // Figure out if this is an LTR or RTL page. For LTR, show label to the right of the icon, left-aligned. For RTL, reverse.
         { "type": "formula", "field":"isLTR", "expr": "'‎' == '\\u200E'" },
         // If these values are not defined ("undefined" is not allowed, so test for truthiness and not 0)
         { "type": "formula", "field":"textDx", "expr": "if(!datum.textDx && datum.textDx != 0, if(datum.isLTR,8,-8), datum.textDx)" },
         { "type": "formula", "field":"textAlign", "expr": "if(!datum.textAlign, if(datum.isLTR,'left','right'), datum.textAlign)" },
         { "type": "formula", "field":"textBaseline", "expr": "datum.textBaseline || 'middle'" }
     ]},
     "properties": {
       "enter": {
         "text": {"field": "text"},
         "x": {"field": "layout_x" },
         "y": {"field": "layout_y"},
         "dx": {"field": "textDx" },
         "dy": {"field": "textDy"},
         "fill": {"field": "textColor"},
         "align": {"field": "textAlign"},
         "baseline": {"field": "textBaseline"},
         "radius": {"field": "textRadius"},
         "theta": {"field": "textTheta"},
         "angle": {"field": "textAngle"},
         "font": {"field": "textFont"},
         "fontSize": {"field": "textFontSize"},
         "fontWeight": {"field": "textFontWeight"},
         "fontStyle": {"field": "textFontStyle"}
       }
     }
   },
   {
     // Draw a low-zoom locator map frame
     "type": "rect",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" }
       ]
     },
     "properties": {
       "enter": {
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth", "offset":2}, "height": {"signal": "picHeight"},
         "stroke": {"value":"#fff"},"strokeWidth": {"value":6}
       }
     }
   },
   {
     // Draw a low-zoom locator map by using a premade world map image
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"url", "expr": "1" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"value": "wikirawupload:"},
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth"}, "height": {"signal": "picHeight"}
       }
     }
   },
   {
     // Draw a zoom-out mark at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"lat", "expr": "imgLat" },
         { "type": "formula", "field":"lon", "expr": "imgLon" },
         {
           "type": "geo",
           "projection": "equirectangular",
           "scale": {"expr": "180/2/PI"},
           "translate": [{"expr": "picXC"}, {"expr": "picYC"}],
           "center": [{"expr": "0"}, {"expr": "0"}],
           "lon": "lon", "lat": "lat"
         }
       ]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"}, "y": {"field": "layout_y"},
         "fill": {"value": "#c33"},
         "stroke": {"value": "#ffe7e6"},
         "size": {"value": 40}
       }
     }
   }
 ]

} </graph>

Pentre Ifan and other nearby Neolithic sites
Worked example of a map with multiple markers and text: Pentre Ifan
<source lang="html">
<graph>

{

 //
 // ATTENTION: This code is maintained at https://www.mediawiki.org/wiki/Template:Graph:Street_map_with_marks
 //            Please do not modify it anywhere else, as it may get copied and override your changes.
 //            Suggestions can be made at https://www.mediawiki.org/wiki/Template_talk:Graph:Street_map_with_marks
 //
 // Template translation is in https://commons.wikimedia.org/wiki/Data:Original/Template:Graphs.tab
 //
 "version": 2, "width":, "height": , "padding": 0,
 "signals":[
   // These signals allow us to quickly move the map within the image, e.g. to leave space for the legend

{"name":"legendWidth", "init": {"expr": "0"} },

   {"name":"legendHeight", "init": {"expr": "height"} },
   {"name":"imgWidth", "init": {"expr": "width-legendWidth"} },
   {"name":"imgHeight", "init": {"expr": "height"} },
   {"name":"imgXC", "init": {"expr": "imgWidth/2"} },
   {"name":"imgYC", "init": {"expr": "imgHeight/2"} },
   {"name":"imgTileSize", "init": {"expr": "256"} },
   {"name":"imgLat", "init": {"expr": "52.0"} },
   {"name":"imgLon", "init": {"expr": "-4.810"} },
   {"name":"imgZoom", "init": {"expr": ""} },
   {"name":"picWidth", "init": {"expr": "180"} },
   {"name":"picHeight", "init": {"expr": "picWidth/2"} },
   {"name":"picXC", "init": {"expr": "imgWidth-(picWidth/2)"} },
   {"name":"picYC", "init": {"expr": "imgHeight-(picHeight/2)"} },
   {"name":"showMiniMap", "init": {"expr": "0"} }
 ],
 "data": [
   {
     "name": "data",

// Otherwise use the first unnamed argument for source values

     "values": [  { "lat": 52.0, 
    "lon": -4.810, 
    "img": "wikirawupload:https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Mapscaleline.svg/120px-Mapscaleline.svg.png", 
    "width": 50, 
    "height": 8, 
    "offsetX": Expression error: Unexpected / operator., 
    "offsetY": Expression error: Unexpected / operator., 
    "textAlign": "right", 
    "textDx": 22, 
    "textDy": -2, 
    "textColor": "grey", 
    "textFont": "Tahoma", 
    "textFontSize": 9, 
    "text":  "10 000km" }

, { "lat": 51.9990, "lon": -4.7700, Expression error: Unexpected = operator. "text": "Pentre Ifan", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#333322"


}

, { "lat": 52, "lon": -4.88, "size": "0", "text": "P", "textAngle": -290, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, 

{ "lat": 51.996893196277, "lon": -4.8779735282596, "size": "0", "text": "R", "textAngle": -292.20898626535, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, 

{ "lat": 51.993834919855, "lon": -4.8757461844197, "size": "0", "text": "E", "textAngle": -294.4179725307, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, 

{ "lat": 51.990829716046, "lon": -4.8733212788327, "size": "0", "text": "S", "textAngle": -296.62695879605, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, 

{ "lat": 51.987882051284, "lon": -4.870702415474, "size": "0", "text": "S", "textAngle": -298.8359450614, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, 

{ "lat": 51.984996306488, "lon": -4.8678934865853, "size": "0", "text": "E", "textAngle": -301.04493132675, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, 

{ "lat": 51.982176770545, "lon": -4.8648986668901, "size": "0", "text": "L", "textAngle": -303.2539175921, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, 

{ "lat": 51.979427633945, "lon": -4.861722407389, "size": "0", "text": "I", "textAngle": -305.46290385745, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, 

{ "lat": 51.976752982546, "lon": -4.8583694287445, "size": "0", "text": "", "textAngle": -307.6718901228, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, 

{ "lat": 51.974156791503, "lon": -4.8548447142648, "size": "0", "text": "H", "textAngle": -309.88087638815, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, 

{ "lat": 51.971642919362, "lon": -4.8511535024978, "size": "0", "text": "I", "textAngle": -312.0898626535, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, 

{ "lat": 51.969215102323, "lon": -4.8473012794451, "size": "0", "text": "L", "textAngle": -314.29884891885, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, 

{ "lat": 51.966876948689, "lon": -4.8432937704087, "size": "0", "text": "L", "textAngle": -316.5078351842, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, { "lat": 51.964631933501, "lon": -4.8391369314817, "size": "0", "text": "S", "textAngle": -318.71682144954, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, { "lat": 51.962483393376, "lon": -4.8348369406963, "size": "0", "text": "", "textAngle": -320.92580771489, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, 

{ "lat": 51.960434521545, "lon": -4.8304001888417, "size": "0", "text": "", "textAngle": -323.13479398024, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, 

{ "lat": 51.95848836311, "lon": -4.8258332699661, "size": "0", "text": "", "textAngle": -325.34378024559, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, 

{ "lat": 51.956647810515, "lon": -4.821142971576, "size": "0", "text": "", "textAngle": -327.55276651094, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, { "lat": 51.954915599252, "lon": -4.8163362645489, "size": "0", "text": "", "textAngle": -329.76175277629, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, { "lat": 51.953294303791, "lon": -4.8114202927725, "size": "0", "text": "", "textAngle": -331.97073904164, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}, { "lat": 51.951786333754, "lon": -4.8064023625275, "size": "0", "text": "", "textAngle": -334.17972530699, "textAlign": "center", "textBaseline": "bottom", "textDx": 0, "textDy": -2, "textFontSize": , "textColor": "#81AF81"


}

, { "lat": 52.0545, "lon": -4.7717, Expression error: Unexpected = operator. "text": "Llech-y-Tribedd dolmen", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755"


} , { "lat": 52.0186, "lon": -4.8282, Expression error: Unexpected = operator. "text": "Carreg Coetan", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755" }, { "lat": 52.0186, "lon": -4.8282,

"shape": "circle", 
"size": "0", 
"text": "Arthur dolmen", 

"textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755"


} , { "lat": 51.9409, "lon": -4.823, Expression error: Unexpected = operator. "text": "Banc Du", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755" }, { "lat": 51.9409, "lon": -4.823,

"shape": "circle", 
"size": "0", 
"text": "Neolithic enclosure", 

"textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755"


} , { "lat": 51.9775, "lon": -4.7563, Expression error: Unexpected = operator. "text": "Bedd yr Afanc", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755" }, { "lat": 51.9775, "lon": -4.7563,

"shape": "circle", 
"size": "0", 
"text": "Burial Chamber", 

"textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755"


} , { "lat": 51.9685, "lon": -4.7945, Expression error: Unexpected = operator. "text": "Standing Stones", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755"


} , { "lat": 52.0478, "lon": -4.7982, Expression error: Unexpected = operator. "text": "Trellyffaint dolmen", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755"


} , { "lat": 52.0137, "lon": -4.8627, Expression error: Unexpected = operator. "text": "Cerig-y-Gof", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755" }, { "lat": 52.0137, "lon": -4.8627,

"shape": "circle", 
"size": "0", 
"text": "chambered tomb", 

"textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755"


} , { "lat": 51.9597, "lon": -4.7223, Expression error: Unexpected = operator. "text": "Bedd Arthur stone circle", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755"


}













     ],
     "transform": [
       {
         "type": "geo",
         "projection": "mercator",
         "scale": {"expr": "imgTileSize/PI/2*pow(2,imgZoom)"},
         "translate": [{"expr": "imgXC"}, {"expr": "imgYC"}],
         "center": [{"expr": "imgLon"}, {"expr": "imgLat"}],
         "lon": "lon", "lat": "lat"
       },
       { "type": "formula", "field":"layout_x", "expr": "datum.layout_x + (datum.offsetX || 0)" },
       { "type": "formula", "field":"layout_y", "expr": "datum.layout_y + (datum.offsetY || 0)" },
       { "type": "formula", "field":"color", "expr": "datum.color || '#c33'" },
       { "type": "formula", "field":"textColor", "expr": "datum.textColor || datum.color" },
       { "type": "formula", "field":"strokeColor", "expr": "datum.strokeColor || '#ffe7e6'" }
     ]
   },
   {
     // Hack: single value data source for drawing/hiding images and other non-series elements
     "name": "dummyData",
     "values": [{}]
   }
 ],

// Legend only works if showLegend and colorScaleField are set

 "marks": [
   {
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "formula", "field":"url", "expr": "'mapsnapshot:///?width='+imgWidth+'&height='+imgHeight+'&zoom='+imgZoom+'&lat='+imgLat+'&lon='+imgLon" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"field": "url"},
         "xc": {"signal": "imgXC"}, "yc": {"signal": "imgYC"},
         "width": {"signal": "imgWidth"}, "height": {"signal": "imgHeight"}
       }
     }
   },
   {
     // Places an image of a given name and size at the [lan,lon] location
     "type": "image",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.img" },
         { "type": "formula", "field":"iconWidth", "expr": "datum.width || 0" },
         { "type": "formula", "field":"iconHeight", "expr": "datum.height || 0" },
         { "type": "formula", "field":"img",
           "expr": "if(!test(/^[a-z]+:\\/\\//, datum.img), 'wikifile:///'+datum.img, datum.img)" },
         // Ensure that either width or height parameter is passed to wikifile:// request
         { "type": "formula", "field":"img",
           "expr": "if((datum.iconWidth || datum.iconHeight) && !test(/[?&](width|height)=\\d/, datum.img),if(datum.iconWidth,datum.img+'?width='+datum.iconWidth,datum.img+'?height='+datum.iconHeight), datum.img)" }
     ]},
     "properties": {
       "enter": {
         "url": {"field": "img"},
         "xc": {"field": "layout_x"}, "yc": {"field": "layout_y"},
         "width": {"field": "iconWidth"}, "height": {"field": "iconHeight"}
       }
     }
   },
   {
     // Draw marks of a given color, shape, and size at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "data",
       "transform": [{ "type": "filter", "test": "!datum.img" }]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"},
         "y": {"field": "layout_y"},
         // If colorScaleField is set, use color scaling, otherwise use the preset color value
         "fill": { "field": "color" },
         "size": {"field": "size"},
         "shape": {"field": "shape"},
         "stroke": {"field": "strokeColor"}
       }
     }
   },
   {
     // Draw text with the given color and size at the [lan,lon] location
     // See https://github.com/vega/vega/wiki/Marks#text for all parameter description (prepend "text" and capitalize them)
     "type": "text",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.text" },
         // Figure out if this is an LTR or RTL page. For LTR, show label to the right of the icon, left-aligned. For RTL, reverse.
         { "type": "formula", "field":"isLTR", "expr": "'‎' == '\\u200E'" },
         // If these values are not defined ("undefined" is not allowed, so test for truthiness and not 0)
         { "type": "formula", "field":"textDx", "expr": "if(!datum.textDx && datum.textDx != 0, if(datum.isLTR,8,-8), datum.textDx)" },
         { "type": "formula", "field":"textAlign", "expr": "if(!datum.textAlign, if(datum.isLTR,'left','right'), datum.textAlign)" },
         { "type": "formula", "field":"textBaseline", "expr": "datum.textBaseline || 'middle'" }
     ]},
     "properties": {
       "enter": {
         "text": {"field": "text"},
         "x": {"field": "layout_x" },
         "y": {"field": "layout_y"},
         "dx": {"field": "textDx" },
         "dy": {"field": "textDy"},
         "fill": {"field": "textColor"},
         "align": {"field": "textAlign"},
         "baseline": {"field": "textBaseline"},
         "radius": {"field": "textRadius"},
         "theta": {"field": "textTheta"},
         "angle": {"field": "textAngle"},
         "font": {"field": "textFont"},
         "fontSize": {"field": "textFontSize"},
         "fontWeight": {"field": "textFontWeight"},
         "fontStyle": {"field": "textFontStyle"}
       }
     }
   },
   {
     // Draw a low-zoom locator map frame
     "type": "rect",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" }
       ]
     },
     "properties": {
       "enter": {
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth", "offset":2}, "height": {"signal": "picHeight"},
         "stroke": {"value":"#fff"},"strokeWidth": {"value":6}
       }
     }
   },
   {
     // Draw a low-zoom locator map by using a premade world map image
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"url", "expr": "1" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"value": "wikirawupload:"},
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth"}, "height": {"signal": "picHeight"}
       }
     }
   },
   {
     // Draw a zoom-out mark at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"lat", "expr": "imgLat" },
         { "type": "formula", "field":"lon", "expr": "imgLon" },
         {
           "type": "geo",
           "projection": "equirectangular",
           "scale": {"expr": "180/2/PI"},
           "translate": [{"expr": "picXC"}, {"expr": "picYC"}],
           "center": [{"expr": "0"}, {"expr": "0"}],
           "lon": "lon", "lat": "lat"
         }
       ]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"}, "y": {"field": "layout_y"},
         "fill": {"value": "#c33"},
         "stroke": {"value": "#ffe7e6"},
         "size": {"value": 40}
       }
     }
   }
 ]

} </graph>

Pentre Ifan and other nearby Neolithic sites

</source>

Alternative marks

Instead of using the standard 'Red pog' for mark points on the map, other images can be used. Any image from Wikimedia Commons can be specified. The Pentre Ifan example above uses 'Archaeological site icon (red).svg'. If a particular image file is specified in mark1=, all subsequent marks will use it as well unless they name their own image file. If the image is not square, a dimension value also needs to be set (width ratio for a height of 1)

Transparent overlay

<graph>

{

 //
 // ATTENTION: This code is maintained at https://www.mediawiki.org/wiki/Template:Graph:Street_map_with_marks
 //            Please do not modify it anywhere else, as it may get copied and override your changes.
 //            Suggestions can be made at https://www.mediawiki.org/wiki/Template_talk:Graph:Street_map_with_marks
 //
 // Template translation is in https://commons.wikimedia.org/wiki/Data:Original/Template:Graphs.tab
 //
 "version": 2, "width":, "height": , "padding": 0,
 "signals":[
   // These signals allow us to quickly move the map within the image, e.g. to leave space for the legend

{"name":"legendWidth", "init": {"expr": "0"} },

   {"name":"legendHeight", "init": {"expr": "height"} },
   {"name":"imgWidth", "init": {"expr": "width-legendWidth"} },
   {"name":"imgHeight", "init": {"expr": "height"} },
   {"name":"imgXC", "init": {"expr": "imgWidth/2"} },
   {"name":"imgYC", "init": {"expr": "imgHeight/2"} },
   {"name":"imgTileSize", "init": {"expr": "256"} },
   {"name":"imgLat", "init": {"expr": "52.6328"} },
   {"name":"imgLon", "init": {"expr": "-1.138"} },
   {"name":"imgZoom", "init": {"expr": ""} },
   {"name":"picWidth", "init": {"expr": "180"} },
   {"name":"picHeight", "init": {"expr": "picWidth/2"} },
   {"name":"picXC", "init": {"expr": "imgWidth-(picWidth/2)"} },
   {"name":"picYC", "init": {"expr": "imgHeight-(picHeight/2)"} },
   {"name":"showMiniMap", "init": {"expr": "0"} }
 ],
 "data": [
   {
     "name": "data",

// Otherwise use the first unnamed argument for source values

     "values": [  { "lat": 52.6328, 
    "lon": -1.138, 
    "img": "wikirawupload:https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Mapscaleline.svg/120px-Mapscaleline.svg.png", 
    "width": 50, 
    "height": 8, 
    "offsetX": Expression error: Unexpected / operator., 
    "offsetY": Expression error: Unexpected / operator., 
    "textAlign": "right", 
    "textDx": 22, 
    "textDy": -2, 
    "textColor": "grey", 
    "textFont": "Tahoma", 
    "textFontSize": 9, 
    "text":  "10 000km" }

, { "lat": 52.6328, "lon": -1.1380, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


}


, { "lat": 52.632333, "lon": -1.141194, Expression error: Unexpected = operator. "text": "Leicester", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205" }, { "lat": 52.632333, "lon": -1.141194,

"shape": "circle", 
"size": "0", 
"text": "Castle", 

"textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


} , { "lat": 52.630, "lon": -1.1458, Expression error: Unexpected = operator. "text": "River Soar", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#77A1CB"


}
















     ],
     "transform": [
       {
         "type": "geo",
         "projection": "mercator",
         "scale": {"expr": "imgTileSize/PI/2*pow(2,imgZoom)"},
         "translate": [{"expr": "imgXC"}, {"expr": "imgYC"}],
         "center": [{"expr": "imgLon"}, {"expr": "imgLat"}],
         "lon": "lon", "lat": "lat"
       },
       { "type": "formula", "field":"layout_x", "expr": "datum.layout_x + (datum.offsetX || 0)" },
       { "type": "formula", "field":"layout_y", "expr": "datum.layout_y + (datum.offsetY || 0)" },
       { "type": "formula", "field":"color", "expr": "datum.color || '#c33'" },
       { "type": "formula", "field":"textColor", "expr": "datum.textColor || datum.color" },
       { "type": "formula", "field":"strokeColor", "expr": "datum.strokeColor || '#ffe7e6'" }
     ]
   },
   {
     // Hack: single value data source for drawing/hiding images and other non-series elements
     "name": "dummyData",
     "values": [{}]
   }
 ],

// Legend only works if showLegend and colorScaleField are set

 "marks": [
   {
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "formula", "field":"url", "expr": "'mapsnapshot:///?width='+imgWidth+'&height='+imgHeight+'&zoom='+imgZoom+'&lat='+imgLat+'&lon='+imgLon" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"field": "url"},
         "xc": {"signal": "imgXC"}, "yc": {"signal": "imgYC"},
         "width": {"signal": "imgWidth"}, "height": {"signal": "imgHeight"}
       }
     }
   },
   {
     // Places an image of a given name and size at the [lan,lon] location
     "type": "image",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.img" },
         { "type": "formula", "field":"iconWidth", "expr": "datum.width || 0" },
         { "type": "formula", "field":"iconHeight", "expr": "datum.height || 0" },
         { "type": "formula", "field":"img",
           "expr": "if(!test(/^[a-z]+:\\/\\//, datum.img), 'wikifile:///'+datum.img, datum.img)" },
         // Ensure that either width or height parameter is passed to wikifile:// request
         { "type": "formula", "field":"img",
           "expr": "if((datum.iconWidth || datum.iconHeight) && !test(/[?&](width|height)=\\d/, datum.img),if(datum.iconWidth,datum.img+'?width='+datum.iconWidth,datum.img+'?height='+datum.iconHeight), datum.img)" }
     ]},
     "properties": {
       "enter": {
         "url": {"field": "img"},
         "xc": {"field": "layout_x"}, "yc": {"field": "layout_y"},
         "width": {"field": "iconWidth"}, "height": {"field": "iconHeight"}
       }
     }
   },
   {
     // Draw marks of a given color, shape, and size at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "data",
       "transform": [{ "type": "filter", "test": "!datum.img" }]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"},
         "y": {"field": "layout_y"},
         // If colorScaleField is set, use color scaling, otherwise use the preset color value
         "fill": { "field": "color" },
         "size": {"field": "size"},
         "shape": {"field": "shape"},
         "stroke": {"field": "strokeColor"}
       }
     }
   },
   {
     // Draw text with the given color and size at the [lan,lon] location
     // See https://github.com/vega/vega/wiki/Marks#text for all parameter description (prepend "text" and capitalize them)
     "type": "text",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.text" },
         // Figure out if this is an LTR or RTL page. For LTR, show label to the right of the icon, left-aligned. For RTL, reverse.
         { "type": "formula", "field":"isLTR", "expr": "'‎' == '\\u200E'" },
         // If these values are not defined ("undefined" is not allowed, so test for truthiness and not 0)
         { "type": "formula", "field":"textDx", "expr": "if(!datum.textDx && datum.textDx != 0, if(datum.isLTR,8,-8), datum.textDx)" },
         { "type": "formula", "field":"textAlign", "expr": "if(!datum.textAlign, if(datum.isLTR,'left','right'), datum.textAlign)" },
         { "type": "formula", "field":"textBaseline", "expr": "datum.textBaseline || 'middle'" }
     ]},
     "properties": {
       "enter": {
         "text": {"field": "text"},
         "x": {"field": "layout_x" },
         "y": {"field": "layout_y"},
         "dx": {"field": "textDx" },
         "dy": {"field": "textDy"},
         "fill": {"field": "textColor"},
         "align": {"field": "textAlign"},
         "baseline": {"field": "textBaseline"},
         "radius": {"field": "textRadius"},
         "theta": {"field": "textTheta"},
         "angle": {"field": "textAngle"},
         "font": {"field": "textFont"},
         "fontSize": {"field": "textFontSize"},
         "fontWeight": {"field": "textFontWeight"},
         "fontStyle": {"field": "textFontStyle"}
       }
     }
   },
   {
     // Draw a low-zoom locator map frame
     "type": "rect",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" }
       ]
     },
     "properties": {
       "enter": {
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth", "offset":2}, "height": {"signal": "picHeight"},
         "stroke": {"value":"#fff"},"strokeWidth": {"value":6}
       }
     }
   },
   {
     // Draw a low-zoom locator map by using a premade world map image
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"url", "expr": "1" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"value": "wikirawupload:"},
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth"}, "height": {"signal": "picHeight"}
       }
     }
   },
   {
     // Draw a zoom-out mark at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"lat", "expr": "imgLat" },
         { "type": "formula", "field":"lon", "expr": "imgLon" },
         {
           "type": "geo",
           "projection": "equirectangular",
           "scale": {"expr": "180/2/PI"},
           "translate": [{"expr": "picXC"}, {"expr": "picYC"}],
           "center": [{"expr": "0"}, {"expr": "0"}],
           "lon": "lon", "lat": "lat"
         }
       ]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"}, "y": {"field": "layout_y"},
         "fill": {"value": "#c33"},
         "stroke": {"value": "#ffe7e6"},
         "size": {"value": 40}
       }
     }
   }
 ]

} </graph>

Leicester Castle and the line of the medieval town walls

A marker image does not have to be small and opaque. A larger overlay image (with a transparent background) can be used to show particular features not included in the base map, such as a town's former walls (see the adjacent map). Such images can be created in several ways (such as tracing over a copy of the base map); they are invoked like any other marker image file. (For a detailed guide to creating and deploying an overlay for these maps see User:J. Johnson/OSM overlay how-to).

Text color

Color of label text can be specified using label-color = . Standard html colors can be specified by name, and any color can be specified using the hex triplets coding #xxyyzz (see Web colors). However, to create a consistent look and feel across the wikipedia maps, there are some OSM Location map specific colors, with a more muted tone range that fit well with the color scheme of the base maps. In general it is best to make use of this range, unless there are good reasons for using other particular shades for specific features. Under normal usage, the following label color scheme should be followed:-

soft grey Settlements = soft grey (Subject of the map can be hard grey and larger label-size)

Map areas with darker or busier backgrounds may need to move a shade darker to hard grey and dark gray respectively.

soft blue Rivers, lakes, sea areas etc = soft blue (Works well on top of OSM blue areas)
soft green Parkland, national/regional parks, gardens, forests etc = soft green works well on top of OSM green areas. (hard green may be desirable in forests or for the subject of the map)
hard red Individual sites = hard red - especially if no other labels are applied and the site is indicated by a red pog

Full table of color options

Colors recommended for OSM Maps.

These have a more pastel shade than the standard colors, so blend well the map backgrounds

soft red #DB3123 hard red #AA1205 dark red #7A0101
soft green #81AF81 hard green #538253 dark green #165916
soft blue #77A1CB hard blue #5581A9 dark blue #105396
soft grey #AAAA88 hard grey #777755 dark grey #333322
soft brown #CCB56C hard brown #AD7F14 dark brown #8E5913

Text effects

multi-line label
Where label text is too long to fit on a single line, using label = , two further label lines can be used: labela = and labelb = .
Label with no mark
If mark-size=0 this has the effect of a free-floating label with no marker
Angled label
It is possible to specify a label-angle = , which will pivot the label text around the centre of the marker point by the specified angle. Using an angled label which also has no marker is particularly good for labelling various geographic and linear features. A more characterful alternative is to set the text on an arc, using the ArcText options, illustrated by the 'Preseli Hills' text on the Pentre Ifan map. For stylistic consistency settlement and building names should not normally be given an angle.

Numbered dots

<graph>

{

 //
 // ATTENTION: This code is maintained at https://www.mediawiki.org/wiki/Template:Graph:Street_map_with_marks
 //            Please do not modify it anywhere else, as it may get copied and override your changes.
 //            Suggestions can be made at https://www.mediawiki.org/wiki/Template_talk:Graph:Street_map_with_marks
 //
 // Template translation is in https://commons.wikimedia.org/wiki/Data:Original/Template:Graphs.tab
 //
 "version": 2, "width":, "height": , "padding": 0,
 "signals":[
   // These signals allow us to quickly move the map within the image, e.g. to leave space for the legend

{"name":"legendWidth", "init": {"expr": "0"} },

   {"name":"legendHeight", "init": {"expr": "height"} },
   {"name":"imgWidth", "init": {"expr": "width-legendWidth"} },
   {"name":"imgHeight", "init": {"expr": "height"} },
   {"name":"imgXC", "init": {"expr": "imgWidth/2"} },
   {"name":"imgYC", "init": {"expr": "imgHeight/2"} },
   {"name":"imgTileSize", "init": {"expr": "256"} },
   {"name":"imgLat", "init": {"expr": "52.620"} },
   {"name":"imgLon", "init": {"expr": "-1.112"} },
   {"name":"imgZoom", "init": {"expr": ""} },
   {"name":"picWidth", "init": {"expr": "180"} },
   {"name":"picHeight", "init": {"expr": "picWidth/2"} },
   {"name":"picXC", "init": {"expr": "imgWidth-(picWidth/2)"} },
   {"name":"picYC", "init": {"expr": "imgHeight-(picHeight/2)"} },
   {"name":"showMiniMap", "init": {"expr": "0"} }
 ],
 "data": [
   {
     "name": "data",

// Otherwise use the first unnamed argument for source values

     "values": [  { "lat": 52.620, 
    "lon": -1.112, 
    "img": "wikirawupload:https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Mapscaleline.svg/120px-Mapscaleline.svg.png", 
    "width": 50, 
    "height": 8, 
    "offsetX": Expression error: Unexpected / operator., 
    "offsetY": Expression error: Unexpected / operator., 
    "textAlign": "right", 
    "textDx": 22, 
    "textDy": -2, 
    "textColor": "grey", 
    "textFont": "Tahoma", 
    "textFontSize": 9, 
    "text":  "10 000km" }

, { "lat": 0, "lon": 0, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


}


, { "lat": 52.6180, "lon": -1.11189, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


} , { "lat": 52.61819, "lon": -1.11035, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


} , { "lat": 52.62324, "lon": -1.11179, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


} , { "lat": 52.62123, "lon": -1.111297, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


} , { "lat": 52.62009, "lon": -1.11241, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


} , { "lat": 52.61936, "lon": -1.11510, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


}














     ],
     "transform": [
       {
         "type": "geo",
         "projection": "mercator",
         "scale": {"expr": "imgTileSize/PI/2*pow(2,imgZoom)"},
         "translate": [{"expr": "imgXC"}, {"expr": "imgYC"}],
         "center": [{"expr": "imgLon"}, {"expr": "imgLat"}],
         "lon": "lon", "lat": "lat"
       },
       { "type": "formula", "field":"layout_x", "expr": "datum.layout_x + (datum.offsetX || 0)" },
       { "type": "formula", "field":"layout_y", "expr": "datum.layout_y + (datum.offsetY || 0)" },
       { "type": "formula", "field":"color", "expr": "datum.color || '#c33'" },
       { "type": "formula", "field":"textColor", "expr": "datum.textColor || datum.color" },
       { "type": "formula", "field":"strokeColor", "expr": "datum.strokeColor || '#ffe7e6'" }
     ]
   },
   {
     // Hack: single value data source for drawing/hiding images and other non-series elements
     "name": "dummyData",
     "values": [{}]
   }
 ],

// Legend only works if showLegend and colorScaleField are set

 "marks": [
   {
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "formula", "field":"url", "expr": "'mapsnapshot:///?width='+imgWidth+'&height='+imgHeight+'&zoom='+imgZoom+'&lat='+imgLat+'&lon='+imgLon" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"field": "url"},
         "xc": {"signal": "imgXC"}, "yc": {"signal": "imgYC"},
         "width": {"signal": "imgWidth"}, "height": {"signal": "imgHeight"}
       }
     }
   },
   {
     // Places an image of a given name and size at the [lan,lon] location
     "type": "image",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.img" },
         { "type": "formula", "field":"iconWidth", "expr": "datum.width || 0" },
         { "type": "formula", "field":"iconHeight", "expr": "datum.height || 0" },
         { "type": "formula", "field":"img",
           "expr": "if(!test(/^[a-z]+:\\/\\//, datum.img), 'wikifile:///'+datum.img, datum.img)" },
         // Ensure that either width or height parameter is passed to wikifile:// request
         { "type": "formula", "field":"img",
           "expr": "if((datum.iconWidth || datum.iconHeight) && !test(/[?&](width|height)=\\d/, datum.img),if(datum.iconWidth,datum.img+'?width='+datum.iconWidth,datum.img+'?height='+datum.iconHeight), datum.img)" }
     ]},
     "properties": {
       "enter": {
         "url": {"field": "img"},
         "xc": {"field": "layout_x"}, "yc": {"field": "layout_y"},
         "width": {"field": "iconWidth"}, "height": {"field": "iconHeight"}
       }
     }
   },
   {
     // Draw marks of a given color, shape, and size at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "data",
       "transform": [{ "type": "filter", "test": "!datum.img" }]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"},
         "y": {"field": "layout_y"},
         // If colorScaleField is set, use color scaling, otherwise use the preset color value
         "fill": { "field": "color" },
         "size": {"field": "size"},
         "shape": {"field": "shape"},
         "stroke": {"field": "strokeColor"}
       }
     }
   },
   {
     // Draw text with the given color and size at the [lan,lon] location
     // See https://github.com/vega/vega/wiki/Marks#text for all parameter description (prepend "text" and capitalize them)
     "type": "text",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.text" },
         // Figure out if this is an LTR or RTL page. For LTR, show label to the right of the icon, left-aligned. For RTL, reverse.
         { "type": "formula", "field":"isLTR", "expr": "'‎' == '\\u200E'" },
         // If these values are not defined ("undefined" is not allowed, so test for truthiness and not 0)
         { "type": "formula", "field":"textDx", "expr": "if(!datum.textDx && datum.textDx != 0, if(datum.isLTR,8,-8), datum.textDx)" },
         { "type": "formula", "field":"textAlign", "expr": "if(!datum.textAlign, if(datum.isLTR,'left','right'), datum.textAlign)" },
         { "type": "formula", "field":"textBaseline", "expr": "datum.textBaseline || 'middle'" }
     ]},
     "properties": {
       "enter": {
         "text": {"field": "text"},
         "x": {"field": "layout_x" },
         "y": {"field": "layout_y"},
         "dx": {"field": "textDx" },
         "dy": {"field": "textDy"},
         "fill": {"field": "textColor"},
         "align": {"field": "textAlign"},
         "baseline": {"field": "textBaseline"},
         "radius": {"field": "textRadius"},
         "theta": {"field": "textTheta"},
         "angle": {"field": "textAngle"},
         "font": {"field": "textFont"},
         "fontSize": {"field": "textFontSize"},
         "fontWeight": {"field": "textFontWeight"},
         "fontStyle": {"field": "textFontStyle"}
       }
     }
   },
   {
     // Draw a low-zoom locator map frame
     "type": "rect",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" }
       ]
     },
     "properties": {
       "enter": {
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth", "offset":2}, "height": {"signal": "picHeight"},
         "stroke": {"value":"#fff"},"strokeWidth": {"value":6}
       }
     }
   },
   {
     // Draw a low-zoom locator map by using a premade world map image
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"url", "expr": "1" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"value": "wikirawupload:"},
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth"}, "height": {"signal": "picHeight"}
       }
     }
   },
   {
     // Draw a zoom-out mark at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"lat", "expr": "imgLat" },
         { "type": "formula", "field":"lon", "expr": "imgLon" },
         {
           "type": "geo",
           "projection": "equirectangular",
           "scale": {"expr": "180/2/PI"},
           "translate": [{"expr": "picXC"}, {"expr": "picYC"}],
           "center": [{"expr": "0"}, {"expr": "0"}],
           "lon": "lon", "lat": "lat"
         }
       ]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"}, "y": {"field": "layout_y"},
         "fill": {"value": "#c33"},
         "stroke": {"value": "#ffe7e6"},
         "size": {"value": 40}
       }
     }
   }
 ]

} </graph>

Listed buildings in Stoneygate
St John The Baptist Church
Congregational Church
Eastfield, Stanley Road
Stoneygate School
The Firs
White House

If numbered dots are needed, instead of (or as well as) text labels, this can be achieved using the built in shapes. For example, shape1=n-circle will place a numbered dot at that coord position (or l-circle for letters). Generally it is much better to use the dots in sequence, so each numbered mark gives a numbered dot, and they will match the full screen ones. If auto-caption=1 then the caption will generate a numbered list using the mark-title entries. For example:-

<source lang="text">

<graph>

{

 //
 // ATTENTION: This code is maintained at https://www.mediawiki.org/wiki/Template:Graph:Street_map_with_marks
 //            Please do not modify it anywhere else, as it may get copied and override your changes.
 //            Suggestions can be made at https://www.mediawiki.org/wiki/Template_talk:Graph:Street_map_with_marks
 //
 // Template translation is in https://commons.wikimedia.org/wiki/Data:Original/Template:Graphs.tab
 //
 "version": 2, "width":, "height": , "padding": 0,
 "signals":[
   // These signals allow us to quickly move the map within the image, e.g. to leave space for the legend

{"name":"legendWidth", "init": {"expr": "0"} },

   {"name":"legendHeight", "init": {"expr": "height"} },
   {"name":"imgWidth", "init": {"expr": "width-legendWidth"} },
   {"name":"imgHeight", "init": {"expr": "height"} },
   {"name":"imgXC", "init": {"expr": "imgWidth/2"} },
   {"name":"imgYC", "init": {"expr": "imgHeight/2"} },
   {"name":"imgTileSize", "init": {"expr": "256"} },
   {"name":"imgLat", "init": {"expr": "52.620"} },
   {"name":"imgLon", "init": {"expr": "-1.112"} },
   {"name":"imgZoom", "init": {"expr": ""} },
   {"name":"picWidth", "init": {"expr": "180"} },
   {"name":"picHeight", "init": {"expr": "picWidth/2"} },
   {"name":"picXC", "init": {"expr": "imgWidth-(picWidth/2)"} },
   {"name":"picYC", "init": {"expr": "imgHeight-(picHeight/2)"} },
   {"name":"showMiniMap", "init": {"expr": "0"} }
 ],
 "data": [
   {
     "name": "data",

// Otherwise use the first unnamed argument for source values

     "values": [  { "lat": 52.620, 
    "lon": -1.112, 
    "img": "wikirawupload:https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Mapscaleline.svg/120px-Mapscaleline.svg.png", 
    "width": 50, 
    "height": 8, 
    "offsetX": Expression error: Unexpected / operator., 
    "offsetY": Expression error: Unexpected / operator., 
    "textAlign": "right", 
    "textDx": 22, 
    "textDy": -2, 
    "textColor": "grey", 
    "textFont": "Tahoma", 
    "textFontSize": 9, 
    "text":  "10 000km" }

, { "lat": 0, "lon": 0, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


}


, { "lat": 52.6180, "lon": -1.11189, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


} , { "lat": 52.61819, "lon": -1.11035, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


} , { "lat": 52.62324, "lon": -1.11179, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


} , { "lat": 52.62123, "lon": -1.111297, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


} , { "lat": 52.62009, "lon": -1.11241, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


} , { "lat": 52.61936, "lon": -1.11510, Expression error: Unexpected = operator. "text": "", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


}














     ],
     "transform": [
       {
         "type": "geo",
         "projection": "mercator",
         "scale": {"expr": "imgTileSize/PI/2*pow(2,imgZoom)"},
         "translate": [{"expr": "imgXC"}, {"expr": "imgYC"}],
         "center": [{"expr": "imgLon"}, {"expr": "imgLat"}],
         "lon": "lon", "lat": "lat"
       },
       { "type": "formula", "field":"layout_x", "expr": "datum.layout_x + (datum.offsetX || 0)" },
       { "type": "formula", "field":"layout_y", "expr": "datum.layout_y + (datum.offsetY || 0)" },
       { "type": "formula", "field":"color", "expr": "datum.color || '#c33'" },
       { "type": "formula", "field":"textColor", "expr": "datum.textColor || datum.color" },
       { "type": "formula", "field":"strokeColor", "expr": "datum.strokeColor || '#ffe7e6'" }
     ]
   },
   {
     // Hack: single value data source for drawing/hiding images and other non-series elements
     "name": "dummyData",
     "values": [{}]
   }
 ],

// Legend only works if showLegend and colorScaleField are set

 "marks": [
   {
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "formula", "field":"url", "expr": "'mapsnapshot:///?width='+imgWidth+'&height='+imgHeight+'&zoom='+imgZoom+'&lat='+imgLat+'&lon='+imgLon" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"field": "url"},
         "xc": {"signal": "imgXC"}, "yc": {"signal": "imgYC"},
         "width": {"signal": "imgWidth"}, "height": {"signal": "imgHeight"}
       }
     }
   },
   {
     // Places an image of a given name and size at the [lan,lon] location
     "type": "image",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.img" },
         { "type": "formula", "field":"iconWidth", "expr": "datum.width || 0" },
         { "type": "formula", "field":"iconHeight", "expr": "datum.height || 0" },
         { "type": "formula", "field":"img",
           "expr": "if(!test(/^[a-z]+:\\/\\//, datum.img), 'wikifile:///'+datum.img, datum.img)" },
         // Ensure that either width or height parameter is passed to wikifile:// request
         { "type": "formula", "field":"img",
           "expr": "if((datum.iconWidth || datum.iconHeight) && !test(/[?&](width|height)=\\d/, datum.img),if(datum.iconWidth,datum.img+'?width='+datum.iconWidth,datum.img+'?height='+datum.iconHeight), datum.img)" }
     ]},
     "properties": {
       "enter": {
         "url": {"field": "img"},
         "xc": {"field": "layout_x"}, "yc": {"field": "layout_y"},
         "width": {"field": "iconWidth"}, "height": {"field": "iconHeight"}
       }
     }
   },
   {
     // Draw marks of a given color, shape, and size at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "data",
       "transform": [{ "type": "filter", "test": "!datum.img" }]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"},
         "y": {"field": "layout_y"},
         // If colorScaleField is set, use color scaling, otherwise use the preset color value
         "fill": { "field": "color" },
         "size": {"field": "size"},
         "shape": {"field": "shape"},
         "stroke": {"field": "strokeColor"}
       }
     }
   },
   {
     // Draw text with the given color and size at the [lan,lon] location
     // See https://github.com/vega/vega/wiki/Marks#text for all parameter description (prepend "text" and capitalize them)
     "type": "text",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.text" },
         // Figure out if this is an LTR or RTL page. For LTR, show label to the right of the icon, left-aligned. For RTL, reverse.
         { "type": "formula", "field":"isLTR", "expr": "'‎' == '\\u200E'" },
         // If these values are not defined ("undefined" is not allowed, so test for truthiness and not 0)
         { "type": "formula", "field":"textDx", "expr": "if(!datum.textDx && datum.textDx != 0, if(datum.isLTR,8,-8), datum.textDx)" },
         { "type": "formula", "field":"textAlign", "expr": "if(!datum.textAlign, if(datum.isLTR,'left','right'), datum.textAlign)" },
         { "type": "formula", "field":"textBaseline", "expr": "datum.textBaseline || 'middle'" }
     ]},
     "properties": {
       "enter": {
         "text": {"field": "text"},
         "x": {"field": "layout_x" },
         "y": {"field": "layout_y"},
         "dx": {"field": "textDx" },
         "dy": {"field": "textDy"},
         "fill": {"field": "textColor"},
         "align": {"field": "textAlign"},
         "baseline": {"field": "textBaseline"},
         "radius": {"field": "textRadius"},
         "theta": {"field": "textTheta"},
         "angle": {"field": "textAngle"},
         "font": {"field": "textFont"},
         "fontSize": {"field": "textFontSize"},
         "fontWeight": {"field": "textFontWeight"},
         "fontStyle": {"field": "textFontStyle"}
       }
     }
   },
   {
     // Draw a low-zoom locator map frame
     "type": "rect",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" }
       ]
     },
     "properties": {
       "enter": {
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth", "offset":2}, "height": {"signal": "picHeight"},
         "stroke": {"value":"#fff"},"strokeWidth": {"value":6}
       }
     }
   },
   {
     // Draw a low-zoom locator map by using a premade world map image
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"url", "expr": "1" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"value": "wikirawupload:"},
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth"}, "height": {"signal": "picHeight"}
       }
     }
   },
   {
     // Draw a zoom-out mark at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"lat", "expr": "imgLat" },
         { "type": "formula", "field":"lon", "expr": "imgLon" },
         {
           "type": "geo",
           "projection": "equirectangular",
           "scale": {"expr": "180/2/PI"},
           "translate": [{"expr": "picXC"}, {"expr": "picYC"}],
           "center": [{"expr": "0"}, {"expr": "0"}],
           "lon": "lon", "lat": "lat"
         }
       ]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"}, "y": {"field": "layout_y"},
         "fill": {"value": "#c33"},
         "stroke": {"value": "#ffe7e6"},
         "size": {"value": 40}
       }
     }
   }
 ]

} </graph>

Listed buildings in Stoneygate
St John The Baptist Church
Congregational Church
Eastfield, Stanley Road
Stoneygate School
The Firs
White House

</source> The other built-in shapes can be used in the same way (n-square, n-diamond etc.). The shape-outline1= value sets the colour for the number (unlike normal, when it sets the shape-outline), and as with the others, only the mark1 parameter values need to be set, to establish the default for this map, which can be overridden as required. The numbered1..2..3 etc parameters can override the automatic numbers or letters to use your own values for each mark. {{Flushing Meadows-Corona Park map}} is a useful real life example in template form.

Use in infoboxes

  1. REDIRECT Template:Template link

can be imbedded in infoboxes which allow the module parameter, for instance {{infobox school}} by using the instruction |module={{OSM Location map| ...}}. St John Fisher Catholic School is a real life school with two sites and marked on the infobox map.

Full list of parameters

Demonstration of multi-mark example, Heathrow Airport
<source lang="html" style="overflow: auto; margin-right: 5px;">
London's Heathrow Airport
<graph>

{

 //
 // ATTENTION: This code is maintained at https://www.mediawiki.org/wiki/Template:Graph:Street_map_with_marks
 //            Please do not modify it anywhere else, as it may get copied and override your changes.
 //            Suggestions can be made at https://www.mediawiki.org/wiki/Template_talk:Graph:Street_map_with_marks
 //
 // Template translation is in https://commons.wikimedia.org/wiki/Data:Original/Template:Graphs.tab
 //
 "version": 2, "width":, "height": , "padding": 0,
 "signals":[
   // These signals allow us to quickly move the map within the image, e.g. to leave space for the legend

{"name":"legendWidth", "init": {"expr": "0"} },

   {"name":"legendHeight", "init": {"expr": "height"} },
   {"name":"imgWidth", "init": {"expr": "width-legendWidth"} },
   {"name":"imgHeight", "init": {"expr": "height"} },
   {"name":"imgXC", "init": {"expr": "imgWidth/2"} },
   {"name":"imgYC", "init": {"expr": "imgHeight/2"} },
   {"name":"imgTileSize", "init": {"expr": "256"} },
   {"name":"imgLat", "init": {"expr": "51.46534"} },
   {"name":"imgLon", "init": {"expr": "-0.44542"} },
   {"name":"imgZoom", "init": {"expr": ""} },
   {"name":"picWidth", "init": {"expr": "180"} },
   {"name":"picHeight", "init": {"expr": "picWidth/2"} },
   {"name":"picXC", "init": {"expr": "imgWidth-(picWidth/2)"} },
   {"name":"picYC", "init": {"expr": "imgHeight-(picHeight/2)"} },
   {"name":"showMiniMap", "init": {"expr": "0"} }
 ],
 "data": [
   {
     "name": "data",

// Otherwise use the first unnamed argument for source values

     "values": [  { "lat": 51.46534, 
    "lon": -0.44542, 
    "img": "wikirawupload:https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Mapscaleline.svg/120px-Mapscaleline.svg.png", 
    "width": 50, 
    "height": 8, 
    "offsetX": Expression error: Unexpected / operator., 
    "offsetY": Expression error: Unexpected / operator., 
    "textAlign": "right", 
    "textDx": 22, 
    "textDy": -2, 
    "textColor": "grey", 
    "textFont": "Tahoma", 
    "textFontSize": 9, 
    "text":  "10 000km" }

, { "lat": 51.471948, "lon": -0.487883, Expression error: Unexpected = operator. "text": "Heathrow Terminal 5", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


}


, { "lat": 51.470156, "lon": -0.448497, Expression error: Unexpected = operator. "text": "Terminal 2", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


}
















     ],
     "transform": [
       {
         "type": "geo",
         "projection": "mercator",
         "scale": {"expr": "imgTileSize/PI/2*pow(2,imgZoom)"},
         "translate": [{"expr": "imgXC"}, {"expr": "imgYC"}],
         "center": [{"expr": "imgLon"}, {"expr": "imgLat"}],
         "lon": "lon", "lat": "lat"
       },
       { "type": "formula", "field":"layout_x", "expr": "datum.layout_x + (datum.offsetX || 0)" },
       { "type": "formula", "field":"layout_y", "expr": "datum.layout_y + (datum.offsetY || 0)" },
       { "type": "formula", "field":"color", "expr": "datum.color || '#c33'" },
       { "type": "formula", "field":"textColor", "expr": "datum.textColor || datum.color" },
       { "type": "formula", "field":"strokeColor", "expr": "datum.strokeColor || '#ffe7e6'" }
     ]
   },
   {
     // Hack: single value data source for drawing/hiding images and other non-series elements
     "name": "dummyData",
     "values": [{}]
   }
 ],

// Legend only works if showLegend and colorScaleField are set

 "marks": [
   {
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "formula", "field":"url", "expr": "'mapsnapshot:///?width='+imgWidth+'&height='+imgHeight+'&zoom='+imgZoom+'&lat='+imgLat+'&lon='+imgLon" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"field": "url"},
         "xc": {"signal": "imgXC"}, "yc": {"signal": "imgYC"},
         "width": {"signal": "imgWidth"}, "height": {"signal": "imgHeight"}
       }
     }
   },
   {
     // Places an image of a given name and size at the [lan,lon] location
     "type": "image",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.img" },
         { "type": "formula", "field":"iconWidth", "expr": "datum.width || 0" },
         { "type": "formula", "field":"iconHeight", "expr": "datum.height || 0" },
         { "type": "formula", "field":"img",
           "expr": "if(!test(/^[a-z]+:\\/\\//, datum.img), 'wikifile:///'+datum.img, datum.img)" },
         // Ensure that either width or height parameter is passed to wikifile:// request
         { "type": "formula", "field":"img",
           "expr": "if((datum.iconWidth || datum.iconHeight) && !test(/[?&](width|height)=\\d/, datum.img),if(datum.iconWidth,datum.img+'?width='+datum.iconWidth,datum.img+'?height='+datum.iconHeight), datum.img)" }
     ]},
     "properties": {
       "enter": {
         "url": {"field": "img"},
         "xc": {"field": "layout_x"}, "yc": {"field": "layout_y"},
         "width": {"field": "iconWidth"}, "height": {"field": "iconHeight"}
       }
     }
   },
   {
     // Draw marks of a given color, shape, and size at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "data",
       "transform": [{ "type": "filter", "test": "!datum.img" }]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"},
         "y": {"field": "layout_y"},
         // If colorScaleField is set, use color scaling, otherwise use the preset color value
         "fill": { "field": "color" },
         "size": {"field": "size"},
         "shape": {"field": "shape"},
         "stroke": {"field": "strokeColor"}
       }
     }
   },
   {
     // Draw text with the given color and size at the [lan,lon] location
     // See https://github.com/vega/vega/wiki/Marks#text for all parameter description (prepend "text" and capitalize them)
     "type": "text",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.text" },
         // Figure out if this is an LTR or RTL page. For LTR, show label to the right of the icon, left-aligned. For RTL, reverse.
         { "type": "formula", "field":"isLTR", "expr": "'‎' == '\\u200E'" },
         // If these values are not defined ("undefined" is not allowed, so test for truthiness and not 0)
         { "type": "formula", "field":"textDx", "expr": "if(!datum.textDx && datum.textDx != 0, if(datum.isLTR,8,-8), datum.textDx)" },
         { "type": "formula", "field":"textAlign", "expr": "if(!datum.textAlign, if(datum.isLTR,'left','right'), datum.textAlign)" },
         { "type": "formula", "field":"textBaseline", "expr": "datum.textBaseline || 'middle'" }
     ]},
     "properties": {
       "enter": {
         "text": {"field": "text"},
         "x": {"field": "layout_x" },
         "y": {"field": "layout_y"},
         "dx": {"field": "textDx" },
         "dy": {"field": "textDy"},
         "fill": {"field": "textColor"},
         "align": {"field": "textAlign"},
         "baseline": {"field": "textBaseline"},
         "radius": {"field": "textRadius"},
         "theta": {"field": "textTheta"},
         "angle": {"field": "textAngle"},
         "font": {"field": "textFont"},
         "fontSize": {"field": "textFontSize"},
         "fontWeight": {"field": "textFontWeight"},
         "fontStyle": {"field": "textFontStyle"}
       }
     }
   },
   {
     // Draw a low-zoom locator map frame
     "type": "rect",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" }
       ]
     },
     "properties": {
       "enter": {
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth", "offset":2}, "height": {"signal": "picHeight"},
         "stroke": {"value":"#fff"},"strokeWidth": {"value":6}
       }
     }
   },
   {
     // Draw a low-zoom locator map by using a premade world map image
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"url", "expr": "1" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"value": "wikirawupload:"},
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth"}, "height": {"signal": "picHeight"}
       }
     }
   },
   {
     // Draw a zoom-out mark at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"lat", "expr": "imgLat" },
         { "type": "formula", "field":"lon", "expr": "imgLon" },
         {
           "type": "geo",
           "projection": "equirectangular",
           "scale": {"expr": "180/2/PI"},
           "translate": [{"expr": "picXC"}, {"expr": "picYC"}],
           "center": [{"expr": "0"}, {"expr": "0"}],
           "lon": "lon", "lat": "lat"
         }
       ]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"}, "y": {"field": "layout_y"},
         "fill": {"value": "#c33"},
         "stroke": {"value": "#ffe7e6"},
         "size": {"value": 40}
       }
     }
   }
 ]

} </graph>

Heathrow Airport 014.jpg
With five terminals, Heathrow Airport, is the busiest airport in Europe.
</source>
London's Heathrow Airport
<graph>

{

 //
 // ATTENTION: This code is maintained at https://www.mediawiki.org/wiki/Template:Graph:Street_map_with_marks
 //            Please do not modify it anywhere else, as it may get copied and override your changes.
 //            Suggestions can be made at https://www.mediawiki.org/wiki/Template_talk:Graph:Street_map_with_marks
 //
 // Template translation is in https://commons.wikimedia.org/wiki/Data:Original/Template:Graphs.tab
 //
 "version": 2, "width":, "height": , "padding": 0,
 "signals":[
   // These signals allow us to quickly move the map within the image, e.g. to leave space for the legend

{"name":"legendWidth", "init": {"expr": "0"} },

   {"name":"legendHeight", "init": {"expr": "height"} },
   {"name":"imgWidth", "init": {"expr": "width-legendWidth"} },
   {"name":"imgHeight", "init": {"expr": "height"} },
   {"name":"imgXC", "init": {"expr": "imgWidth/2"} },
   {"name":"imgYC", "init": {"expr": "imgHeight/2"} },
   {"name":"imgTileSize", "init": {"expr": "256"} },
   {"name":"imgLat", "init": {"expr": "51.46534"} },
   {"name":"imgLon", "init": {"expr": "-0.44542"} },
   {"name":"imgZoom", "init": {"expr": ""} },
   {"name":"picWidth", "init": {"expr": "180"} },
   {"name":"picHeight", "init": {"expr": "picWidth/2"} },
   {"name":"picXC", "init": {"expr": "imgWidth-(picWidth/2)"} },
   {"name":"picYC", "init": {"expr": "imgHeight-(picHeight/2)"} },
   {"name":"showMiniMap", "init": {"expr": "0"} }
 ],
 "data": [
   {
     "name": "data",

// Otherwise use the first unnamed argument for source values

     "values": [  { "lat": 51.46534, 
    "lon": -0.44542, 
    "img": "wikirawupload:https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Mapscaleline.svg/120px-Mapscaleline.svg.png", 
    "width": 50, 
    "height": 8, 
    "offsetX": Expression error: Unexpected / operator., 
    "offsetY": Expression error: Unexpected / operator., 
    "textAlign": "right", 
    "textDx": 22, 
    "textDy": -2, 
    "textColor": "grey", 
    "textFont": "Tahoma", 
    "textFontSize": 9, 
    "text":  "10 000km" }

, { "lat": 51.471867, "lon": -0.456726, Expression error: Unexpected = operator. "text": "Terminals 1 & 3", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


}


, { "lat": 51.470156, "lon": -0.448497, Expression error: Unexpected = operator. "text": "Terminal 2", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


} , { "lat": 51.471948, "lon": -0.487883, Expression error: Unexpected = operator. "text": "Terminal 5", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


} , { "lat": 51.459409, "lon": -0.446459, Expression error: Unexpected = operator. "text": "Terminal 4", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#AA1205"


} , { "lat": 51.467269, "lon": -0.4233598, Expression error: Unexpected = operator. "text": "Hatton Cross", "textAlign": "right", "textBaseline": "middle", "textDx": 0, "textDy": 1, "textFontSize": , "textColor": "#777755"


}















     ],
     "transform": [
       {
         "type": "geo",
         "projection": "mercator",
         "scale": {"expr": "imgTileSize/PI/2*pow(2,imgZoom)"},
         "translate": [{"expr": "imgXC"}, {"expr": "imgYC"}],
         "center": [{"expr": "imgLon"}, {"expr": "imgLat"}],
         "lon": "lon", "lat": "lat"
       },
       { "type": "formula", "field":"layout_x", "expr": "datum.layout_x + (datum.offsetX || 0)" },
       { "type": "formula", "field":"layout_y", "expr": "datum.layout_y + (datum.offsetY || 0)" },
       { "type": "formula", "field":"color", "expr": "datum.color || '#c33'" },
       { "type": "formula", "field":"textColor", "expr": "datum.textColor || datum.color" },
       { "type": "formula", "field":"strokeColor", "expr": "datum.strokeColor || '#ffe7e6'" }
     ]
   },
   {
     // Hack: single value data source for drawing/hiding images and other non-series elements
     "name": "dummyData",
     "values": [{}]
   }
 ],

// Legend only works if showLegend and colorScaleField are set

 "marks": [
   {
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "formula", "field":"url", "expr": "'mapsnapshot:///?width='+imgWidth+'&height='+imgHeight+'&zoom='+imgZoom+'&lat='+imgLat+'&lon='+imgLon" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"field": "url"},
         "xc": {"signal": "imgXC"}, "yc": {"signal": "imgYC"},
         "width": {"signal": "imgWidth"}, "height": {"signal": "imgHeight"}
       }
     }
   },
   {
     // Places an image of a given name and size at the [lan,lon] location
     "type": "image",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.img" },
         { "type": "formula", "field":"iconWidth", "expr": "datum.width || 0" },
         { "type": "formula", "field":"iconHeight", "expr": "datum.height || 0" },
         { "type": "formula", "field":"img",
           "expr": "if(!test(/^[a-z]+:\\/\\//, datum.img), 'wikifile:///'+datum.img, datum.img)" },
         // Ensure that either width or height parameter is passed to wikifile:// request
         { "type": "formula", "field":"img",
           "expr": "if((datum.iconWidth || datum.iconHeight) && !test(/[?&](width|height)=\\d/, datum.img),if(datum.iconWidth,datum.img+'?width='+datum.iconWidth,datum.img+'?height='+datum.iconHeight), datum.img)" }
     ]},
     "properties": {
       "enter": {
         "url": {"field": "img"},
         "xc": {"field": "layout_x"}, "yc": {"field": "layout_y"},
         "width": {"field": "iconWidth"}, "height": {"field": "iconHeight"}
       }
     }
   },
   {
     // Draw marks of a given color, shape, and size at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "data",
       "transform": [{ "type": "filter", "test": "!datum.img" }]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"},
         "y": {"field": "layout_y"},
         // If colorScaleField is set, use color scaling, otherwise use the preset color value
         "fill": { "field": "color" },
         "size": {"field": "size"},
         "shape": {"field": "shape"},
         "stroke": {"field": "strokeColor"}
       }
     }
   },
   {
     // Draw text with the given color and size at the [lan,lon] location
     // See https://github.com/vega/vega/wiki/Marks#text for all parameter description (prepend "text" and capitalize them)
     "type": "text",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.text" },
         // Figure out if this is an LTR or RTL page. For LTR, show label to the right of the icon, left-aligned. For RTL, reverse.
         { "type": "formula", "field":"isLTR", "expr": "'‎' == '\\u200E'" },
         // If these values are not defined ("undefined" is not allowed, so test for truthiness and not 0)
         { "type": "formula", "field":"textDx", "expr": "if(!datum.textDx && datum.textDx != 0, if(datum.isLTR,8,-8), datum.textDx)" },
         { "type": "formula", "field":"textAlign", "expr": "if(!datum.textAlign, if(datum.isLTR,'left','right'), datum.textAlign)" },
         { "type": "formula", "field":"textBaseline", "expr": "datum.textBaseline || 'middle'" }
     ]},
     "properties": {
       "enter": {
         "text": {"field": "text"},
         "x": {"field": "layout_x" },
         "y": {"field": "layout_y"},
         "dx": {"field": "textDx" },
         "dy": {"field": "textDy"},
         "fill": {"field": "textColor"},
         "align": {"field": "textAlign"},
         "baseline": {"field": "textBaseline"},
         "radius": {"field": "textRadius"},
         "theta": {"field": "textTheta"},
         "angle": {"field": "textAngle"},
         "font": {"field": "textFont"},
         "fontSize": {"field": "textFontSize"},
         "fontWeight": {"field": "textFontWeight"},
         "fontStyle": {"field": "textFontStyle"}
       }
     }
   },
   {
     // Draw a low-zoom locator map frame
     "type": "rect",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" }
       ]
     },
     "properties": {
       "enter": {
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth", "offset":2}, "height": {"signal": "picHeight"},
         "stroke": {"value":"#fff"},"strokeWidth": {"value":6}
       }
     }
   },
   {
     // Draw a low-zoom locator map by using a premade world map image
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"url", "expr": "1" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"value": "wikirawupload:"},
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth"}, "height": {"signal": "picHeight"}
       }
     }
   },
   {
     // Draw a zoom-out mark at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"lat", "expr": "imgLat" },
         { "type": "formula", "field":"lon", "expr": "imgLon" },
         {
           "type": "geo",
           "projection": "equirectangular",
           "scale": {"expr": "180/2/PI"},
           "translate": [{"expr": "picXC"}, {"expr": "picYC"}],
           "center": [{"expr": "0"}, {"expr": "0"}],
           "lon": "lon", "lat": "lat"
         }
       ]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"}, "y": {"field": "layout_y"},
         "fill": {"value": "#c33"},
         "stroke": {"value": "#ffe7e6"},
         "size": {"value": 40}
       }
     }
   }
 ]

} </graph>

Heathrow Airport 014.jpg
With five terminals, Heathrow Airport, is the busiest airport in Europe.
Code blank - OSM Location map template, listing all the parameters
<source lang="html">
<graph>

{

 //
 // ATTENTION: This code is maintained at https://www.mediawiki.org/wiki/Template:Graph:Street_map_with_marks
 //            Please do not modify it anywhere else, as it may get copied and override your changes.
 //            Suggestions can be made at https://www.mediawiki.org/wiki/Template_talk:Graph:Street_map_with_marks
 //
 // Template translation is in https://commons.wikimedia.org/wiki/Data:Original/Template:Graphs.tab
 //
 "version": 2, "width":, "height": , "padding": 0,
 "signals":[
   // These signals allow us to quickly move the map within the image, e.g. to leave space for the legend

{"name":"legendWidth", "init": {"expr": "0"} },

   {"name":"legendHeight", "init": {"expr": "height"} },
   {"name":"imgWidth", "init": {"expr": "width-legendWidth"} },
   {"name":"imgHeight", "init": {"expr": "height"} },
   {"name":"imgXC", "init": {"expr": "imgWidth/2"} },
   {"name":"imgYC", "init": {"expr": "imgHeight/2"} },
   {"name":"imgTileSize", "init": {"expr": "256"} },
   {"name":"imgLat", "init": {"expr": ""} },
   {"name":"imgLon", "init": {"expr": "Lua error: bad argument #1 to 'len' (string expected, got nil)."} },
   {"name":"imgZoom", "init": {"expr": ""} },
   {"name":"picWidth", "init": {"expr": "180"} },
   {"name":"picHeight", "init": {"expr": "picWidth/2"} },
   {"name":"picXC", "init": {"expr": "imgWidth-(picWidth/2)"} },
   {"name":"picYC", "init": {"expr": "imgHeight-(picHeight/2)"} },
   {"name":"showMiniMap", "init": {"expr": "0"} }
 ],
 "data": [
   {
     "name": "data",

// Otherwise use the first unnamed argument for source values

     "values": [  { "lat": , 
    "lon": Lua error: bad argument #1 to 'len' (string expected, got nil)., 
    "img": "wikirawupload:https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Mapscaleline.svg/120px-Mapscaleline.svg.png", 
    "width": 50, 
    "height": 8, 
    "offsetX": Expression error: Unexpected / operator., 
    "offsetY": Expression error: Unexpected / operator., 
    "textAlign": "right", 
    "textDx": 22, 
    "textDy": -2, 
    "textColor": "grey", 
    "textFont": "Tahoma", 
    "textFontSize": 9, 
    "text":  "Expression error: Unexpected < operator." }


















     ],
     "transform": [
       {
         "type": "geo",
         "projection": "mercator",
         "scale": {"expr": "imgTileSize/PI/2*pow(2,imgZoom)"},
         "translate": [{"expr": "imgXC"}, {"expr": "imgYC"}],
         "center": [{"expr": "imgLon"}, {"expr": "imgLat"}],
         "lon": "lon", "lat": "lat"
       },
       { "type": "formula", "field":"layout_x", "expr": "datum.layout_x + (datum.offsetX || 0)" },
       { "type": "formula", "field":"layout_y", "expr": "datum.layout_y + (datum.offsetY || 0)" },
       { "type": "formula", "field":"color", "expr": "datum.color || '#c33'" },
       { "type": "formula", "field":"textColor", "expr": "datum.textColor || datum.color" },
       { "type": "formula", "field":"strokeColor", "expr": "datum.strokeColor || '#ffe7e6'" }
     ]
   },
   {
     // Hack: single value data source for drawing/hiding images and other non-series elements
     "name": "dummyData",
     "values": [{}]
   }
 ],

// Legend only works if showLegend and colorScaleField are set

 "marks": [
   {
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "formula", "field":"url", "expr": "'mapsnapshot:///?width='+imgWidth+'&height='+imgHeight+'&zoom='+imgZoom+'&lat='+imgLat+'&lon='+imgLon" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"field": "url"},
         "xc": {"signal": "imgXC"}, "yc": {"signal": "imgYC"},
         "width": {"signal": "imgWidth"}, "height": {"signal": "imgHeight"}
       }
     }
   },
   {
     // Places an image of a given name and size at the [lan,lon] location
     "type": "image",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.img" },
         { "type": "formula", "field":"iconWidth", "expr": "datum.width || 0" },
         { "type": "formula", "field":"iconHeight", "expr": "datum.height || 0" },
         { "type": "formula", "field":"img",
           "expr": "if(!test(/^[a-z]+:\\/\\//, datum.img), 'wikifile:///'+datum.img, datum.img)" },
         // Ensure that either width or height parameter is passed to wikifile:// request
         { "type": "formula", "field":"img",
           "expr": "if((datum.iconWidth || datum.iconHeight) && !test(/[?&](width|height)=\\d/, datum.img),if(datum.iconWidth,datum.img+'?width='+datum.iconWidth,datum.img+'?height='+datum.iconHeight), datum.img)" }
     ]},
     "properties": {
       "enter": {
         "url": {"field": "img"},
         "xc": {"field": "layout_x"}, "yc": {"field": "layout_y"},
         "width": {"field": "iconWidth"}, "height": {"field": "iconHeight"}
       }
     }
   },
   {
     // Draw marks of a given color, shape, and size at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "data",
       "transform": [{ "type": "filter", "test": "!datum.img" }]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"},
         "y": {"field": "layout_y"},
         // If colorScaleField is set, use color scaling, otherwise use the preset color value
         "fill": { "field": "color" },
         "size": {"field": "size"},
         "shape": {"field": "shape"},
         "stroke": {"field": "strokeColor"}
       }
     }
   },
   {
     // Draw text with the given color and size at the [lan,lon] location
     // See https://github.com/vega/vega/wiki/Marks#text for all parameter description (prepend "text" and capitalize them)
     "type": "text",
     "from": {
       "data": "data",
       "transform": [
         { "type": "filter", "test": "datum.text" },
         // Figure out if this is an LTR or RTL page. For LTR, show label to the right of the icon, left-aligned. For RTL, reverse.
         { "type": "formula", "field":"isLTR", "expr": "'‎' == '\\u200E'" },
         // If these values are not defined ("undefined" is not allowed, so test for truthiness and not 0)
         { "type": "formula", "field":"textDx", "expr": "if(!datum.textDx && datum.textDx != 0, if(datum.isLTR,8,-8), datum.textDx)" },
         { "type": "formula", "field":"textAlign", "expr": "if(!datum.textAlign, if(datum.isLTR,'left','right'), datum.textAlign)" },
         { "type": "formula", "field":"textBaseline", "expr": "datum.textBaseline || 'middle'" }
     ]},
     "properties": {
       "enter": {
         "text": {"field": "text"},
         "x": {"field": "layout_x" },
         "y": {"field": "layout_y"},
         "dx": {"field": "textDx" },
         "dy": {"field": "textDy"},
         "fill": {"field": "textColor"},
         "align": {"field": "textAlign"},
         "baseline": {"field": "textBaseline"},
         "radius": {"field": "textRadius"},
         "theta": {"field": "textTheta"},
         "angle": {"field": "textAngle"},
         "font": {"field": "textFont"},
         "fontSize": {"field": "textFontSize"},
         "fontWeight": {"field": "textFontWeight"},
         "fontStyle": {"field": "textFontStyle"}
       }
     }
   },
   {
     // Draw a low-zoom locator map frame
     "type": "rect",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" }
       ]
     },
     "properties": {
       "enter": {
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth", "offset":2}, "height": {"signal": "picHeight"},
         "stroke": {"value":"#fff"},"strokeWidth": {"value":6}
       }
     }
   },
   {
     // Draw a low-zoom locator map by using a premade world map image
     "type": "image",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"url", "expr": "1" }
       ]
     },
     "properties": {
       "enter": {
         "url": {"value": "wikirawupload:"},
         "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
         "width": {"signal": "picWidth"}, "height": {"signal": "picHeight"}
       }
     }
   },
   {
     // Draw a zoom-out mark at the [lan,lon] location
     "type": "symbol",
     "from": {
       "data": "dummyData",
       "transform": [
         { "type": "filter", "test": "showMiniMap" },
         { "type": "formula", "field":"lat", "expr": "imgLat" },
         { "type": "formula", "field":"lon", "expr": "imgLon" },
         {
           "type": "geo",
           "projection": "equirectangular",
           "scale": {"expr": "180/2/PI"},
           "translate": [{"expr": "picXC"}, {"expr": "picYC"}],
           "center": [{"expr": "0"}, {"expr": "0"}],
           "lon": "lon", "lat": "lat"
         }
       ]
     },
     "properties": {
       "enter": {
         "x": {"field": "layout_x"}, "y": {"field": "layout_y"},
         "fill": {"value": "#c33"},
         "stroke": {"value": "#ffe7e6"},
         "size": {"value": 40}
       }
     }
   }
 ]

} </graph>

<maplink> problems:

  • Couldn't parse JSON: Syntax error
  • Attribute "latitude" has an invalid value
  • Attribute "longitude" has an invalid value
</source>

Parameters

Map display parameters
Parameter Description
coord Latitude and longitude coordinates of the centre point of the map. Use coord={{Coord|latitude|longitude}}. {{Coord}} can deal with a wide range of formats. e.g.: coord={{Coord|57|18|22|N|4|27|32|W}}, coord={{Coord|44.112|N|87.913|W}}, coord={{Coord|44.112|-87.913}}. This may not be the 'coord' points of the page, as an appropriate framing area for the map may place the subject off-centre. (Marker point(s) are set separately, see below). gridreferencefinder.com, is a helpful place to find coordinates, or you can right=click on the 'Full screen linked' map.
zoom Sets the scale of the map, from 0 to 19, to the levels defined by OpenStreetMap. (details here). The actual distances represented will vary depending on the latitude, as the scale defines different fractions of a degree. The apparent scale will also vary hugely depending on the monitor being used, the browser magnification level, etc. For most Wikipedia situations, maps with a zoom of 10 (notionally 1:500,000) up to 16 (1:8,000) are likely to be of most use.
float Positions the frame to the left, centre (or center) or right. (default is right). If centered, the text will be forced above and below, otherwise text will wrap to the side.
width height Sets the width and height of the map in pixels. Only the number is required (i.e. no px). Default is 350 by 250 pixels.
fullscreen-option By default a [Full screen] link is supplied in the bottom left of the frame. By setting this to 0 or no, the link will not appear, should that be preferred
nolabels By default the base map uses a map label model called 'osm-int'l', in which progressively higher zoom levels bring more place names onto the map. For some contexts it may be preferred to 'turn off' the place name labels, and use the mark/label options to provide such names as are wanted. By setting nolabels = 1 an alternative 'osm' base map is used, with no place name labels. (At higher zooms the road names still occur).
caption
auto-caption
Optionally, a text caption can be included, below the map. Unless overridden by tags etc., this is left-justified plain text. It can include any wiki-item that can be inserted into a table cell, including images, formatting, citation references, etc.
If auto-caption=1, a numbered list will be automatically generated to follow any caption. This will generally only make sense when using numbered dots.
title Optionally a title or other text can be placed in a cell above the map. By default this is centred and bold, but as with the caption, any wiki-markup etc. can be included.
map-data-heavy

map-data-light
map-data
map-data-text
map-data-color
map-data-width

Allows OSM ExternalData elements to be added to the map. This can be an administrative boundary, highway or other map element that has been assigned a wikidata Q value. (e.g.: map-data=Q83065 will add the city boundary of Leicester.) The map item needs to be on the same place as the map itself. It currently only allows line features (not areas etc.), which appear as various styles of line. Multiple elements can be added, separating each Q value by a comma. A major limitation, as of May 2017, is that it only appears on the 'fullscreen' map, not on the framed map on the page. Adding map-data items now should mean they appear on the page if and when this limitation is overcome. nominatim.openstreetmap.org/ has a search engine to identify data elements for which Q values have been assigned, or to add wikidata Q values to map elements.

For map-data-heavy and map-data-light, this will draw orange lines of thickness 9 and 3 pixels respectively. map-data is more flexible, so can default to an orange line of 6 pixels, but color (using format #XXXXXX) and width in pixels can be set, as can a text element which appears when the line is clicked on. This can include wikilinks.

minimap Used to add an optional locator minimap in the bottom left corner. If set to on it adds a 'built in' small(ish) world map with a locator dot showing the position of the main map. (This is a feature supplied by the underlying 'Graph:' template, so the only control over it is to be set as on or off.) If set too off it is not used. If set to file it requires the next section details to be added, which will include a custom map. Default is off.
mini-file

mini-width
mini-height

Takes the file name of a standard location map from commons, and displays it as a minimap in the bottom left corner, provided minimap=file. This can be used to show a larger entity from which the main map is drawn.
minipog-x

minipog-y
minimap-boxwidth

Within the custom minimap this can place an optional small Red pog. Nb. The x and y are not lat and lon values. They relate to the mini-width and mini-height. The origin is top,left of the mini map, so if mini-width=80 and minipog-x=20, it will be a quarter of the way across. (Some location maps have a highlighted location already, so leaving these two parameters undefined gives the map without a dot.)

minimap-boxwidth=xx can optionally use an open red box instead of a Red pog. xx = the pixel width of the box, and the height is then matched in proportion to the actual map. In general anything much below xx=15 will be better served by a dot. The required width will require some trial and error to pin down. If xx=0 or minimap-boxwidth is undefined, a Red pog is used.

scalemark By default or with scalemark=1, a scale line with guide to the scale of the map is supplied in the bottom right corner of the map. If this is not required - e.g. if it interfers with a map element at that point - it can be turned off by setting this to '0'. To shift it further left, e.g. to avoid a minimap, or to avoid a 'busy' bit of the map, enter the number of pixels. e.g. scalemark=180 will move it to the left of the built-in minimap. If there is no minimap it does not need to be mentioned.
Label and mark parameters.
Thirty-one marks can be set on the map, being an un-numbered version, and the rest numbered 1 to 30. The first numbered one, (mark1, label1, etc.) is a 'master marker' and its values (or defaults) are inherited by the other numbered markers unless set individually. All label, mark and full-screen parameters are available for each numbered marker.

If the un-numbered mark is used as the subject of the map, it will be point 1 on the Full Screen map (unless mark-title=none) and can use specific mark and label values of its own. The first numbered mark has values that will be inherited by subsequent marks. For added flexibility a parameter set with a 'D' value instead of a number will override the master values with a more general Default.

Parameter Description
shape OSM Location map can use either an external image as a location marker, or one of various built-in shapes. Shape should either be set as =image or can be a circle, square, cross, diamond, triangle-up or triangle-down. If blank or absent it will default to 'image', and use either a Red pog.svg or specified mark = image. If numbered dots are required, use shape1=n-circle Subsequent markers will use the same setting, and automatically number up to 30. shape1=l-circle will do the same but with letters, and any of the built in shapes can be used.
shape-color
shape-outline
numbered
Set the shape infill and outline to any color, using either the color names shown under 'label-color' blow, or hex triplets (e.g. #FF0000), as described at Web colors. Only used for built in shapes. Setting them to the same value gives an appearance of no outline. Default = #B80000 (a dark red). The numbered = parameter is used with numbered shapes, to override the automatically allocated number.
mark The name of a Wikimedia commons file, which is used as the marker. Default is Red pog.svg. Other pog colours are available, and a large range of map markers can be found at Commons:Location markers and Commons:Category:Map icons
mark-size
mark-dim
Size and dimensions of a marker. mark-size is used by both shape and mark to define the size of the marker symbol. It sets the height of the mark or shape in pixels (no 'px' required, default is 10). If only a text label is wanted with no marker, set mark-size=0.
mark-dim is used to give a non-square mark. (It has no effect with the built in shapes.) default is 1, i.e. equal width and height. A value of 1.4 will give a typical landscape rectangle. 0.7 will give a typical portrait rectangle. If the original mark-file is non square, a value here is needed to correct the proportions.
mark-coord Latitude and longitude coordinates of the marker point. Use the format mark-coord={{Coord|lat value|lon value}}. Used by either shape and mark as well as the related label. If the location is outside the area of the map, it will not appear. (for backwards compatibility mark-lat and mark-lon still work, but are not the preferred method.)
label
labela
labelb
Text to appear alongside a mark or shape. No inline formatting, line wrapping, or other tags, links etc. are possible. If left blank then any mark will show without a label. If only a text label is wanted with no marker, set mark-size=0 A blank label and a mark-size=0 will result in an invisible marker, which will still feature on the Full screen option. If the label is too long for a single line, use labela and labelb for 2nd and 3rd lines. nb if labelb is set without a labela, there will still be a gap where labela would go.
label-size Sets the text size for the label, in points. default = 10
label-color Sets the text colour for the label. The standard colour labels (red, black, grey, white, blue, green etc...) all work as described, but can be rather strident on the OSM map. Each of the colors below have three standard shades - soft, hard and dark. Default=hard red

Under normal usage, the following label color scheme should be followed:-

soft grey Settlements = soft grey (Subject of the map can be hard grey and larger label-size). Map areas with darker or busier backgrounds may need to move a shade darker to hard grey and dark gray respectively.
soft blue Rivers, lakes, sea areas etc = soft blue (Works well on top of OSM blue areas)
soft green Parkland, national/regional parks, gardens, forests etc = soft green works well on top of OSM green areas. (hard green may be desirable in forests or for the subject of the map)
hard red Individual sites = hard red, especially if no other labels are applied and the site is indicated by a red pog
Full table of colors recommended for OSM Maps.

These have a more pastel shade than the standard colors, so blend well the map backgrounds

soft red #DB3123 hard red #AA1205 dark red #7A0101
soft green #81AF81 hard green #538253 dark green #165916
soft blue #77A1CB hard blue #5581A9 dark blue #5581A9
soft grey #AAAA88 hard grey #777755 dark grey #333322
soft brown #CCB56C hard brown #AD7F14 dark brown #8E5913
Standard html colors.

These tend to look rather harsh on the OSM maps but are retained for compatibility

White #FFFFFF Silver #C0C0C0 Gray #808080
Red #FF0000 Maroon #800000 Yellow #FFFF00
Olive #808000 Lime #00FF00 Green #008000
Aqua #00FFFF Teal #008080 Blue #0000FF
Navy #000080 Fuchsia #FF00FF Purple #800080
Black #000000

It is also possible to specify any HTML Hex color using the six-figure hex-code, eg #AAAAAA, but sticking to defaults maintains consistency between pages

If no color is specified the text will have a default of 'hard red'

Any text other than one of the named colors above or a hex code will return as 'hard red'

label-pos Sets the position of the label, relative to the marker: left, right, top or bottom. Default=left. Top and bottom text is center-justified, whereas left and right align against the marker. The label aims to be an appropriate distance from the edge of the marker, but irregular shapes and larger sizes may need further adjustment using the label-offsets.
label-angle It is possible to specify a label-angle = , which will pivot the label text around the centre of the marker point by the specified number of degrees. (+ve angle rotates clockwise, -ve anticlockwise) If mark-size is set to zero, this has the effect of a free-floating label with no marker, useful for various geographic and linear features. For stylistic consistency all settlement names should not be given an angle.
label-offset-x
label-offset-y
Allows adjustment of the label location in an x and y direction, relative to its mark coordinates, by the specified number of pixels. It can be +ve or -ve numbers. Higher -x values will move the label to the right. Higher -y values move it down the map. Default is 0,0.
Additional content for Full screen link
The 'full screen' map uses the same OSM base map, in a different map environment, including the option for users to scale in and out, to pan across the map, and to find (via the 'More details' button) other maps and satellite imagery for the location. It also includes numbered markers, for which tooltip-style titles, and image thumbnails with captions can be brought up. This makes most sense where there are several markers on the map. The content for this facility is set with the following three parameters - which need to be numbered for each mark as for the other mark attibutes:
Parameter Description
mark-title This title appears as a tooltip and also a thumbnail title, accessed via the marker. if mark-title=none that will exclude that marker from the full screen map. (it will still show as normal on the main map).
mark-image This provides a pop-up thumbnail image when the marker is clicked. Include only the image name from Wikimedia commons etc. (i.e. no brackets, or 'File:').
mark-description Caption text, which will either accompany a pop-up photo, or if no photo then as a text box, when the marker is clicked. This can include wikilinks etc., to link on to additional relevant articles.
Arc Text: label placed on an arc
The use of arc-text parameters allows a short text (up to 20 characters) to be placed along on arc, with parameters to control the tightness of the circle (radius) and the looseness of the text (gap). The nature of the earth's coordinate system means that there will be some variation in an arc at different latitudes and at different zoom levels. Some allowance is factored in, but there will still be residual variation. Similarly, changes in radius will also have some effect on the gap size, with a larger radius opening out the gap somewhat. There will therefore need to be a degree of trial and correction to get the shape and effect desired. As a general rule, identify the coordinates of the required start-point, then choose a starter-pattern from the selection at OSM Location map#Text on an arc, and then adjust parameters to fit the requirement of the map. The parameters below are for set A. Sets B and C are also available.
Parameter Description
arc-coordA coordinates of first letter, using ={{coord|xxx.xx|yyy.yy}}
arc-textA= Add your text here
arc-angleA in degrees, -180 to 180. 0 will start as horizontal, -90 straight up, 90 straight down
arc-gapA 1= a notional 'standard'. 0.2 is very tight, 10 is very wide. Applying a negative gap will invert the letters and run the other way around the circle
arc-radiusA 1= a notional 'standard' 0.5 is quite a tight circle, 8 is so wide as to be almost flat, dependent on latitude and zoom level
arc-text-colorA sets text color. #000000 color hexes and standardised OSM Location map colors are accepted
ellipse-factorA will squash or stretch the circle. 1= notionally circular, 0.5 to 1.0 will flattern top and bottom, above 1.0 flattens the sides.

Underlying technology

OSM Location map itself has no map or display ability of its own. Everything within the frame is produced through the template {{Graph:Street map with marks}}, created by User:Yurik. This in turn calls internal processes that turn all the data supplied at edit time into a rendered bitmap image, so that there is no calculation overhead by the time the page is read by a user, any more than any other commons image.

Whilst the map is being edited and previewed, the page is supplied with a rasterised image, collating the base-map, marks, labels, etc. on the fly. It will be particularly noticeable on small fonts that when the 'Publish Changes' button is pressed, the resulting bitmap has much worse fonts than the preview. (Maybe this will be improved at some point). The process of updating the map image and providing the right bitmap is all handled internally and invisibly. One of the consequences of the 'bitmap' solution, which is different from the standard {{Location map}} method, is that there is no text or objects on the final image, so there is no possibility of adding wikilinks within the template.

The full screen option, which can be clicked through from below the map, provides an entirely different mapping approach, using the same base-map data. This provides an interactive map that can be panned and zoomed. It also replicates (although at present only as numbered markers) the various marks from the page map. These can then be given more content, by way of a title, caption and image along with displaying the coordinate values. The caption and title can then be given all the wikilinks and other markup features that may be desired, providing a map-based page that will offer another way of engaging with the article content.

Future development of the various mapping technologies is likely to result in further options for showing maps on Wikipedia. In particular, {{maplink}}, which initially just created a text link to a full-screen map, can now create a framed image including dot-markers, roads, boundaries, etc., and can acquire data directly from wikidata to do this. Again, the processor overheads are reduced by initially showing a bitmap, which can be clicked to become interactive within its frame. Maplink is being effectively rolled out within info-boxes, where the map is automatically generated from already available data.

This template, on the other hand, is probably better suited to a hand-editable map, in which the area displayed and the selection of items and labels included are selected, edited, and added to, to suit the specifics of the subject in hand. A further approach, which is not currently supported within this template, but is available via the inderlying {{Graph:Street map with marks}} template, is to draw the data from Wikidata, using a SPARKL query that provides the selection of marks requested.

The 'Graph' technology used here is described as under development, so while it is highly likely that this or a similar solution will still be available, it may evolve over time.