Template:Location map polarx
From Wikipedia, the free encyclopedia
- (Documentation transcluded from: Template:Location map polarx/doc)
Creates a location map as a composite image of an existing map in either equirectangular projection or skewed projection, with multiple markers and optional labels superimposed onto it. This template functions in the style of Template:Location_map, but can auto-skew latitudes and longitudes and allows multiple markers and labels (rather than just one marker). Note: For brevity, parameters "pos" and "bg" are aliases (for parameters "position" & "background").
The differences between mapping templates are as follows:
-
-
- Template:Location map - uses straight lines for latitude (not curved arcs);
- Template:Location map polarx - curves latitude for 4 polar markers/labels;
- Template:Location map many polarx - allows 5 markers/labels and has "many"
in the template name:{{Location map many polarx | ...}}
.
-
Also see: Template:Location_map_100x100 to overlay markers on any map/image, by
-
- using rectangular coordinates from 0-100, as a 100x100 image grid.
[edit] Usage
{{Location map polarx |locname (selected from templates named "Location_map_<locname>") |skew = number < 1.0 for narrow or > 1.0 for wider longitude (skews more towards top of map) |lat_skew = 1st marker latitude skew (defaults to map's lat_skew); use latitude skew factor < 0 to arc downward, or > 0 to arc latitudes higher toward map edges. |lon_shift= longitude shift to center over vertical longitude meridian, when not already center of image ------------------------------------------- 1st label & marker |label = 1st label text |label_size = 1st label font size, percent (such as "85") |position = pos = left or right or top or bottom – position of 1st label relative to 1st mark (default: right) |background = bg = 1st label color (defaults transparent) by name or hex: Darkorange/#77DDDD (see: Web colors). |lon_dir=W 1st longitude direction: W=west, E=east (default) |lat_dir=S 1st latitude direction: S=south, N=north (default) |lat_deg = 1st latitude degrees |lat_min = 1st latitude minutes |lat_sec = 1st latitude seconds |lon_deg = 1st longitude degrees |lon_min = 1st longitude minutes |lon_sec = 1st longitude seconds |lat = 1st latitude (as decimal; negative for south latitude) |long = 1st longitude (as decimal; negative for west longitude) |mark = 1st marker image file name, a red dot by default |marksize = 1st marker size, default=8 (pixels wide/tall) ------------------------------------------- 2nd label & marker |label2 = 2nd label text |label2_size= 2nd label font size, percent (such as "85") |position2 = pos2 = left or right or top or bottom – position of 2nd label relative to 2nd mark (default: right) |background2= bg2 = background color for 2nd label, defaults transparent |lon2_dir=W 2nd longitude direction: W=west, E=east (default) |lat2_dir=S 2nd latitude direction: S=south, N=north (default) |lat2_deg = 2nd latitude degrees (or use combined lat2) |lat2_min = 2nd latitude minutes |lat2_sec = 2nd latitude seconds |lon2_deg = 2nd longitude degrees (or use combined long2) |lon2_min = 2nd longitude minutes |lon2_sec = 2nd longitude seconds |lat2 = 2nd latitude (as decimal; negative for south latitude) |long2 = 2nd longitude (as decimal; negative for west longitude) |mark2 = 2nd marker image file name, a red dot by default |mark2size = 2nd marker size, default=8 (pixels wide/tall) |skew2 = number < 1.0 for narrow or > 1.0 wider longitude. |lat2_skew = latitude skew < 0 to arc downward, or > 0 upward ------------------------------------------- 3rd label & marker |label3 = 3rd label text |label3_size = 3rd label font size, percent (such as "120") (... similar latitude/longitude parameters named "~3" ...) |mark3 = 3rd marker image file name, a red dot by default |mark3size = 3rd marker size, default=8 (pixels wide/tall) |pos3, bg3 = 3rd label position & background color |skew3 = number < 1.0 for narrow or > 1.0 wider longitude. |lat3_skew = 3rd latitude skew (defaults to map's lat_skew). (...repeat until label4/mark4...) ------------------------------------------- |border = border color or none |caption = map caption; for no caption enter "caption="; if omitted, then the caption will be auto-generated as: "<marker #1 label> (<location map name>)" |float = left or right or center or none for map placement |width = map width for display size (pixels, omit "px") |AlternativeMap = Alternative map image name (changes background map, border coordinates are determined based on the map name); can be any image (omit "Image:"). }}
Parameter locname refers to {Template:Location map locname} containing the image name and coordinates of a particular map.
BEWARE: Omit "px" from marksize or that marker might be placed off-center. The MediaWiki-language coding of the template cannot detect "px" inside numeric parameters.
[edit] Available maps
List of live templates named Template:Location_map_polarx_<locname> (without "Template:"):
Location map polarx | Location map polarx/doc |
Location_map_CanadaGeo
Location_map_CanadaTerrain
Location_map_SwedenCIAx
[edit] Creating new maps
- Find an appropriate map for the region, such as a polar half-circle (does not need to be mapped in equirectangular projection).
- Create a template named "Template:Location_map_locname" (copy the content of any other map template into it and enter appropriate values or examples).
- Set default parameter values (using those parameter names), such as setting "mark" with image-file name and "marksize" for pixels wide/tall, or set default label font size ("label_size = 78" percent).
- Parameter names not used by "Template:Location_map" will be ignored by it, and only used by templates which handle multiple-markers (such as defaulting "label2_size = 78" percent, or "mark2size=7" pixels).
[edit] Examples
[edit] Map with labels "Pag" and "Anytown" (degrees)
Pag (Croatia)
{{Location map polarx |Croatia |lat_skew=6.50 |label=Pag_skew | marksize=8 | markhigh=8 | mark=Green_pog.svg | pos=right | bg=yellow | lat_deg=44 | lat_min=26 | lon_deg=14 | lon_min=3 |label2=Pag | lat2_skew=0 | mark2size=8 | mark2high=8 | pos2=left | bg2=#DDDD99 | lat2_deg=44 | lat2_min=26 | lon2_deg=14 | lon2_min=3 |label3=Anytown_Anywhere | mark3size=45 | mark3high=30 | mark3= Rouge-Admin JollyRoger.svg{{!}}border | position3=top | bg3=white | lat3_deg=46 | lat3_min=30 | lon3_deg=17 | lon3_min=30 |width=260 | float=right }} |
[edit] Non-rectangular map of Sweden
Visby/Kiruna (Sweden)
{{Location map many polarx | SwedenCIAx | caption = Map many points in Sweden | label = Visby | label_size = <!-- 0-900%--> 78 | mark=Blue pog.svg | marksize=8 | lat_deg=57 | lat_min=38 | lon_deg=18 | lon_min=17 | bg = <!--blue-->#9999EE | pos=right | label2=Stockholm | mark2=Blue pog.svg | mark2size=9 | pos2=left | label2_size=77 | lat2_deg=59 | lat2_min=21 | lon2_deg=18 | lon2_min=4 | bg2=yellow | label3=Kiruna | skew3=0.67 <!--Sweden longitudes 67% squeeze--> | mark3=X_sheer_red_17.gif | mark3size=17 | mark3high=17 | pos3=left | label3_size=144 | lat3_deg=67 | lat3_min=51 | lat3_sec=17 | lon3_deg=20 | lon3_min=13 | lon3_sec=22 | lat3_skew=1.25 | bg3 = <!--gold-->#CCCC11 | label4=Luleå | skew4=0.67 | pos4=top | label4_size=90 | lat4_deg=65 | lat4_min=35 | lon4_deg=22 | lon4_min=09 | lat4_skew=1.25 | bg4=lightgreen | mark4size=17 | mark4=Circle_sheer_red_33.gif | mark4=X_sheer_red_17.gif | label5=Arctic Circle | skew5=0.67 | pos5=bottom | label5_size=80 | lat5_deg=66 | lat5_min=30 | lon5_deg=15 | lon5_min=09 | bg5=skyblue | mark5size=17 | mark5=X_sheer_black_17.gif | float = right | width = <!--show small--> 195 }} |
[edit] Arctic circle on map of Sweden
Arctic Circle locations (Sweden)
{{Location map polarx | SwedenCIAx | caption = Arctic Circle in Sweden | label = West | label_size = <!-- 0-900%--> 78 | mark=Blue pog.svg | marksize=6 | lat_deg=66 | lat_min=30 | lon_deg=12 | lon_min= -80 | bg =<!--blue-->#9999EE|pos=right | label2=Center | mark2=Blue pog.svg | mark2size=6 | pos2=bottom | label2_size=77 | lat2_deg=66 | lat2_min=30 | lon2_deg=17 | lon2_min=1 | bg2=yellow | label3=East | skew3=0.67 <!--Sweden longitudes 67% squeeze--> | mark3=Blue pog.svg | mark3size=6 | mark3high=6 | pos3=left | label3_size=70 | lat3_deg=66 | lat3_min=30 | lon3_deg=22 | lon3_min=70 | lon3_sec=10 | lat3_skew=1.25 | bg3 = <!--gold-->#CCCC11 | label4=Luleå | skew4=0.67 | pos4=bottom | label4_size=90 | lat4_deg=65 | lat4_min=35 | lon4_deg=22 | lon4_min=09 | lat4_skew=1.25 | bg4=lightgreen | mark4size=17 | mark4=Circle_sheer_red_33.gif | mark4=X_sheer_red_17.gif | float = right | width = <!--small--> 195 }} |
[edit] Map with some labels outside map
Pag (Croatia)
{{Location map polarx | Croatia | label=Pag | position=right | lat=44.44 | long=15.05 | marksize=8 | markhigh=8 | label2=Anytown | pos2=bottom | bg2=yellow | lat2=47.30 | long2=12.80 | marksize=8 | markhigh=8 | background2=yellow | label3=Anytown2 | pos3=top | bg3=lightgreen | lat3=41.98 | long3=18.43 | width=260 | float=right }} |
[edit] Unskewed Sweden: Location_map_many
Visby/Kiruna (Sweden)
{{Location map many | SwedenCIAx | label = Visby | label_size = 78 | caption = Show Visby/Kiruna Sweden | label = Visby | lat_deg=57 | lat_min=38 | lon_deg=18 | lon_min=17 | bg = #9999EE | label2=Anytown | pos2=right| label2_size=102 | lat2=59.00 | long2=17.50 | bg2=yellow | label3=Kiruna | skew3=1.16 | pos3=top | label3_size=85 | lat3_deg=67 | lat3_min=51 | lat3_sec=17 | lon3_deg=20 | lon3_min=13 | lon3_sec=22 | bg3 = <!--gold-->#CCCC11 | mark3size=6 | mark3high=7 | label4=Anytown2 | pos4=left | label4_size=90 | lat4=63.00 | long4=17.50 | bg4=lightgreen | mark4size=33 | mark4high=33 | mark4= Circle_sheer_red_33.gif | float = right | width = 195 }} |
[edit] Unskewed label for Kiruna, Sweden
Kiruna (Sweden)
{{Location map | SwedenCIAx | label_size = <!-- 0-900%--> 78 | caption = Unskewed marker at Kiruna, not using Location_map_polarx | label = Kiruna | lat_deg=67 | lat_min=51 | lat_sec=17 | lon_deg=20 | lon_min=13 | lon_sec=22 | background = <!--blue-->#99BBEE | float = right | width = <!--show small--> 195 }} |
[edit] Map with 9 markers (decimal)
Pag (Croatia)
{{Location map polarx | Croatia | label=Pag | position=right | lat=44.44 | long=15.05 | label2=Anytown | pos2=bottom| label2_size=110 | lat2=45.86 | long2=17.50 | background2=yellow | label3=Anytown2 | pos3=top | label3_size=210 | lat3=46.23 | long3=18.43 | background3=green | mark4=Diamond_sheer_black_20.gif | mark4size=19 | mark4high=17 | label4=44.0 (latitude) | lat4=44.00 | long4=13.5 | mark5=Diamond_sheer_black_20.gif | mark5size=20 | mark5high=20 | label5=44.5 | lat5=44.50 | long5=13.5 | mark6=Diamond_sheer_black_20.gif | mark6size=20 | mark6high=20 | label6=45.0 | lat6=45.00 | long6=13.5 | mark7=Diamond_sheer_black_20.gif | mark7size=20 | mark7high=20 | label7=45.5 | lat7=45.50 | long7=13.5 | mark8=Diamond_sheer_black_20.gif | mark8size=20 | mark8high=20 | label8=46.0 | lat8=46.00 | long8=13.5 | mark9=Diamond_sheer_black_20.gif | mark9size=20 | mark9high=20 | label9=46.5 | lat9=46.50 | long9=13.5 | width=260 | float=right }} |
[edit] Map with a custom label and text background
Imotski
{{Location map polarx | Croatia |label=Imotski |lat=43.44 |long=17.21 |position=right |width=260 |float=right |background=#FFFFDD |caption=Imotski in Croatia }} |
[edit] Western Hemisphere
Lockerbie (Scotland)
{{Location map polarx |Scotland |label=Lockerbie | lat_dir=N | lat_deg=55 | lat_min=07 | lat_sec=16 | lon_deg= -3 | lon_min=-21 | lon_sec=-19 |position=right |width=180 |float=right |caption=Lockerbie in Scotland }} |
[edit] Country that crosses 180° meridian
Uelen (Russia)
{{Location map polarx |Russia |label=Uelen |lat_deg=66|lat_min=09 |lon_deg=169|lon_min=48|lon_dir=W |position=left |width=500 |float=right |background=#FFFFDD }} |
[edit] Implementation notes
The map and markers are implemented using the typical wiki parser-functions ("{{#XXX ... }}"), described at: WikiMedia Help:ParserFunctions.
[edit] Template limits increased in 2008
- Technical article: Wikipedia:Template_limits.
As of February 2008, templates are restricted mainly by the amount of output text generated, rather than by the number of if-statements or switch-options contained within a template. The output size limit is measured as the amount of HTML code generated to display a formatted Wikipedia page (limited to about 1MB of HTML). As of February 2008, the templates are processed by a MediaWiki recursive-descent parser, which bypasses the template coding based on conditional logic in the parser, and so does NOT expand templates in a "false" branch during formatting.
Prior to January 2008, the MediaWiki (version 1.6) language was still a beta-level technology, something of a toy language, limited by handling of noinclude-tags ("<noinclude>"), which filled template-processing buffers and killed template if-statements, depending on complexity of conditional expressions. The template size-limit had severely restricted coding for handling polar-skewing of map markers. Each time a template was run within an article, resources were depleted further, limiting the number of times a large template could be included within one article: the reducing of map-definition template size by moving noinclude-sections into "/doc" sub-files allowed more templates to run. Map templates (such as "Location_map_Croatia") have been reduced by moving most descriptive text & the interwiki language-links into "/doc" sub-files.
Note: Template sizes and the page-buffer size have been purposely limited to combat vandalism from users who might submit very large pages to attack wiki server performance. Although the wiki servers might be capable of more, the limits have been imposed to prevent denial-of-service caused by expanding very large article pages (typically, huge pages exceeding 1MB of formatted text).
[edit] Explanation of skewing
The skewing of map coordinates, when placing markers/labels on the map image, is performed by a linear interpolation of the longitude relative to the height of the latitude (higher latitudes skew longitude more). A skew factor < 1.0 squeezes longitudes together near the top, while a skew factor > 1.0 spreads longitudes apart near the top.
Although longitude is skewed by a linear interpolation, the latitude is skewed by a quadratic interpolation, which squares the delta difference from longitude center, to form an arc line, further scaled depending on the current latitude. Higher latitudes are scaled less, to align with shorter arcs closer to the poles.
The latitude arcs, such as the Arctic Circle, at north latitude 66.5, are approximated by quadratic interpolation, of the form: y = b.x2 + c, where x is the longitudinal distance from the center longitude. Locations with longitudes farther from the center will skew to higher positions along the arc: x depends on dividing longitude-offset by 90 degrees, to keep x between -1 to 0 to 1, but is scaled by factor b, which depends on latitude. Whereas x varies with longitude offset, b uses only the latitude, to raise the arc less for smaller arcs at higher latitudes.
The formulas are roughly:
-
- To skew by latitude ratio (skewing longitude more towards top):
- skew factor = ( (1 - skew) * lat_ratio + skew ), where:
- lat_ratio = (maxlat - latitude) / (maxlat-minlat).
- To skew by latitude ratio (skewing longitude more towards top):
-
- To skew latitude:
- latitude = lat_skew * ( (longitude - cen) / 90 )**2 * lat_scale;
-
- where, lat_scale = (90 - latitude) / 90 * 75.0, and
- where, cen = (minlon + maxlon) * 0.5 + lon_shift,
- where, lon_shift adjusts middle longitude as if map center line.
- Note: Skewed latitude depends upon both longitude & latitude.
- To skew latitude:
The longitude-skew coding in MediaWiki language is:
<!-- -------------------------- Check for skew--> #if: {{{skew|{{Location map {{{1}}}|skew}} }}} |<!--then--> {{#expr: {{#expr: ( <!-- --------- skewed Y --> {{#ifeq: {{{lon_dir|}}}|W|-1|1}} * ( {{{lon_deg|{{{long|0}}} }}} + ({{{lon_min|0}}} / 60) + ({{{lon_sec|0}}} / 3600) ) - 0.5*( <!-- -----minus mid-longitude--> {{Location map {{{1}}}|right}}+{{Location map {{{1}}}|left}}) + {{{lon_shift|0}}} <!--plus longitude-center shift--> ) <!--end skewed Y--> * ( <!--------------------- apply skewfactor by latitude --> <!--skewfactor = --> (1 - {{{skew|{{Location map {{{1}}}|skew}} }}} ) * ( {{Location map {{{1}}}|top}} - {{#expr: {{#ifeq: {{{lat_dir|}}}|S|-1|1}} * ( {{{lat_deg|{{{lat|0}}} }}} + ({{{lat_min|0}}}/60) + ({{{lat_sec|0}}} / 3600) )}} ) / ( {{Location map {{{1}}}|top}} - {{Location map {{{1}}}|bottom}} ) + {{{skew|{{Location map {{{1}}}|skew}} }}} ) <!--endapply skewfactor--> + 0.5*( <!-- --------------readd mid-longitude - lon_shift--> {{Location map {{{1}}}|right}}+{{Location map {{{1}}}|left}}) - {{{lon_shift|0}}} <!--minus longitude-center shift--> }}<!--endexpr--> }}<!--endexpr--> }}<!--endif skew-->
Although the above formulas are approximations, devised to fit the actual data, the resulting skewed longitudes and latitudes have been tested to almost exactly pinpoint locations on calibrated maps. However, for maps that are not precisely calibrated, each marker can be shifted slightly, by adjusting its particular skew factors: for example, skew3 or lat3_skew could be adjusted to overlap the mark3 image symbol over a spot which might be slightly off-center on a particular map (lower skew3 moves inward, lower lat3_skew moves downward).
[edit] Use of HTML divisions
The map with markers/labels is implemented as nested HTML divisions. The map-image is in an HTML division, containing each point as a percent-locator division containing a marker-image sub-division plus a label sub-division. Each point is calculated (for a percent-locator division) with X or Y coordinate "XX.X%" or "YY.Y%" as follows:
- The div-tag is "<div style="position: absolute; z-index: 2; top: XX.X%; left: YY.Y%; ...>"
- For placing latitude, the calculation is:
-
- XX.X% = 100 * (top - (lat_deg + latmin/60 + latsec/3600) ) / (top - bottom)
- If lat_deg is empty, the combined decimal latitude is used from "lat".
- If lat_dir is "S" (south), the latitude is multiplied by -1.
- (Note latitude YY.Y% is reversed, with larger YY.Y% at bottom.)
- For placing longitude, the calculation is:
-
- YY.Y% = 100 * ( (lon_deg + lonmin/60 + lonsec/3600) - left ) / (right - left)
- If lon_deg is empty, the combined decimal longitude is used as "long".
- If lon_dir is "W" (west), the longitude is multiplied by -1.
- The div-tag is ended as "height: 0; width: 0; margin: 0; padding: 0;">".
- Within that division the marker/label sub-divisions are coded as:
-
- <div style="position: relative text-align: center; ...">.
- For label position, the options are shifted as:
-
- when position=left, adds "left: -6.5em; text-align: right;"
- when position=right, adds "left: 0.5em; text-align: left;"
- when position=top, adds "top:-2.65em; left:-3em; text-align: center;"
- when position=bottom, adds "top:-0.15em; left: -3em; text-align: center;" to div-tag.
Accuracy of numeric calculations depends on the particular wiki server handling the webpage.
[edit] See also
- Template:Location map - placing one marker/label by latitude/longitude.
- Template:Location map many - placing multiple markers/labels by latitude/longitude.
- Template:Location map+ - placing unlimited list of markers/labels.