Modulo:Maplink

Questo è un modulo scritto in Lua. Le istruzioni che seguono sono contenute nella sottopagina Modulo:Maplink/man (modifica · cronologia)
Sandbox: Modulo:Maplink/sandbox (modifica · cronologia) · Sottopagine: lista · Test: Modulo:Maplink/test (modifica · cronologia · Esegui)
Questo modulo è utilizzato dal template {{Maplink}} per il calcolo del centro della mappa e della scala.
È utilizzata la proiezione Web Mercator (EPSG:3857).
- zoom
- calcola l'ingrandimento adeguato sulla base delle dimensioni dell'immagine e delle coordinate inserite.
- La funzione utilizza quattro parametri obbligatori:
- larghezza in pixel della carta (al momento non utilizzata)
- altezza in pixel della carta (al momento non utilizzata)
- lista separata da virgole con la longitudine dei singoli punti (x1,x2,x3,...)
- lista separata da virgole con la latitudine dei singoli punti (y1,y2,y3,...)
- centro_lon
- calcola la longitudine del punto medio rispetto al valore minimo e a quello massimo tra quelli inseriti.
- La funzione utilizza un solo parametro:
- lista separata da virgole con la longitudine dei singoli punti (x1,x2,x3,...)
- centro_lat
- calcola la latitudine del punto medio rispetto al valore minimo e a quello massimo tra quelli inseriti (utilizza una correzione dovuta alla proiezione utilizzata da OpenStreetMap).
- La funzione utilizza un solo parametro:
- lista separata da virgole con la latitudine dei singoli punti (y1,y2,y3,...)
require('Module:No globals')
local getArgs = require('Module:Arguments').getArgs
local p = {}
-- Calcola la scala adeguata per mappa OSM
-- esempio chiamata di funzione {{#invoke:Mappa OSM|scala|w|h|x1|y1|x2|y2|...}}
function p.scala(frame)
local t = getArgs(frame)
local amn, amx, bmn, bmx = 400, -400, 400, -400
local dimx = tonumber(t[1]) or 1 --larghezza
local dimy = tonumber(t[2]) or 1 --altezza
local vlr
for i,v in ipairs(t) do
if i>2 then
vlr = tonumber(t[i])
if (i % 2 == 0) then --calcolo latitudine minima e massima
if (amn > vlr) then amn = vlr end
if (amx < vlr) then amx = vlr end
else --calcolo longitudine minima e massima
if (bmn > vlr) then bmn = vlr end
if (bmx < vlr) then bmx = vlr end
end
end
end
-- per evitare punti troppo vicini al margine
local dx = 1.05*(bmx-bmn)
local dy = 1.05*(amx-amn)
-- calcolo scale per coordinate
local scalax, scalay
if (dx == 0) then scalax = 18 else scalax = math.floor(math.log(360/dx)/math.log(2)) end
if (dy == 0) then scalay = 18 else scalay = math.floor(math.log(180/dy)/math.log(2)) end
local scala
if ((dx == 0) and (dy == 0)) then
scala = 10 --valore default per singolo punto
else
scala = math.max(0,math.min(18,scalax, scalay)) --calcolo scala minima compresa tra 0 e 18
end
return scala
end
-- Calcola centro per singola coordinata
-- esempio chiamata di funzione {{#invoke:Mappa OSM|centro|x1|x2|...}}
function p.centro(frame)
local t = getArgs(frame)
local mn, mx = 400, -400
local xval
for i,v in ipairs(t) do
xval = tonumber(t[i])
if (mn > xval) then mn = xval end
if (mx < xval) then mx = xval end
end
return (mn+mx)/2
end
return p