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
	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(360/dx)/math.log(2))
    	else
    		scala = math.min( math.floor(math.log(360/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