Module:Carte : Différence entre versions

De Lagny-sur-Marne Wiki
Aller à : navigation, rechercher
(pas "équidistant", "linéaire" en fait mais ça ne marche pas pour l'instant, remplace par l'utilisation des données "x" et "y" comme dans le module anglais)
(fusion avec Module:Données cartes, plus cohérent avec les autres langues)
Ligne 1 : Ligne 1 :
 
local p = {}
 
local p = {}
local mapdatamod = require('Module:Données cartes')
 
 
local pointmod = require('Module:Carte/Points')
 
local pointmod = require('Module:Carte/Points')
 
local linguistic = require('Module:Linguistique')
 
local linguistic = require('Module:Linguistique')
 +
 +
 +
local p = {}
 +
 +
local function loaddata(name)
 +
return require('Module:Carte/données' .. string.lower(name))
 +
end
  
 
-- 'Projection conique avec DL'   
 
-- 'Projection conique avec DL'   
Ligne 41 : Ligne 47 :
 
return
 
return
 
end
 
end
local mapdata = mapdatamod.main(map)
+
local mapdata = loaddata(map)
 
if not mapdata or not mapdata.images then
 
if not mapdata or not mapdata.images then
 
addmaintenancecat('Page avec des données de géolocalisation non supportées')
 
addmaintenancecat('Page avec des données de géolocalisation non supportées')
Ligne 151 : Ligne 157 :
 
  local mapliststring = table.concat(maplist, '/')
 
  local mapliststring = table.concat(maplist, '/')
 
for i, j in pairs(maplist) do
 
for i, j in pairs(maplist) do
if not require('Module:Données cartes').main(j) then  
+
local success = pcall(loadata, j)
return
+
if not success then
mw.getCurrentFrame():expandTemplate{ title = 'Infobox/Géolocalisation multiple/transition', args = {['géolocalisation'] = mapliststring, type = maptype, latitude = latitude, longitude = longitude }}
+
return mw.getCurrentFrame():expandTemplate{ title = 'Infobox/Géolocalisation multiple/transition', args = {['géolocalisation'] = mapliststring, type = maptype, latitude = latitude, longitude = 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]]'
 
end
 
end
Ligne 162 : Ligne 168 :
 
end
 
end
 
return div
 
return div
 +
end
 +
 +
function p.datadoc(frame) -- pour documenter les pages Carte/données/
 +
local pagename = frame:preprocess('{{PAGENAME}}')
 +
local data = require('Module:Carte/données' .. mw.text.split(pagename , '/')[2])
 +
local placename = data.name or ''
 +
-- ajouter ici un script vérifiant que toutes les champs requis sont fournis, et dans un format correct
 +
local cat = ''
 +
if not string.find(pagename, '/Documentation') then
 +
cat = '[[Catégorie:Module de paramétrage de carte (liste complète)|' .. placename .. ']]'
 +
end
 +
return "Cette page contient des données concernant les cartes de géolocalisation pour l'entité suivante : " .. placename
 +
.. '<br />Voir [[Module:Carte]] pour connaître leur usage.'
 +
.. cat
 
end
 
end
  

Version du 18 décembre 2014 à 19:49

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 p = {}

local function loaddata(name)
	return require('Module:Carte/données' .. string.lower(name))
end

-- 'Projection conique avec DL'  
local function dllat(latitude, longitude, mapdata) -- conique avec DL
	local val = 100* 
	 	(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 = 100 * (
		( (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

----------------------------------

local function buildmap(map, maptype, width, latitude, longitude, pointtype, caption) -- fonction d'aige pour buildmap
	if map == '-' then
		return
	end
	local mapdata = loaddata(map)
	if not mapdata or not mapdata.images then
		addmaintenancecat('Page avec des données de géolocalisation non supportées')
		return "carte non supportée: " .. map
	end
	local name = mapdata.name or '?'
	
	if (not pointtype) then
		pointtype = default
	end
	pointimage = pointmod[pointtype]
	if not pointimage then pointimage = pointmod.default end -- + message d'erreur ?
	
	-- 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 pointsize = tostring(8)
	local ypos, xpos
	if mapdata.x and mapdata.y then
		ypos, xpos = mapdata.y, mapdata.x
		
		ypos = string.gsub(ypos, '$1', tostring(latitude))
		ypos = string.gsub(ypos, '$2', tostring(longitude)) 
		ypos = tonumber(mw.ext.ParserFunctions.expr(ypos))
		xpos = string.gsub(xpos, '$1', tostring(latitude))
		xpos = string.gsub(xpos, '$2', tostring(longitude)) 
		xpos = tonumber(mw.ext.ParserFunctions.expr(xpos))
			
	elseif mapdata.projection ==  'Projection équirectangulaire' then
		ypos = 100 *  (latitude - mapdata.top) / (mapdata.bottom - mapdata.top) 
		xpos = 100 *  (longitude - mapdata.left) / (mapdata.right - mapdata.left) 
	elseif mapdata.projection == 'Projection conique avec DL' then
		ypos = dllat(latitude, longitude, mapdata)
		xpos = dllong(latitude, longitude, mapdata)
	else
		return "système cartographique non supporté"
	end
	if (ypos > 100) or (xpos) > 100 or (ypos < 0) or (xpos < 0) then 
		return '[[Category:Article avec une géolocalisation hors-carte]]' .. error(ypos .. '   ' .. xpos)
	end
	local htmlheight = tostring(ypos) .. '%'
	local htmlwidth = tostring(xpos) .. '%'

	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 .. ']]')
		:done()
	local mapname = mapdata.name
	local file
	if type(mapdata.images) == 'string' then
		file = mapdata.images
	else 
		file = mapdata.images[maptype] or mapdata.images[1] or mapdata.images['default']
	end
	local alt = 'voir sur la carte ' .. ofstring
	local map = mw.html.create('div')
		:css{['text-align'] = 'center'}
		:addClass("geobox")
		:wikitext('<small>Géolocalisation sur la carte ' .. ofstring .. '</small>')
		: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",})
							:wikitext('[[Fichier:' .. file .. '|' .. width .. 'px' .. '|' .. alt .. ']]' )
							:node(pointdiv)
							:done()
						:done()
					:done()
				:done()
	return map
end

function p.multimap(params)
	local maplist = params.maplist
	local width = params.width
	local latitude = params.latitude
	local longitude = params.longitude
	
	-- les cartes s'affichent en ordre inversé, remettre bien
	local newlist = {} 
	for i, j in pairs(maplist) do
		table.insert(newlist, 1, j)
	end
	maplist = newlist

	-- 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')
	
	if not pointimage then
		pointimage = 'Point carte.svg'
	end
	
	--transition: appel aux [[Modèle:Géolocalisation/]] n en l'absence de données dans le module
 	local mapliststring = table.concat(maplist, '/')
	for i, j in pairs(maplist) do
		local success = pcall(loadata, j)
		if not success then
			return mw.getCurrentFrame():expandTemplate{ title = 'Infobox/Géolocalisation multiple/transition', args = {['géolocalisation'] = mapliststring, type = maptype, latitude = latitude, longitude = longitude }}
	.. '[[Catégorie:Page avec des données de géolocalisation non supportées]]'
		end
	end
	for i, map in pairs(maplist) do 
		local newmap = buildmap( map, maptype, width, latitude, longitude, pointimage, caption)
		div:node(newmap)
	end
	return div
end

function p.datadoc(frame) -- pour documenter les pages Carte/données/
	local pagename = frame:preprocess('{{PAGENAME}}')
	local data = require('Module:Carte/données' .. mw.text.split(pagename , '/')[2])
	local placename = data.name or ''
	-- ajouter ici un script vérifiant que toutes les champs requis sont fournis, et dans un format correct
	local cat = ''
	if not string.find(pagename, '/Documentation') then
		cat = '[[Catégorie:Module de paramétrage de carte (liste complète)|' .. placename .. ']]'
	end
	return "Cette page contient des données concernant les cartes de géolocalisation pour l'entité suivante : " .. placename 
	.. '<br />Voir [[Module:Carte]] pour connaître leur usage.' 
	.. cat
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