Module:Location map
Appearance
![]() | This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing. |
![]() | This Lua module is used on 435,000+ pages. To avoid large-scale disruption and unnecessary server load, any changes to this module should first be tested in its /sandbox or /testcases subpages. The tested changes can then be added to this page in one single edit. Please consider discussing any changes on the talk page before implementing them. |
Usage
This module implements the {{Location map}} and {{Location map~}} templates. Please see the template pages for usage instructions.
Tracking/maintenance categories
- Category:Location maps with different longitude and latitude precisions
- Category:Location maps with possible errors
local p = {}
local getArgs = require('Module:Arguments').getArgs
local function round(n, digits)
local mult = math.pow(10, digits)
return math.floor(n * mult + 0.5) / mult
end
local function decdeg(degrees, minutes, seconds, hemisphere, digits, decimal)
if decimal ~= nil then
return tonumber(decimal)
end
decimal = (degrees or 0) + (minutes or 0)/60 + (seconds or 0)/3600
if hemisphere == 'W' or hemisphere == 'w' or hemisphere == 'S' or hemisphere == 's' then
decimal = -decimal
end
if digits == nil then
digits = 7
end
return round(decimal, digits)
end
function p.tilde(frame) -- {{location map~}}
local args = getArgs(frame)
local retval = '<div style="position: absolute; top: '
local map_template = 'Location map ' .. args[1]
local map_y = frame:expandTemplate{title = map_template, args = { 'y' }}
if map_y and map_y ~= '' then
retval = retval .. frame:callParserFunction('#expr', frame:expandTemplate{title = map_template, args = { 'y', decdeg(args.lat_deg, args.lat_min, args.lat_sec, args.lat_dir, nil, args.lat), decdeg(args.lon_deg, args.lon_min, args.lon_sec, args.lon_dir, nil, args.long) }})
else
local map_top = frame:expandTemplate{title = map_template, args = { 'top' }}
local map_bottom = frame:expandTemplate{title = map_template, args = { 'bottom' }}
retval = retval .. round(100 * (map_top - decdeg(args.lat_deg, args.lat_min, args.lat_sec, args.lat_dir, nil, args.lat) ) / (map_top - map_bottom), 1)
end
retval = retval .. '%; left: '
local map_x = frame:expandTemplate{title = map_template, args = { 'x' }}
local x
if map_x and map_x ~= '' then
x = frame:callParserFunction('#expr', frame:expandTemplate{title = map_template, args = { 'x', decdeg(args.lat_deg, args.lat_min, args.lat_sec, args.lat_dir, nil, args.lat), decdeg(args.lon_deg, args.lon_min, args.lon_sec, args.lon_dir, nil, args.long) }})
else
local map_crosses180 = frame:expandTemplate{title = map_template, args = { 'crosses180' }}
local map_left = frame:expandTemplate{title = map_template, args = { 'left' }}
local map_right = frame:expandTemplate{title = map_template, args = { 'right' }}
local crosses180_correction = map_crosses180 and map_crosses180 ~= '' and args.lon_dir == 'W' and (-36000/(map_left - map_right)) or 0
x = round(crosses180_correction + 100 * (decdeg(args.lon_deg, args.lon_min, args.lon_sec, args.lon_dir, nil, args.long) - map_left) / (map_right - map_left), 1)
end
retval = retval .. x .. '%; height: 0; width: 0; margin: 0; padding: 0;"><div style="position: relative; text-align: center; '
local marksize = tonumber(args.marksize) or tonumber(frame:expandTemplate{title = map_template, args = { 'marksize' }}) or 8
retval = retval .. 'left: -' .. round(marksize / 2, 0) .. 'px; top: -' .. round(marksize / 2, 0) .. 'px; width: ' .. marksize .. 'px; font-size: ' .. marksize .. 'px; line-height:0;'
retval = retval .. '" title="' .. (args[2] or '') .. '">'
local mark = args.mark or frame:expandTemplate{title = map_template, args = { 'mark' }}
if mark == '' then mark = 'Red pog.svg' end
retval = retval .. '[[File:' .. mark .. '|' .. marksize .. 'x' .. marksize .. 'px|' .. (args.label or mw.title.getCurrentTitle().text) .. '|link=' .. (args.link or '') .. '|alt=' .. (args.alt or '') .. ']]'
retval = retval .. '</div>'
if args.position ~= 'none' then
retval = retval .. '<div style="font-size: ' .. (args.label_size or 90) .. '%; line-height: 110%; position: relative; top: -1.5em; width: ' .. (args.label_width or 6) .. 'em; '
if args.position == 'left' then
retval = retval .. 'left: -6.5em; text-align: right;'
elseif args.position == 'right' then
retval = retval .. 'left: 0.5em; text-align: left;'
elseif args.position == 'top' then
retval = retval .. 'top:-2.65em; left:-3em; text-align: center;'
elseif args.position == 'bottom' then
retval = retval .. 'top:-0.15em; left: -3em; text-align: center;'
elseif tonumber(x) > 70 then
retval = retval .. 'left: -6.5em; text-align: right;'
else
retval = retval .. 'left: 0.5em; text-align: left;'
end
retval = retval .. '"><span style="padding: 1px; '
if args.background then
retval = retval .. 'background-color: ' .. args.background .. ';'
end
retval = retval .. '">' .. (args.label or '') .. '</span></div>'
end
retval = retval .. '</div>'
return retval
end
return p