Jump to content

User:Yurik/mapsnapshot

From Wikipedia, the free encyclopedia


Markup Result
Simple map with a single marker

{{ :User:Yurik/mapsnapshot | lat=37.8 | lon=-122.4 | zoom=5 |
{"lat":37.8, "lon":-122.4}
}}

Two markers with labels - one as diamond shape, one uses an image from Commons
Text label can be customized with all of Vega text mark parameters by prepending "text" to their name

{{ :User:Yurik/mapsnapshot | lat=37.8 | lon=-122.4 | zoom=9 |
{"lat":37.8, "lon":-122.4, "img":"wikirawupload:{{filepath:Volcano red 32x32.svg|32}}", "width":25, "height": 25, "offsetY":-10, "text": "Volcano", "textFontWeight": "bold", "textFontSize": 20, "textColor": "#00f"}

}}

{{ :User:Yurik/mapsnapshot | lat=-33.8688 | lon=151.2093 | zoom=10 |
{"lat":-33.8688, "lon":151.2093, "img":"wikirawupload:{{filepath:Opera_House_and_ferry._Sydney.jpg|48}}", "width":48, "height": 36, "text": "Sydney", "textFontWeight": "bold", "textFontSize": 20, "textColor": "#00f", "textAlign": "right", "textDx": -30},
}}

Shows an image of a map, and draws user-specified images/icons on top of it using latitude/longitude coordinates.

Template parameters

ParameterDescriptionTypeStatus
data1

Comma separated list of JSON objects that describing what data to draw on the map

Stringsuggested
backgroundbackground

Background map image filename

Fileoptional
widthwidth

Total width of the graph

Numberoptional
heightheight

Total height of the graph (Mercator projection is 2:1)

Default
Half of the width
Numberoptional
paddingpadding

no description

Numberoptional
projectionprojection

Name of the D3 geo projection to use

Stringoptional


<graph>
{
  //
  // ATTENTION: This code is maintained at https://www.mediawiki.org/wiki/Template:Graph: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:Map_with_marks
  //
  "version": 2, "width":400, "height": 300, "padding": 0,
  "signals":[
    // These signals allow us to quickly move the map within the image, e.g. to leave space for the legend
    {"name":"imgXC", "init": {"expr": "width/2"} },
    {"name":"imgYC", "init": {"expr": "height/2"} },
    {"name":"imgWidth", "init": {"expr": "width"} },
    {"name":"imgHeight", "init": {"expr": "height"} },
    {"name":"imgTileSize", "init": {"expr": "256"} },
    {"name":"imgLat", "init": {"expr": "37.774"} },
    {"name":"imgLon", "init": {"expr": "-122.45"} },
    {"name":"imgZoom", "init": {"expr": "15"} },
    {"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)"} },
  ],
  "data": [
    {
      "name": "data",
      "values": [ 
        {"lat":65.6, "lon":-168.1, "color":"#f00", "size": 10},
        {"lat":90, "lon":-180, "shape":"cross", "color":"#f00", "size": 500},
        {"lat":-90, "lon":180, "shape":"cross", "color":"#f00", "size": 500},
        {"lat":0, "lon":-180, "shape":"cross", "color":"#f00", "size": 500},
        {"lat":0, "lon":180, "shape":"cross", "color":"#f00", "size": 500},
        {"lat":20, "lon":-120, "color":"#0f0"},
        {"lat":40, "lon":-120, "shape":"diamond", "color":"#0f0", "size": 80, "text": "Some cool text", "textColor": "#0ff", "textFontSize": 20, "textBaseline": "middle"},
        // BUG!  raw SVG image will NOT render properly on the server. Make sure to specify image pixel size, e.g. "|32"
        {"lat":-10, "lon":20, "img":"wikirawupload://upload.wikimedia.org/wikipedia/commons/thumb/b/b3/Volcano_red_32x32.svg/32px-Volcano_red_32x32.svg.png", "offsetY":-10},
        {"lat":0, "lon":0, "img":"wikirawupload://upload.wikimedia.org/wikipedia/commons/thumb/b/b3/Volcano_red_32x32.svg/32px-Volcano_red_32x32.svg.png", "width":25, "height": 25, "offsetY":-10, "text": "Big volcano", "textFontWeight": "bold", "textFontSize": 20, "textColor": "#fff"},
        {"lat":37.774755, "lon":-122.454688, "color":"#f00", "size": 10},
        
      ],
      "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 || '#ff0000'" },
        { "type": "formula", "field":"textColor", "expr": "datum.textColor || datum.color" }
      ]
    },
    {
      "name": "dummyData",
      "values": [{}]
    }
  ],
  "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" }
      ]},
      "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"},
          "fill": {"field": "color"},
          "size": {"field": "size"},
          "shape": {"field": "shape"}
        }
      }
    },
    {
      // 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": "imgZoom>5 && imgWidth>200 && imgHeight>110" }
        ]
      },
      "properties": {
        "enter": {
          "xc": {"signal": "picXC"}, "yc": {"signal": "picYC"},
          "width": {"signal": "picWidth", "offset":2}, "height": {"signal": "picHeight"},
          "stroke": {"value":"#fff"},"strokeWidth": {"value":4},
        }
      }
    },
    {
      // Draw a low-zoom locator map by using a premade world map image
      "type": "image",
      "from": {
        "data": "dummyData",
        "transform": [
          { "type": "filter", "test": "imgZoom>5 && imgWidth>200 && imgHeight>110" },
          { "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": "imgZoom>5 && imgWidth>200 && imgHeight>110" },
          { "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": "#ff0000"},
          "size": {"value": 40}
        }
      }
    }
  ]
}
</graph>