Modulo:Sandbox/M.casanova/DatiMappa: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
mNessun oggetto della modifica
Omega Bot (discussione | contributi)
m Bot: rimuovo no globals obsoleto
 
(23 versioni intermedie di un altro utente non mostrate)
Riga 1:
require('Module:No globalsstrict')
local getArgs = require('Module:Arguments').getArgs
 
local p = {}
local pp = {}
local ss = {}
 
local function agg(t)
-- Calcola la scala adeguata per mappa OSM
table.insert(ss,t)
-- esempio chiamata di funzione {{#invoke:Mappa OSM|scala|w|h|x1|y1|x2|y2|...}}
end
function p.scala(frame)
 
function p.mappa(frame)
local t = getArgs(frame)
 
local amn, amx, bmn, bmx = 400, -400, 400, -400
local dimxerr = tonumber(t[1]) or 1 -'-larghezza'
 
local dimy = tonumber(t[2]) or 1 --altezza
local vlrcornice
if (t['cornice']) then cornice = tonumber(t['cornice']) or 1 else cornice = 1 end
for i,v in ipairs(t) do
local allinea = t['allinea'] or 'right'
if i>2 then
local dida = t['didascalia'] or ''
vlr = tonumber(t[i])
local elenco = t['mostra elenco'] or 0
if (i % 2 == 0) then --calcolo latitudine minima e massima
local largh = t['larghezza'] or 350
if (amn > vlr) then amn = vlr end
local altezza = t['altezza'] or 300
if (amx < vlr) then amx = vlr end
local gruppo = t['gruppo'] or ''
else --calcolo longitudine minima e massima
if (bmnnot >gruppo vlr== '') then bmngruppo = vlr'-'..gruppo end
local zoom = tonumber(t['zoom']) or '-1'
if (bmx < vlr) then bmx = vlr end
local centrox = t['centro_lon'] or ''
end
local centroy = t['centro_lat'] or ''
local colore = t['colore'] or '#b80000'
 
local lat1, lat2, lon1, lon2 = 400, -400, 400, -400
 
local num = 1
while (t['nome'..num]) do
pp[num] = {
nome = t['nome'..num],
lat = tonumber(t['lat'..num]) or -400,
lon = tonumber(t['lon'..num]) or -400,
col = t['colore'..num] or colore,
num = t['numero'..num] or num
}
if (pp[num].lat > 85 or pp[num].lat<-85) then
err = string.format('latitudine non valida per il punto %d', num)
elseif (pp[num].lon > 180 or pp[num].lon<-180) then
err = string.format('longitudine non valida per il punto %d', num)
else
lat1 = math.min(lat1, pp[num].lat)
lat2 = math.max(lat2, pp[num].lat)
lon1 = math.min(lon1, pp[num].lon)
lon2 = math.max(lon2, pp[num].lon)
end
num = num + 1
end
 
-- per evitare punti troppo vicini al margine
localif dx(err == 1.1*(bmx'-bmn') then
if (centrox == '') then centrox = (lon1+lon2)/2 end
local dy = 1.1*(amx-amn)
if (dimx>dimycentroy == '') then
local l1 = 1-math.log(math.tan( math.pi*(1 + lat1/90)/4))/math.pi
if (dx<180) then dx = dx*dimy/dimx end
local l2 = 1-math.log(math.tan( math.pi*(1 + lat2/90)/4))/math.pi
centroy = (l1+l2)/2
centroy = (math.atan(math.exp(math.pi*(1-centroy)))-math.pi/4)*360/math.pi
end
if (zoom == '-1') then
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)
 
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
if ((dx == 0) and (dy == 0)) then
zoom = 10 --valore default per singolo punto
else
zoom = math.max(0,math.min(18,scalax, scalay))
end
end
if (zoom < 0) then zoom = 0 elseif (zoom>18) then zoom = 18 end
if (cornice == 1) then
agg('\n{| class="wikitable')
if (allinea == 'right') then agg(' floatright') elseif (allinea == 'left') then agg(' foatleft') end
agg('" style="border: 1px solid darkgray;')
if (allinea == 'center') then agg('margin-left: auto; margin-right: auto') end
agg('"\n|-\n|style="width: '..largh..'px;"|')
end
agg('{{Graph:Street map with marks|lat='..centroy..'|lon='..centrox..'|zoom='..zoom..'|width='..largh..'|height='..altezza..'| minimap=0')
agg('|{"lat":'..centroy..',"lon":'..centrox..',"img":"wikirawupload:{{filepath:Mapscaleline.svg|120}}","width":50,"height":8,"offsetX":'..(math.floor(largh/2)-37))
agg(',"offsetY": '..(math.floor(altezza/2)-10)..',"textAlign":"right","textDx":22,"textDy":-2,"textColor": "grey","textFont":"Tahoma","textFontSize":9,"text": "')
local zz = {}
if (math.abs(centroy)<20) then
zz = {'10 000km','5000km','3000km','1500km','1000km','400km','200km','100km','60km','20km','10km','6km','4km','2km','1km','400m','200m','100m','60m' }
elseif (math.abs(centroy)<40) then
zz = {'10 000km','5000km','3000km','1200km','800km','300km','150km','75km','45km','15km','8km','5km','3km','1.5km','750m','300m','150m','75m','45m' }
elseif (math.abs(centroy)<40) then
zz = {'10 000km','5000km','3000km','1000km','500km','200km','100km','50km','30km','10km','5km','3km','2km','1km','500m','200m','100m','50m','30m' }
else
zz = {'10 000km','5000km','3000km','900km','400km','160km','80km','40km','20km','7km','4km','2km','1km','600m','350m','160m','80m','40m','20m' }
end
agg(zz[zoom+1]..'" }')
for i=1,#pp do
agg(',{"lat":'..pp[i].lat..',"lon":'..pp[i].lon..',"size":"200","color":"'..pp[i].col..'","strokeColor":"","shape":"circle","text":"","textAlign":"left","textBaseline":"middle","textDx":0,"textDy":1,"textFontSize":10}')
agg(',{"lat":'..pp[i].lat..',"lon":'..pp[i].lon..',"shape":"square","size": "0","text":"'..pp[i].num..'","textAlign":"center","textBaseline":"bottom","textDx":0,"textDy":5.5,"textFont":"Arial","textFontSize": 11,"textFontWeight":"bold","textColor":"white"}')
end
agg(' }}\n<div style="text-align:left;font-size:70%;color:grey"><span style="font-size:125%">{{#tag:maplink|\n[ {"type": "FeatureCollection", "features": [')
for i=1,#pp do
if (i>1) then agg(',') end
agg('{"type":"Feature","geometry":{"type":"Point","coordinates":['..pp[i].lon..','..pp[i].lat..'] }')
agg(',"properties":{"title": "'..pp[i].nome..'","description":"","marker-symbol": "-number'..gruppo..'","marker-size":"medium","marker-color":"'..pp[i].col..'" } }')
end
agg('] } ]|zoom='..zoom..'|latitude='..centroy..'|longitude='..centrox..'|text="[Schermo intero]"}}</span>')
agg('<div style="float:right" class="plainlinks nourlexpansion">[https://wikimediafoundation.org/wiki/Maps_Terms_of_Use Wikimedia] | © [https://www.openstreetmap.org/copyright OSM]</div></div>')
 
if (cornice == 1) then
agg('\n|-')
if (not dida == '') then agg('\n|style="font-size:90%"|'..dida) end
if (elenco == '2') then
agg('\n|\n{| width="100%"\n|-\n|width=50% valign=top|<small>')
for i=1,#pp do
agg('{{NumLegenda|'..pp[i].num..'|'..pp[i].col..'|'..pp[i].nome..'}}<br/>')
if (i == math.floor(#pp/2 +0.5)) then agg('</small>\n|width=50% valign=top|<small>') end
end
agg('</small>\n|}')
elseif (elenco == '1') then
if (dida == '') then agg('\n|style="font-size:90%"|') else agg('<br/>') end
agg('<small>')
for i=1,#pp do
agg('{{NumLegenda|'..pp[i].num..'|'..pp[i].col..'|'..pp[i].nome..'}}<br/>')
end
end
agg('</small>\n|}')
end
return frame:preprocess(table.concat(ss))
else
return err
if (dy<90) then dy = dy*dimx/dimy end
end
end
-- 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
-- Calcola centro per longitudine
if (dy == 0) then scalay = 18 else scalay = math.floor(math.log(180/dy)/math.log(2)) end
-- esempio chiamata di funzione {{#invoke:Mappa OSM|centro_lon|x1,x2,...}}
local scala
function p.centro_lon(frame)
if ((dx == 0) and (dy == 0)) then
local t = getArgs(frame)
scala = 10 --valore default per singolo punto
local mn, mx = 400, -400
else
local xval
scala = math.max(0,math.min(18,scalax, scalay)) --calcolo scala minima compresa tra 0 e 18
for x in string.gmatch(t[1],'([^,]+)') do
end
xval = tonumber(x)
return scala
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:Mappa OSM|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:Mappa OSM|scalazoom|w|h|x1,x2,...|y1|x2|,y2|...}}
function p.scala2zoom(frame)
local t = getArgs(frame)
local lat1, lat2, lon1, lon2 = 400, -400, 400, -400
Riga 53 ⟶ 176:
local dimy = tonumber(t[2]) or 1 --altezza
local vlr
for i,vx in ipairsstring.gmatch(t[3],'([^,]+)') do
vlr = tonumber(x)
if i>2 then
if (lon1 > vlr) then lon1 = vlr end
vlr = tonumber(t[i])
if (ilon2 %< 2 == 0vlr) then --calcololon2 latitudine minima= evlr massimaend
end
if (lat1 > vlr) then lat1 = vlr end
for x in string.gmatch(t[4],'([^,]+)') do
if (lat2 < vlr) then lat2 = vlr end
vlr = tonumber(x)
else --calcolo longitudine minima e massima
if (lon1lat1 > vlr) then lon1lat1 = vlr end
if (lon2lat2 < vlr) then lon2lat2 = vlr end
end
end
end
 
Riga 69 ⟶ 190:
if ((lat2>85) or (lat1<-85)) then return 0 end
 
-- calcola posizione rispetto a Web Mercator per griglia di lato 1
-- calcolo punti proiezione
-- con fattore 1.1 per evitare punti troppo vicini al margine
local p_lat1 = (1+lat1/180)/2
local p_lon1dx = (1-math.log1*(math.tan( math.pi/4 + math.pi*lon2-lon1)/360))/math.pi)/2
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)
local p_lat2 = (1+lat2/180)/2
local p_lon2 = (1-math.log(math.tan( math.pi/4 + math.pi*lon2/360))/math.pi)/2
 
-- per evitare punti troppo vicini al margine
local dy = 1.05*(p_lat2-p_lat1)
local dx = 1.05*(p_lon2-p_lon1)
-- 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
Riga 91 ⟶ 208:
end
 
-- Calcola centrogradi per singola coordinatadecimali
-- esempio chiamata di funzione {{#invoke:Mappa OSM|centrogradi|x1numero gradi|x2numero primi|...numero secondi|punto cardinale}}
function p.centrogradi(frame)
local t = getArgs(frame)
local mn, mxt1 = 400,tonumber(t[1]) or -4000
local xvalt2 = tonumber(t[2]) or 0
forlocal i,vt3 in= ipairstonumber(t[3]) door 0
local s = 1;
xval = tonumber(t[i])
if (mn(t[4] >== xval'S') or (t[4] == 'W')) then mns = xval-1 end
return (s*(t1+t2/60+t3/3600))
if (mx < xval) then mx = xval end
end
return (mn+mx)/2
end