Module:Carte : Différence entre versions
(nettoyage, correction de problème d'ordre pour les coordonnées renvoyées au Wikitexte) |
|||
Ligne 32 : | Ligne 32 : | ||
-- 'Projection conique avec DL' | -- 'Projection conique avec DL' | ||
local function dllat(latitude, longitude, mapdata) -- conique avec DL | local function dllat(latitude, longitude, mapdata) -- conique avec DL | ||
− | local val = | + | local val = |
(mapdata.y0 + | (mapdata.y0 + | ||
( mapdata.iheight/2 - mapdata.y0 ) * | ( mapdata.iheight/2 - mapdata.y0 ) * | ||
Ligne 45 : | Ligne 45 : | ||
end | end | ||
local function dllong(latitude, longitude, mapdata) | local function dllong(latitude, longitude, mapdata) | ||
− | local val = | + | local val = |
( (mapdata.x0 or (mapdata.iwidth/2)) + | ( (mapdata.x0 or (mapdata.iwidth/2)) + | ||
( mapdata.iheight/2 - mapdata.y0 ) * | ( mapdata.iheight/2 - mapdata.y0 ) * | ||
Ligne 56 : | Ligne 56 : | ||
* mapdata.s^2 | * mapdata.s^2 | ||
) | ) | ||
− | |||
) / mapdata.iwidth | ) / mapdata.iwidth | ||
return val | return val | ||
Ligne 68 : | Ligne 67 : | ||
if longitude < 0 then longitude = (360 + longitude) end | if longitude < 0 then longitude = (360 + longitude) end | ||
end | end | ||
− | return | + | return (longitude - left) / (right - left) |
end | end | ||
+ | local function equirecLat(latitude, mapdata) | ||
+ | return (latitude - mapdata.top) / (mapdata.bottom - mapdata.top) | ||
+ | end | ||
---------------------------------- | ---------------------------------- | ||
+ | local function pointposition(latitude, longitude, mapdata) | ||
+ | local latitude = tonumber(latitude) or tonumber(coord.dms2dec({args={latitude}})) | ||
+ | local longitude = tonumber(longitude) or tonumber(coord.dms2dec({args={longitude}})) | ||
+ | |||
+ | local ypos, xpos | ||
+ | if mapdata.x and mapdata.y then -- pour les cartes complexes : calcul de la position à partir de formules en Wikicode dans les clés "x" et "y" | ||
+ | xpos = mapdata.x(latitude, longitude) / 100 | ||
+ | ypos = mapdata.y(latitude, longitude) / 100 | ||
+ | |||
+ | elseif mapdata.projection == 'Projection équirectangulaire' then | ||
+ | ypos = equirecLat(latitude, mapdata) | ||
+ | xpos = equirecLong(longitude, mapdata) | ||
+ | elseif mapdata.projection == 'Projection conique avec DL' then | ||
+ | ypos = dllat(latitude, longitude, mapdata) | ||
+ | xpos = dllong(latitude, longitude, mapdata) | ||
+ | end | ||
+ | return ypos, xpos | ||
+ | end | ||
+ | |||
local function placepoint(mapdata, point) -- fonction d'aige pour buildmap point est une table contenant latitude, longitude, type de point... | local function placepoint(mapdata, point) -- fonction d'aige pour buildmap point est une table contenant latitude, longitude, type de point... | ||
− | local | + | local ypos , xpos = pointposition(point.latitude, point.longitude, mapdata) |
− | + | ||
+ | if (not xpos) or (not ypos) then | ||
+ | return "données de géolocalisation invalides" | ||
+ | end | ||
+ | |||
+ | if (ypos > 1.1) or (xpos) > 1.1 or (ypos < -0.1) or (xpos < -0.1) then | ||
+ | return '[[Category:Article avec une géolocalisation hors-carte]]' .. 'les coordonnées indiquées sont hors de la carte de géolocalisation demandée' | ||
+ | end | ||
+ | |||
local pointsize = tostring(point.pointsize or '8') | local pointsize = tostring(point.pointsize or '8') | ||
local pointtext = point.text or '' | local pointtext = point.text or '' | ||
Ligne 83 : | Ligne 112 : | ||
addmaintenancecat('Page avec un modèle de point de carte non supporté') | addmaintenancecat('Page avec un modèle de point de carte non supporté') | ||
end | end | ||
− | |||
− | |||
− | |||
− | |||
− | + | local htmlheight = tostring(ypos * 100) .. '%' | |
− | + | local htmlwidth = tostring(xpos * 100) .. '%' | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | local htmlheight = tostring(ypos) .. '%' | ||
− | local htmlwidth = tostring(xpos) .. '%' | ||
local pointdiv = mw.html.create('div') | local pointdiv = mw.html.create('div') | ||
Ligne 112 : | Ligne 125 : | ||
:wikitext(pointtext) | :wikitext(pointtext) | ||
:done() | :done() | ||
− | : | + | :allDone() |
return pointdiv | return pointdiv | ||
Ligne 152 : | Ligne 165 : | ||
:tag('td') | :tag('td') | ||
:tag('div') | :tag('div') | ||
− | :css({position= 'relative', margin = "auto",}) | + | :css({position= 'relative', margin = "auto", width = '100%', ['text-align'] = 'right' }) |
:wikitext('[[File:' .. file .. '|frameless|' .. width .. 'px' .. '|' .. alt .. ']]' ) | :wikitext('[[File:' .. file .. '|frameless|' .. width .. 'px' .. '|' .. alt .. ']]' ) | ||
Ligne 190 : | Ligne 203 : | ||
local success, data = pcall(loaddata, j) | local success, data = pcall(loaddata, j) | ||
if not success then | if not success then | ||
− | local mapliststring = | + | local mapliststring = '' |
+ | for i, j in pairs(maplist) do | ||
+ | mapliststring = j .. '/' .. mapliststring | ||
+ | end | ||
return mw.getCurrentFrame():expandTemplate{ title = 'Infobox/Géolocalisation multiple/transition', args = {['géolocalisation'] = mapliststring, type = maptype, latitude = params.latitude, longitude = params.longitude }} | return mw.getCurrentFrame():expandTemplate{ title = 'Infobox/Géolocalisation multiple/transition', args = {['géolocalisation'] = mapliststring, type = maptype, latitude = params.latitude, longitude = params.longitude }} | ||
.. '[[Catégorie:Page avec des données de géolocalisation non supportées]]' | .. '[[Catégorie:Page avec des données de géolocalisation non supportées]]' |
Version du 21 janvier 2015 à 14:52
La documentation pour ce module peut être créée à Module:Carte/doc
local p = {} local pointmod = require('Module:Carte/Points') local linguistic = require('Module:Linguistique') local maintenance = '' local coord = require('Module:Coordinates') local function loaddata(name) return require('Module:Carte/données/' .. mw.ustring.lower(name)) end local divstyle = { ['clear'] = 'right', ['width'] ='25em', ['text-align'] = 'center', ['font-size'] = '0.9em', ['line-height'] = '1.4em', ['margin'] = '0 0 0.5em 1em', ['max-width'] = '325px', ['word-wrap'] = 'break-word', ['max-width'] = '99%', ['height'] = 'auto', ['justify-content'] = 'space-around', ['align-items'] = 'center', } local function addmaintenancecat(cat, sortkey) -- ajoute du texte à la string maintenance en cas de problème if mw.title.getCurrentTitle().namespace ~= 0 then return end maintenance = maintenance .. '[[Category:' .. cat .. ']]' end -- 'Projection conique avec DL' local function dllat(latitude, longitude, mapdata) -- conique avec DL local val = (mapdata.y0 + ( mapdata.iheight/2 - mapdata.y0 ) * (1 - mapdata.t * (latitude - mapdata.centrallat) * (0.01745329252 + 0.00000177219231 * (latitude - mapdata.centrallat) ^2) )* ( 1- 0.00015230871 * (longitude-mapdata.centrallong) ^2 * mapdata.s^2) ) / mapdata.iheight return val end local function dllong(latitude, longitude, mapdata) local val = ( (mapdata.x0 or (mapdata.iwidth/2)) + ( mapdata.iheight/2 - mapdata.y0 ) * ( 1 -mapdata.t * (latitude-mapdata.centrallat) * ( 0.01745329252 + 0.00000177219231 * (latitude-mapdata.centrallat) * (latitude-mapdata.centrallat) ) ) * (longitude-mapdata.centrallong) * mapdata.s * (0.01745329252 - 0.000000886096156 * (longitude-(mapdata.centrallong)) * (longitude-(mapdata.centrallong)) * mapdata.s^2 ) ) / mapdata.iwidth return val end --longitude équirectangulaire local function equirecLong(longitude, mapdata) local left, right = mapdata.left, mapdata.right if right < left then -- si la carte passe le méridien 180 right = 360 + right if longitude < 0 then longitude = (360 + longitude) end end return (longitude - left) / (right - left) end local function equirecLat(latitude, mapdata) return (latitude - mapdata.top) / (mapdata.bottom - mapdata.top) end ---------------------------------- local function pointposition(latitude, longitude, mapdata) local latitude = tonumber(latitude) or tonumber(coord.dms2dec({args={latitude}})) local longitude = tonumber(longitude) or tonumber(coord.dms2dec({args={longitude}})) local ypos, xpos if mapdata.x and mapdata.y then -- pour les cartes complexes : calcul de la position à partir de formules en Wikicode dans les clés "x" et "y" xpos = mapdata.x(latitude, longitude) / 100 ypos = mapdata.y(latitude, longitude) / 100 elseif mapdata.projection == 'Projection équirectangulaire' then ypos = equirecLat(latitude, mapdata) xpos = equirecLong(longitude, mapdata) elseif mapdata.projection == 'Projection conique avec DL' then ypos = dllat(latitude, longitude, mapdata) xpos = dllong(latitude, longitude, mapdata) end return ypos, xpos end local function placepoint(mapdata, point) -- fonction d'aige pour buildmap point est une table contenant latitude, longitude, type de point... local ypos , xpos = pointposition(point.latitude, point.longitude, mapdata) if (not xpos) or (not ypos) then return "données de géolocalisation invalides" end if (ypos > 1.1) or (xpos) > 1.1 or (ypos < -0.1) or (xpos < -0.1) then return '[[Category:Article avec une géolocalisation hors-carte]]' .. 'les coordonnées indiquées sont hors de la carte de géolocalisation demandée' end local pointsize = tostring(point.pointsize or '8') local pointtext = point.text or '' local pointtype = point.pointtype or 'default' local pointimage = pointmod[pointtype] if not pointimage then pointimage = pointmod[pointtype] addmaintenancecat('Page avec un modèle de point de carte non supporté') end local htmlheight = tostring(ypos * 100) .. '%' local htmlwidth = tostring(xpos * 100) .. '%' local pointdiv = mw.html.create('div') :css{position = 'absolute', border = 'none', top = htmlheight, left = htmlwidth} :tag('div') :css{position = 'absolute', top = '-4px', left = '-4px', ['line-height'] = '0', width = '8px'} :wikitext('[[Image:' .. pointimage .. '|' .. pointsize .. 'px]]') :tag('span') :css{position = 'absolute', ['text-align'] = 'left', width = '150px'} :wikitext(pointtext) :done() :allDone() return pointdiv end local function buildmap(map, maptype, width, pointtable, caption) -- fonction d'aige pour multimap if map == '-' then return end local success, mapdata = pcall(loaddata, map) if not success or not mapdata.images then addmaintenancecat('Page avec des données de géolocalisation non supportées') end local name = mapdata.name or '?' -- analyse linguistique pour le texte de la carte local datagender = mapdata.genre or '' local gender = string.sub(datagender, 1, 1) -- ms = masculin-singulier, fp = féminin pluriel etc. local number = string.sub(datagender, 2, 2) local determiner = mapdata.determiner local ofstring = linguistic.of(name, gender, number, determiner) -- restitue "de France" ou "du Japon" local mapname = mapdata.name local file = mapdata.images[maptype] or mapdata.images['default'] or mapdata.images[1] if not file then file = mapdata.images['default'] end local alt = 'voir sur la carte ' .. ofstring local map = mw.html.create('div') :css(divstyle) :addClass("geobox") :wikitext(caption or ('Localisation sur la carte ' .. ofstring)) :tag('table') :addClass('DebutCarte') :attr({border="0", cellspacing="0", cellpadding="0"}) :css({margin = '0', border = 'none', padding = '0'}) :tag('tr') :tag('td') :tag('div') :css({position= 'relative', margin = "auto", width = '100%', ['text-align'] = 'right' }) :wikitext('[[File:' .. file .. '|frameless|' .. width .. 'px' .. '|' .. alt .. ']]' ) for i, j in pairs(pointtable) do -- pour chque point à placer, do map:node(placepoint(mapdata,j)) end return map:done():done():done():done() end function p.multimap(params) local maplist = params.maplist if type(maplist) == 'string' then maplist = mw.text.split(maplist, '/', true) end local maptype = params.maptype -- à retravailler pour quand on veut la même région, mais avec plusieurs types de carte local width = params.width local pointtable = params.pointtable local caption = params.caption if not pointtable then -- pointtable est la liste des points à placer, mais lorsqu'il n'y a qu'un seul point, on peut avoir des paramètres distinctions : pointtable = {{latitude = params.latitude, longitude = params.longitude, pointtype = params.pointtype}} end -- traitement de la largeur if width and tonumber(width) then width = tonumber(width) else width = 280 end-- si pas un nombre, erreur ? local div = mw.html.create('div'):addClass('img_toogle') -- met la carte à afficher par défaut à la fin, pour qu'elle soit affichée en premier table.insert(maplist, maplist[1]) table.remove(maplist, 1) --transition: appel aux [[Modèle:Géolocalisation/]] n en l'absence de données dans le module for i, j in pairs(maplist) do if j == '' then break end local success, data = pcall(loaddata, j) if not success then local mapliststring = '' for i, j in pairs(maplist) do mapliststring = j .. '/' .. mapliststring end return mw.getCurrentFrame():expandTemplate{ title = 'Infobox/Géolocalisation multiple/transition', args = {['géolocalisation'] = mapliststring, type = maptype, latitude = params.latitude, longitude = params.longitude }} .. '[[Catégorie:Page avec des données de géolocalisation non supportées]]' end end for i, j in pairs(maplist) do if j == '' then break end local newmap = buildmap( j, maptype, width, pointtable, caption) div:node(newmap) end return div end function p.map(frame) local args = frame.args -- utilisation du franaçs args.maplist = mw.text.split( args.carte, '/', true) return p.multimap(args) end return p