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
local dimy = tonumber(t[2]) or 1
local vlr
for i,v in ipairs(t) do
if i>2 then
vlr = tonumber(t[i])
if (i % 2 == 0) then
if (amn > vlr) then amn = vlr end
if (amx < vlr) then amx = vlr end
else
if (bmn > vlr) then bmn = vlr end
if (bmx < vlr) then bmx = vlr end
end
end
end
local dx = (bmx - bmn)
local dy = (amx - amn)
-- if (dimx>dimy) then dx = dx*dimy/dimx else dy = dy*dimx/dimy end
local scala = 10
if (dx == 0) then
if (dy == 0) then
-- default
else
scala = math.floor(math.log(180/dy)/math.log(2))
end
else
if (dy == 0) then
scala = math.floor(math.log(180/dx)/math.log(2))
else
scala = math.min( math.floor(math.log(180/dx)/math.log(2)), math.floor(math.log(180/dy)/math.log(2)) )
end
end
if (scala < 0) then scala = 0 end
if (scala > 17) then scala = 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