Modulo:Maplink: differenze tra le versioni

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca
Contenuto cancellato Contenuto aggiunto
m aggiornati esempi
Riga 87: Riga 87:
if ((t[4] == 'S') or (t[4] == 'W')) then s = -1 end
if ((t[4] == 'S') or (t[4] == 'W')) then s = -1 end
return (s*(t1+t2/60+t3/3600))
return (s*(t1+t2/60+t3/3600))
end

-- Calcola gradi decimali
-- esempio chiamata di funzione {{#invoke:Maplink|gradi|numero gradi|numero primi|numero secondi|punto cardinale}}
function p.gradi(frame)
local t = getArgs(frame)
local t1 = tonumber(t[1]) or 0
local t2 = tonumber(t[2]) or 0
local t3 = tonumber(t[3]) or 0
local s = 1;
if ((t[4] == 'S') or (t[4] == 'W')) then s = -1 end
return (s*(t1+t2/60+t3/3600))
end

-- Genera il tag di maplink per un punto
--
-- Questo metodo è stato convertito da un template.
-- Per vedere il codice originale:
-- [[Speciale:PermaLink/88514901]]
function p.tagPunto( frame )
local args = getArgs( frame )
local lat = tonumber( args.lat )
local lon = tonumber( args.lon )
local zoomRaw = args.zoom
local zoom = zoomRaw and tonumber( zoomRaw ) or 13
local nome = args.nome or 'Posizione'
local icona = args.icona or 'circle'
local data = {
["type"] = "Feature",
["geometry"] = {
["type"] = "Point",
["coordinates"] = { lon, lat },
},
["properties"] = {
["title"] = nome,
["marker-symbol"] = icona,
["marker-color"] = "b80000",
},
}
local dataJson = mw.text.jsonEncode( data )
local tag = frame:callParserFunction{ name = '#tag:maplink', args = {
dataJson,
["zoom"] = zoom,
["latitude"] = lat,
["longitude"] = lon,
} }
return tag
end
end



Versione delle 14:38, 11 apr 2020

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 centro per longitudine
-- esempio chiamata di funzione {{#invoke:Maplink|centro_lon|x1,x2,...}}
function p.centro_lon(frame)
	local t = getArgs(frame)
	local mn, mx = 400, -400
	local xval
	for x in string.gmatch(t[1],'([^,]+)') do
		xval = tonumber(x)
		if (mn > xval) then mn = xval end
		if (mx < xval) then mx = xval end
	end
    return (mn+mx)/2
end

-- Calcola centro per latitudine
-- esempio chiamata di funzione {{#invoke:Maplink|centro_lat|x1,x2,...}}
function p.centro_lat(frame)
	local t = getArgs(frame)
	local mn, mx = 400, -400
	local xval
	for x in string.gmatch(t[1],'([^,]+)') do
		xval = tonumber(x)
		if (mn > xval) then mn = xval end
		if (mx < xval) then mx = xval end
	end
	if ((mx>85) or (mn<-85)) then return 0 end
	local lat1 = 1-math.log(math.tan( math.pi*(1 + mn/90)/4))/math.pi
	local lat2 = 1-math.log(math.tan( math.pi*(1 + mx/90)/4))/math.pi
	local latm = (lat1+lat2)/2
	local coord = (math.atan(math.exp(math.pi*(1-latm)))-math.pi/4)*360/math.pi
    return coord
end

-- Calcola la scala adeguata per mappa OSM
-- esempio chiamata di funzione {{#invoke:Maplink|zoom|w|h|x1,x2,...|y1,y2...}}
function p.zoom(frame)
	local t = getArgs(frame)
	local lat1, lat2, lon1, lon2 = 400, -400, 400, -400
	local dimx = tonumber(t[1]) or 1 --larghezza
	local dimy = tonumber(t[2]) or 1 --altezza
	local vlr
	for x in string.gmatch(t[3],'([^,]+)') do
		vlr = tonumber(x)
		if (lon1 > vlr) then lon1 = vlr end
		if (lon2 < vlr) then lon2 = vlr end
	end
	for x in string.gmatch(t[4],'([^,]+)') do
		vlr = tonumber(x)
		if (lat1 > vlr) then lat1 = vlr end
		if (lat2 < vlr) then lat2 = vlr end
	end

	-- problemi con latitudine oltre 85°
	if ((lat2>85) or (lat1<-85)) then return 0 end

	-- calcola posizione rispetto a Web Mercator per griglia di lato 1
	-- con fattore 1.1 per evitare punti troppo vicini al margine
	local dx = 1.1*(lon2-lon1)/360
	local dy = 1.1*(math.log(math.tan( math.pi*(1 + lat2/90)/4)) - math.log(math.tan( math.pi*(1 + lat1/90)/4)))/(2*math.pi)

	-- calcolo scale per coordinate
	local scalax, scalay
	if (dx == 0) then scalax = 18 else scalax = math.floor(-math.log(dx)/math.log(2)) end
	if (dy == 0) then scalay = 18 else scalay = math.floor(-math.log(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 gradi decimali
-- esempio chiamata di funzione {{#invoke:Maplink|gradi|numero gradi|numero primi|numero secondi|punto cardinale}}
function p.gradi(frame)
	local t = getArgs(frame)
	local t1 = tonumber(t[1]) or 0
	local t2 = tonumber(t[2]) or 0
	local t3 = tonumber(t[3]) or 0
	local s = 1;
	if ((t[4] == 'S') or (t[4] == 'W')) then s = -1 end
	return (s*(t1+t2/60+t3/3600))
end

-- Calcola gradi decimali
-- esempio chiamata di funzione {{#invoke:Maplink|gradi|numero gradi|numero primi|numero secondi|punto cardinale}}
function p.gradi(frame)
	local t = getArgs(frame)
	local t1 = tonumber(t[1]) or 0
	local t2 = tonumber(t[2]) or 0
	local t3 = tonumber(t[3]) or 0
	local s = 1;
	if ((t[4] == 'S') or (t[4] == 'W')) then s = -1 end
	return (s*(t1+t2/60+t3/3600))
end

-- Genera il tag di maplink per un punto
--
-- Questo metodo è stato convertito da un template.
-- Per vedere il codice originale:
--  [[Speciale:PermaLink/88514901]]
function p.tagPunto( frame )
	local args    = getArgs( frame )
	local lat     = tonumber( args.lat )
	local lon     = tonumber( args.lon )
	local zoomRaw = args.zoom
	local zoom    = zoomRaw and tonumber( zoomRaw ) or 13
	local nome    = args.nome  or 'Posizione'
	local icona   = args.icona or 'circle'
	local data = {
		["type"] = "Feature",
		["geometry"] = {
			["type"]        = "Point",
			["coordinates"] = { lon, lat },
		},
		["properties"] = {
			["title"]         = nome,
			["marker-symbol"] = icona,
			["marker-color"]  = "b80000",
		},
	}
	local dataJson = mw.text.jsonEncode( data )
	local tag = frame:callParserFunction{ name = '#tag:maplink', args = {
		dataJson,
		["zoom"]      = zoom,
		["latitude"]  = lat,
		["longitude"] = lon,
	} }
	return tag
end

return p